'use client'; import { cart_api } from '@/features/cart/lib/api'; import { BASE_URL } from '@/shared/config/api/URLs'; import { useRouter } from '@/shared/config/i18n/navigation'; import { useCartId } from '@/shared/hooks/cartId'; import formatPrice from '@/shared/lib/formatPrice'; import { Button } from '@/shared/ui/button'; import { Input } from '@/shared/ui/input'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { AxiosError } from 'axios'; import { ArrowLeft, CreditCard, Minus, Plus, ShoppingBag, Trash, Truck, } from 'lucide-react'; import { useTranslations } from 'next-intl'; import Image from 'next/image'; import { useEffect, useRef, useState } from 'react'; import { toast } from 'sonner'; const CartPage = () => { const { cart_id } = useCartId(); const queryClient = useQueryClient(); const router = useRouter(); const t = useTranslations(); const { data: cartItems, isLoading } = useQuery({ queryKey: ['cart_items', cart_id], queryFn: () => cart_api.get_cart_items(cart_id!), enabled: !!cart_id, select: (data) => data.data.cart_item, }); const [quantities, setQuantities] = useState>({}); const debounceRef = useRef>({}); useEffect(() => { if (!cartItems) return; const initialQuantities: Record = {}; cartItems.forEach((item) => { initialQuantities[item.id] = String(item.quantity); debounceRef.current[item.id] = null; }); setQuantities(initialQuantities); }, [cartItems]); const { mutate: updateCartItem } = useMutation({ mutationFn: ({ body, cart_item_id, }: { body: { quantity: number }; cart_item_id: string; }) => cart_api.update_cart_item({ body, cart_item_id }), onSuccess: () => queryClient.invalidateQueries({ queryKey: ['cart_items', cart_id] }), onError: (err: AxiosError) => toast.error(err.message, { richColors: true, position: 'top-center' }), }); const { mutate: deleteCartItem } = useMutation({ mutationFn: ({ cart_item_id }: { cart_item_id: string }) => cart_api.delete_cart_item(cart_item_id), onSuccess: () => queryClient.invalidateQueries({ queryKey: ['cart_items', cart_id] }), onError: (err: AxiosError) => toast.error(err.message, { richColors: true, position: 'top-center' }), }); const handleCheckout = () => router.push('/cart/order'); if (isLoading) return (
Loading...
); if (!cartItems || cartItems.length === 0) return (

{t("Savatingiz bo'sh")}

{t("Mahsulotlar qo'shish uchun katalogga o'ting")}

); const subtotal = cartItems.reduce( (sum, item) => sum + item.product_price * Number(item.quantity), 0, ); const handleQuantityChange = (itemId: string, value: number) => { setQuantities((prev) => ({ ...prev, [itemId]: String(value), })); if (debounceRef.current[itemId]) clearTimeout(debounceRef.current[itemId]!); debounceRef.current[itemId] = setTimeout(() => { if (value <= 0) { deleteCartItem({ cart_item_id: itemId }); } else { updateCartItem({ body: { quantity: value }, cart_item_id: itemId }); } }, 500); }; return (

{t('Savat')}

{cartItems.length} {t('ta mahsulot')}

{cartItems.map((item, index) => (
{item.product_name}

{item.product_name}

{formatPrice(item.product_price, true)}
{ const val = e.target.value.replace(/\D/g, ''); // faqat raqam setQuantities((prev) => ({ ...prev, [item.id]: val, })); // Debounce bilan update const valNum = Number(val); if (!isNaN(valNum)) handleQuantityChange(item.id, valNum); }} type="text" className="w-16 text-center" />
))}

{t('Buyurtma haqida')}

{t('Mahsulotlar narxi')}: {formatPrice(subtotal, true)}
{t('Yetkazib berish')}: {t('Bepul')}
{t('Jami')}: {formatPrice(subtotal, true)}
); }; export default CartPage;