'use client'; import { useMemo, useState } from 'react'; import { createPortal } from 'react-dom'; import Image from 'next/image'; import Link from 'next/link'; import { BuildPcCategory, BuildPcCategoryResponse, BuildPcProduct } from '@/lib/buildpc/source'; import { formatCurrency } from '@/lib/formatPrice'; interface ProductPickerModalProps { activeCategory: BuildPcCategory | null; currentRequestUrl: string | null; error: string; isLoading: boolean; listing: BuildPcCategoryResponse | null; onClose: () => void; onLoadListing: (params: { categoryId?: number; q?: string; sourceUrl?: string }) => Promise; onSelectProduct: (product: BuildPcProduct) => void; } const ProductPickerModal = ({ activeCategory, currentRequestUrl, error, isLoading, listing, onClose, onLoadListing, onSelectProduct, }: ProductPickerModalProps) => { const [searchQuery, setSearchQuery] = useState(''); const totalProducts = useMemo(() => listing?.product_list.length ?? 0, [listing]); const portalTarget = typeof document === 'undefined' ? null : document.body; if (!activeCategory || !portalTarget) { return null; } const handleSearch = () => { void onLoadListing({ categoryId: activeCategory.id, q: searchQuery.trim() || undefined, sourceUrl: currentRequestUrl ?? undefined, }); }; const renderFilterButton = ( key: string, label: string, count: number, isSelected: boolean | number, url: string, ) => ( ); return createPortal(

Danh sách linh kiện

Chọn {activeCategory.name}

Hiển thị {totalProducts} sản phẩm trong kết quả hiện tại.

setSearchQuery(event.target.value)} onKeyDown={(event) => { if (event.key === 'Enter') { event.preventDefault(); handleSearch(); } }} placeholder={`Tìm trong ${activeCategory.name.toLowerCase()}`} className="h-12 min-w-0 flex-1 rounded-xl border border-transparent bg-white px-4 text-sm text-slate-900 outline-none transition focus:border-red-300" />

Kết quả

{totalProducts}

Bộ lọc

{(listing?.brand_filter_list?.length ?? 0) + (listing?.price_filter_list?.length ?? 0) + (listing?.attribute_filter_list?.length ?? 0)}

Sắp xếp

{(listing?.sort_by_collection ?? []).map((item, index) => ( ))}

Chọn sản phẩm để thay trực tiếp vào cấu hình hiện tại.

{isLoading ? (
{Array.from({ length: 6 }).map((_, index) => (
))}
) : null} {!isLoading && error ? (
{error}
) : null} {!isLoading && !error && listing?.product_list?.length ? (
{listing.product_list.map((product) => (
{product.productName}
{product.productName}

SKU: {product.productSKU}

Bảo hành: {product.warranty || 'Liên hệ'}

{product.quantity > 0 ? `Còn hàng: ${product.quantity}` : 'Tạm hết hàng'}

{product.marketPrice > product.price ? (

{formatCurrency(product.marketPrice)}đ

) : null}

{formatCurrency(product.price)}đ

))}
) : null} {!isLoading && !error && !listing?.product_list?.length ? (

Chưa có sản phẩm phù hợp

Thử đổi bộ lọc hoặc tìm bằng từ khóa khác.

) : null}
{!isLoading && listing?.paging_collection?.length ? (
{listing.paging_collection.map((item, index) => ( ))}
) : null}
, portalTarget, ); }; export default ProductPickerModal;