"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 OrderSummary from "../../../features/cart/components/OrderSummary"; import { useCart, useCreateOrder, useRegions, usePaymentTypes, } from "@/lib/hooks"; import { userStore } from "@/features/profile/userStore"; 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"; export default function CartPage() { const [isClient, setIsClient] = useState(false); const [paymentType, setPaymentType] = useState(null); const [deliveryType, setDeliveryType] = useState("SELECTED_DELIVERY"); const [selectedRegion, setSelectedRegion] = useState(""); const [selectedProvince, setSelectedProvince] = useState(null); const [note, setNote] = useState(""); const [phone, setPhone] = useState(""); const [name, setName] = useState(""); const [lastName, setLastName] = useState(""); const router = useRouter(); const t = useTranslations(); const { data: cartResponse, isLoading, isError } = useCart(); const { data: provinces = [] } = useRegions(); const { data: paymentTypes = [] } = usePaymentTypes(); const { mutate: createOrder, isPending: isCreatingOrder } = useCreateOrder(); const cartItems = cartResponse?.data || []; useEffect(() => { setIsClient(true); // Get user data from store if available const orderData = userStore.getOrderData(); if (orderData) { if (orderData.customer_name) setName(orderData.customer_name); if (orderData.customer_last_name) setLastName(orderData.customer_last_name); if (orderData.customer_phone) setPhone(orderData.customer_phone); } }, []); 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); }, [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 handleCompleteOrder = () => { if (!selectedRegion || !selectedProvince || !paymentType || !phone || !name) { console.warn("Missing required fields for order"); return; } const selectedProvinceData = provinces.find( (p) => p.id === selectedProvince ); if (!selectedProvinceData) return; const orderData = userStore.getOrderData(); if (!orderData) { console.error("User data not found"); router.push("/"); return; } createOrder( { customer_name: name, customer_phone: phone, customer_address: selectedProvinceData.name, shipping_method: "standart", payment_type_id: paymentType.id, region: selectedRegion, note: note || undefined, }, { onSuccess: () => { router.push(`/orders`); }, } ); }; if (!isClient) return null; if (isError || cartItems.length === 0) { return ( ); } return (

{t("cart")}

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

{seller.name}

{items.map((item) => { const price = parseFloat( 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 && ( )}
) )}
); }