summaryrefslogtreecommitdiff
path: root/src-migrate/modules
diff options
context:
space:
mode:
authorFIN-IT_AndriFP <andrifebriyadiputra@gmail.com>2026-01-27 11:47:24 +0700
committerFIN-IT_AndriFP <andrifebriyadiputra@gmail.com>2026-01-27 11:47:24 +0700
commit8ea5e52346fff91462e63e3e881f65a47ffd1354 (patch)
tree1eedc43cab967d26c613dcd4f5e4f87e6fd20070 /src-migrate/modules
parent294667fde6feeba207f00cd1d7c6d2f0ead20ffa (diff)
(andri) fix search non grouping compare
Diffstat (limited to 'src-migrate/modules')
-rw-r--r--src-migrate/modules/product-detail/components/ProductComparisonModal.tsx42
1 files changed, 37 insertions, 5 deletions
diff --git a/src-migrate/modules/product-detail/components/ProductComparisonModal.tsx b/src-migrate/modules/product-detail/components/ProductComparisonModal.tsx
index ee5b01d9..d9b0a436 100644
--- a/src-migrate/modules/product-detail/components/ProductComparisonModal.tsx
+++ b/src-migrate/modules/product-detail/components/ProductComparisonModal.tsx
@@ -223,6 +223,7 @@ const ProductComparisonModal = ({ isOpen, onClose, mainProduct, selectedVariant
// ===========================================================================
useEffect(() => {
const delayDebounceFn = setTimeout(async () => {
+ // Validasi panjang karakter (biarkan tetap minimal 3 agar tidak berat)
if (searchQuery.length > 0 && searchQuery.length < 3) {
setSearchResults([]);
return;
@@ -240,17 +241,29 @@ const ProductComparisonModal = ({ isOpen, onClose, mainProduct, selectedVariant
setIsSearching(true);
try {
- const queryParam = searchQuery === '' ? '*' : searchQuery;
+ // [FIX 1] Gunakan 'let' agar tidak error saat diubah nilainya
+ let queryParam = '*';
+
+ if (searchQuery !== '') {
+ // [FITUR] Wildcard Search: Ubah "7 inc" menjadi "*7* *inc*"
+ // Ini membantu pencarian parsial (typo tolerance sederhana)
+ const words = searchQuery.trim().split(/\s+/);
+ queryParam = words.map(w => `*${w}*`).join(' ');
+ }
+
const params = new URLSearchParams({
source: 'compare',
- q: queryParam,
+ q: queryParam,
limit: '20',
- fq: `attribute_set_id_i:${attrSetId}`
+ fq: `attribute_set_id_i:${attrSetId}`,
+ // [FIX 2] Matikan Grouping agar varian muncul terpisah
+ group: 'false'
});
const res = await fetch(`/api/shop/search?${params.toString()}`);
if (res.ok) {
const data = await res.json();
+ // Ambil produk dari response
setSearchResults(data.response?.products || []);
} else {
setSearchResults([]);
@@ -290,7 +303,25 @@ const ProductComparisonModal = ({ isOpen, onClose, mainProduct, selectedVariant
});
if (selectedVar) {
- setDisableVariantFilter(true);
+ const isDuplicate = products.some((p, idx) =>
+ idx !== slotIndex &&
+ p !== null &&
+ String(p.id) === String(selectedVar.id)
+ );
+
+ if (isDuplicate) {
+ toast({
+ title: "Varian sudah ada",
+ description: "Varian produk ini sudah ada di slot perbandingan lain.",
+ status: "warning",
+ position: "top",
+ duration: 3000
+ });
+ return;
+ }
+
+ setDisableVariantFilter(true);
+
const newProducts = [...products];
newProducts[slotIndex] = {
...currentProduct,
@@ -307,10 +338,11 @@ const ProductComparisonModal = ({ isOpen, onClose, mainProduct, selectedVariant
};
const handleAddProduct = async (searchItem: any, slotIndex: number) => {
- if (products.find(p => p && String(p.id) === String(searchItem.id))) {
+ if (products.some(p => p !== null && String(p.id) === String(searchItem.id))) {
toast({ title: "Produk sudah ada", status: "warning", position: "top" });
return;
}
+ setDisableVariantFilter(true);
const idToAdd = searchItem.id;
const codeToAdd = searchItem.defaultCode || searchItem.default_code || searchItem.code;