"use client"; import { useState, useEffect, useMemo } from "react"; import { Card } from "@/components/ui/card"; import { Separator } from "@/components/ui/separator"; import CartItemCard from "../../../features/cart/components/CartItemCard"; import CartItemSkeleton from "../../../features/cart/components/CartItemSkeleton"; import OrderSummary from "../../../features/cart/components/OrderSummary"; import OrderSummarySkeleton from "../../../features/cart/components/OrderSummarySkeleton"; import { useCart, useCreateOrder, useRegions, usePaymentTypes, } from "@/lib/hooks"; import { useTranslations } from "next-intl"; import { useRouter } from "next/navigation"; import type { DeliveryType, PaymentType } from "@/lib/types/api"; import EmptyCart from "@/features/cart/components/EmptyCart"; import ErrorPage from "@/components/ErrorPage"; export default function CartPage() { const [paymentType, setPaymentType] = useState(null); const [deliveryType, setDeliveryType] = useState("SELECTED_DELIVERY"); const [selectedRegion, setSelectedRegion] = useState("ag"); const [selectedProvince, setSelectedProvince] = useState(4); const [note, setNote] = useState(""); const [phone, setPhone] = useState("+993 "); const [name, setName] = useState("user"); const [lastName, setLastName] = useState("user"); const router = useRouter(); const t = useTranslations(); const { data: cartResponse, isLoading: cartLoading, isError } = useCart(); const { data: provinces = [], isLoading: provincesLoading } = useRegions(); const { data: paymentTypes = [], isLoading: paymentTypesLoading } = usePaymentTypes(); const { mutate: createOrder, isPending: isCreatingOrder } = useCreateOrder(); const cartItems = cartResponse?.data || []; const isLoading = cartLoading || provincesLoading || paymentTypesLoading; useEffect(() => { if (paymentTypes.length > 0) { const defaultType = paymentTypes.find((t) => t.id === 1); if (defaultType) { setPaymentType(defaultType); } } }, [paymentTypes]); const regionGroups = useMemo(() => { return provinces.reduce( (acc, province) => { if (!acc[province.region]) { acc[province.region] = []; } acc[province.region].push(province); return acc; }, {} as Record, ); }, [provinces]); const availableRegions = useMemo( () => Object.keys(regionGroups), [regionGroups], ); const itemsBySeller = useMemo(() => { return cartItems.reduce( (acc, item) => { const sellerId = item.product.channel?.[0]?.id || 0; const sellerName = item.product.channel?.[0]?.name || "Unknown Seller"; if (!acc[sellerId]) { acc[sellerId] = { seller: { id: sellerId, name: sellerName }, items: [], }; } acc[sellerId].items.push(item); return acc; }, {} as Record< number, { seller: { id: number; name: string }; items: typeof cartItems } >, ); }, [cartItems]); const totalAmount = useMemo(() => { return cartItems.reduce((sum, item) => { const price = parseFloat(item.product.price_amount || "0"); return sum + price * item.product_quantity; }, 0); }, [cartItems]); const handleDeliveryTypeChange = (type: DeliveryType) => { setDeliveryType(type); setSelectedProvince(null); }; const formatPhoneForBackend = (phoneNumber: string): string => { return phoneNumber.replace(/^\+993\s*/, "").replace(/\s+/g, ""); }; const handleCompleteOrder = () => { if ( !selectedRegion || !selectedProvince || !paymentType || !phone || !name ) { console.warn("Missing required fields for order"); return; } const phoneDigits = formatPhoneForBackend(phone); if (phoneDigits.length !== 8) { console.warn("Phone number must be exactly 8 digits"); return; } const selectedProvinceData = provinces.find( (p) => p.id === selectedProvince, ); if (!selectedProvinceData) return; const product_ids = cartItems.map((item) => item.product.id); createOrder( { customer_name: `${name} ${lastName}`.trim(), customer_phone: parseInt(phoneDigits, 10), customer_address: selectedProvinceData.name, shipping_method: "standart", payment_type_id: paymentType.id, region: selectedRegion, notes: note || undefined, product_ids, }, { onSuccess: () => { router.push(`/orders`); }, }, ); }; if (isLoading) { return (

{t("cart")}

{Array.from({ length: 3 }).map((_, i) => ( ))}
); } if (isError) { return ; } if (cartItems.length === 0) { return ; } return (

{t("cart")}

{Object.entries(itemsBySeller).map( ([sellerId, { seller, items }]) => (
{/*

{seller.name}

*/}
{items.map((item) => { const price = parseInt(item.product.price_amount || "0"); const quantity = item.product_quantity; const total = price * quantity; return ( m.images_800x800 || m.thumbnail, ) || [], }, }} /> ); })}
{Object.entries(itemsBySeller).length > 1 && ( )}
), )}
); }