diff options
Diffstat (limited to 'src-migrate/modules/product-detail/components/ProductComparisonModal.tsx')
| -rw-r--r-- | src-migrate/modules/product-detail/components/ProductComparisonModal.tsx | 42 |
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; |
