From cb447f728d30e31f0cc4f4cb9f7363274925ceef Mon Sep 17 00:00:00 2001 From: FIN-IT_AndriFP Date: Fri, 19 Dec 2025 16:48:11 +0700 Subject: (andri) show product ketika cari product masi kosong --- .../components/ProductComparisonModal.tsx | 38 ++++++++++++++-------- 1 file changed, 25 insertions(+), 13 deletions(-) (limited to 'src-migrate') diff --git a/src-migrate/modules/product-detail/components/ProductComparisonModal.tsx b/src-migrate/modules/product-detail/components/ProductComparisonModal.tsx index e0685d35..43f43ac4 100644 --- a/src-migrate/modules/product-detail/components/ProductComparisonModal.tsx +++ b/src-migrate/modules/product-detail/components/ProductComparisonModal.tsx @@ -156,30 +156,38 @@ const ProductComparisonModal = ({ isOpen, onClose, mainProduct, selectedVariant // 3. SEARCH LOGIC (MATCHED WITH API JSON) // =========================================================================== useEffect(() => { + // Gunakan timeout untuk debounce (menunggu user selesai ketik) const delayDebounceFn = setTimeout(async () => { - if (searchQuery.length < 3) { + + // LOGIKA BARU: + // Jika ada text tapi kurang dari 3 huruf -> Jangan search (hemat API) + // Jika text KOSONG (0) -> Lanjut search (ini untuk fitur 'klik muncul barang') + if (searchQuery.length > 0 && searchQuery.length < 3) { setSearchResults([]); return; } + // Jangan trigger search kalau slot belum dipilih (mencegah fetch saat modal baru buka) + if (activeSearchSlot === null) return; + setIsSearching(true); try { const attrSetId = selectedVariant?.attribute_set_id || mainProduct?.attribute_set_id; + // Tentukan Query: Kalau kosong pakai bintang (*), kalau ada isi pakai isinya + const queryParam = searchQuery === '' ? '*' : searchQuery; + const params = new URLSearchParams({ source: 'compare', - q: searchQuery, - limit: '5', - // Filter kategori aktif agar Apple-to-Apple + q: queryParam, // <-- Pakai logika wildcard + limit: '20', // <-- Ubah limit jadi 20 fq: attrSetId ? `attribute_set_id_i:${attrSetId}` : '' }); - // Gunakan endpoint yang benar: /api/shop/search const res = await fetch(`/api/shop/search?${params.toString()}`); if (res.ok) { const data = await res.json(); - // Data sudah CamelCase dari Backend setSearchResults(data.response?.products || []); } else { setSearchResults([]); @@ -192,7 +200,7 @@ const ProductComparisonModal = ({ isOpen, onClose, mainProduct, selectedVariant }, 500); return () => clearTimeout(delayDebounceFn); - }, [searchQuery, mainProduct, selectedVariant]); + }, [searchQuery, mainProduct, selectedVariant, activeSearchSlot]); // =========================================================================== // 4. HANDLERS @@ -297,7 +305,7 @@ const ProductComparisonModal = ({ isOpen, onClose, mainProduct, selectedVariant )} {product.name} { (e.target as HTMLImageElement).src = '/images/no-image-compare.svg'; }} /> @@ -342,8 +350,10 @@ const ProductComparisonModal = ({ isOpen, onClose, mainProduct, selectedVariant {/* --- HASIL SEARCH (MAPPING FIX) --- */} - {activeSearchSlot === index && searchQuery.length > 0 && ( + {activeSearchSlot === index && ( + + {/* Tampilkan Loading jika sedang searching */} {isSearching ? ( ) : searchResults.length > 0 ? ( @@ -356,11 +366,9 @@ const ProductComparisonModal = ({ isOpen, onClose, mainProduct, selectedVariant onClick={() => handleAddProduct(res, index)} > - { (e.target as HTMLImageElement).src = '/images/noimage.jpeg'; }} /> + { (e.target as HTMLImageElement).src = '/images/no-image-compare.svg'; }} /> - {/* [FIX] Gunakan displayName atau name */} {res.displayName || res.name} - {/* [FIX] Gunakan lowestPrice.price */} {formatPrice(res.lowestPrice?.price || 0)} @@ -370,7 +378,11 @@ const ProductComparisonModal = ({ isOpen, onClose, mainProduct, selectedVariant ))} ) : ( - Tidak ditemukan. + // Logic tambahan: Jika input kosong tapi hasil 0 (biasanya belum kelar loading awal), jangan tampilkan "Tidak Ditemukan" + // Tapi kalau sudah ngetik dan hasil 0, baru tampilkan "Tidak Ditemukan" + + {searchQuery === '' ? 'Menampilkan rekomendasi...' : 'Tidak ditemukan.'} + )} )} -- cgit v1.2.3