import { plans_api } from "@/features/plans/lib/api"; import type { Product } from "@/features/plans/lib/data"; import { API_URLS } from "@/shared/config/api/URLs"; import { Button } from "@/shared/ui/button"; import { Checkbox } from "@/shared/ui/checkbox"; import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue, } from "@/shared/ui/select"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/shared/ui/table"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { Eye, Loader2, Trash2 } from "lucide-react"; import type { Dispatch, SetStateAction } from "react"; import { toast } from "sonner"; interface Props { products: Product[] | []; isLoading: boolean; isFetching: boolean; setIsAllPagesSelected: Dispatch>; isError: boolean; setEditingProduct: Dispatch>; setDetailOpen: Dispatch>; handleDelete: (product: Product) => void; selectedProducts: number[]; setSelectedProducts: Dispatch>; handleBulkDelete: () => void; totalCount: number; count: number; handleSelectAllPages: () => void; isAllPagesSelected: boolean; } const ProductTable = ({ products, isLoading, isFetching, isError, setEditingProduct, setIsAllPagesSelected, setDetailOpen, selectedProducts, setSelectedProducts, handleBulkDelete, totalCount, handleSelectAllPages, isAllPagesSelected, }: Props) => { const queryClient = useQueryClient(); const { mutate, isPending } = useMutation({ mutationFn: ({ id, body, }: { id: number; body: { payment_type: "cash" | "card" }; }) => plans_api.update_payment_type({ id, body }), onSuccess: () => { queryClient.refetchQueries({ queryKey: ["product_list"] }); toast.success("To‘lov turi yangilandi", { richColors: true, position: "top-center", }); }, onError: () => { toast.error("Xatolik yuz berdi", { richColors: true, position: "top-center", }); }, }); if (isLoading || isFetching) { return (
); } if (isError) { return (
Maʼlumotlarni yuklashda xatolik yuz berdi
); } const currentPageIds = products.map((p) => p.id); const isAllSelected = isAllPagesSelected || (products.length > 0 && currentPageIds.every((id) => selectedProducts.includes(id))); const isSomeSelected = currentPageIds.some((id) => selectedProducts.includes(id)) && !currentPageIds.every((id) => selectedProducts.includes(id)); const handleSelectAll = (checked: boolean) => { if (checked) { setSelectedProducts( Array.from(new Set([...selectedProducts, ...currentPageIds])), ); } else { setSelectedProducts( selectedProducts.filter((id) => !currentPageIds.includes(id)), ); if (isAllPagesSelected) setIsAllPagesSelected(false); } }; const handleSelectProduct = (productId: number, checked: boolean) => { if (checked) setSelectedProducts([...selectedProducts, productId]); else setSelectedProducts(selectedProducts.filter((id) => id !== productId)); }; return (
{selectedProducts.length > 0 && (
{`${selectedProducts.length} ta mahsulot tanlandi`}
{!isAllPagesSelected && totalCount > products.length && ( )}
)} ID Rasmi Nomi Tavsif Narx turi Harakatlar {products.map((product, index) => { const isSelected = selectedProducts.includes(product.id); return ( handleSelectProduct(product.id, checked as boolean) } aria-label={`${product.name} tanlash`} /> {index + 1} 0 ? API_URLS.BASE_URL + product.images[0].image : "/logo.png" } alt={product.name} className="w-16 h-16 object-cover rounded" /> {product.name} {product.short_name?.slice(0, 15)}... ); })}
); }; export default ProductTable;