"use client"; import { useState, useCallback, useMemo } from "react"; import Image from "next/image"; import { Button } from "@/components/ui/button"; import { Card } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Skeleton } from "@/components/ui/skeleton"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { ChevronDown, ChevronUp, Package, Calendar, MapPin, CreditCard, ShoppingBag, } from "lucide-react"; import { toast } from "sonner"; import { useOrders, useCancelOrder } from "@/lib/hooks"; import { useTranslations } from "next-intl"; import type { Order } from "@/lib/types/api"; import EmptyOrders from "./EmptyOrders"; import ErrorPage from "@/components/ErrorPage"; interface OrdersPageClientProps { locale: string; } export default function OrdersPageClient({ locale }: OrdersPageClientProps) { const [isCancelDialogOpen, setIsCancelDialogOpen] = useState(false); const [orderToCancel, setOrderToCancel] = useState(null); const [expandedOrders, setExpandedOrders] = useState>(new Set()); const t = useTranslations(); const { data: orders, isLoading, isError } = useOrders(); const { mutate: cancelOrder, isPending: isCancellingOrder } = useCancelOrder(); const toggleOrderExpand = useCallback((orderId: number) => { setExpandedOrders((prev) => { const newSet = new Set(prev); if (newSet.has(orderId)) { newSet.delete(orderId); } else { newSet.add(orderId); } return newSet; }); }, []); const handleCancelOrder = useCallback((order: Order) => { setOrderToCancel(order); setIsCancelDialogOpen(true); }, []); const confirmCancelOrder = useCallback(() => { if (!orderToCancel) return; cancelOrder(orderToCancel.id, { onSuccess: () => { toast.success(t("order_cancelled")); setIsCancelDialogOpen(false); setOrderToCancel(null); }, onError: (error: any) => { toast.error(error.message || t("cancel_order_failed")); }, }); }, [orderToCancel, cancelOrder, toast, t]); const getStatusBadge = useCallback((status: string) => { const lowerStatus = status.toLowerCase(); if ( lowerStatus.includes("ожидается") || lowerStatus.includes("pending") || lowerStatus.includes("garaşlama") ) { return ( {status} ); } if ( lowerStatus.includes("обработка") || lowerStatus.includes("processing") || lowerStatus.includes("işlenýär") ) { return ( {status} ); } if ( lowerStatus.includes("отправлен") || lowerStatus.includes("shipped") || lowerStatus.includes("iberildi") ) { return {status}; } if ( lowerStatus.includes("доставлен") || lowerStatus.includes("delivered") || lowerStatus.includes("eltildi") ) { return {status}; } if ( lowerStatus.includes("отменен") || lowerStatus.includes("cancelled") || lowerStatus.includes("ýatyryldy") ) { return {status}; } return {status}; }, []); const isActiveOrder = useCallback((status: string) => { const lower = status.toLowerCase(); return ( lower.includes("ожидается") || lower.includes("обработка") || lower.includes("отправлен") || lower.includes("pending") || lower.includes("processing") || lower.includes("shipped") || lower.includes("garaşylýar") || lower.includes("işlenýär") || lower.includes("iberildi") ); }, []); const activeOrders = useMemo( () => orders?.filter((o) => isActiveOrder(o.status)) || [], [orders, isActiveOrder] ); const completedOrders = useMemo( () => orders?.filter((o) => !isActiveOrder(o.status)) || [], [orders, isActiveOrder] ); const calculateTotal = useCallback((order: Order) => { return order.orderItems.reduce((sum, item) => { return sum + parseFloat(item.unit_price_amount) * item.quantity; }, 0); }, []); if (isLoading) { return (

{t("my_orders")}

{/* Tabs Skeleton */}
{/* Order Cards Skeleton */}
{Array.from({ length: 3 }).map((_, i) => (
{/* Left side - Order info */}
{/* Right side - Status and price */}
))}
); } if (isError) { return ; } if (isError || !orders || orders.length === 0) { return ; } return (

{t("my_orders")}

{t("active_orders")} ({activeOrders.length}) {t("completed_orders")} ({completedOrders.length}) {activeOrders.length === 0 ? (

{t("no_active_orders")}

) : (
{activeOrders.map((order) => ( toggleOrderExpand(order.id)} onCancel={handleCancelOrder} isCancelling={isCancellingOrder} getStatusBadge={getStatusBadge} calculateTotal={calculateTotal} showCancelButton t={t} /> ))}
)}
{completedOrders.length === 0 ? (

{t("no_completed_orders")}

) : (
{completedOrders.map((order) => ( toggleOrderExpand(order.id)} onCancel={handleCancelOrder} isCancelling={isCancellingOrder} getStatusBadge={getStatusBadge} calculateTotal={calculateTotal} showCancelButton={false} t={t} /> ))}
)}
{t("cancel_order")} #{orderToCancel?.id} {t("cancel_confirmation")}
); } interface CompactOrderCardProps { order: Order; isExpanded: boolean; onToggle: () => void; onCancel: (order: Order) => void; isCancelling: boolean; getStatusBadge: (status: string) => React.ReactNode; calculateTotal: (order: Order) => number; showCancelButton: boolean; t: any; } function CompactOrderCard({ order, isExpanded, onToggle, onCancel, isCancelling, getStatusBadge, calculateTotal, showCancelButton, t, }: CompactOrderCardProps) { const total = useMemo(() => calculateTotal(order), [calculateTotal, order]); const itemCount = order.orderItems.length; return ( {/* Compact Header - Always Visible */}

{t("order_number")} {order.id}

{itemCount} {itemCount === 1 ? t("product") : t("products")}

{getStatusBadge(order.status)}

{total.toFixed(2)} TMT

{isExpanded ? ( ) : ( )}
{/* Expandable Details */} {isExpanded && (
{/* Order Info Grid */}
{/*

{t("delivery_date")}

{new Date(order.delivery_at).toLocaleDateString()} •{" "} {order.delivery_time}

*/}

{t("address")}

{order.customer_address}

{t("payment_method")}

{order.payment_type}

{t("shipping_method")}

{order.shipping_method}

{/* Products List */}

{t("products")}:

{order.orderItems.map((item, index) => (
{item.product.name}

{item.product.name}

{item.quantity} × {item.unit_price_amount} TMT

{( parseFloat(item.unit_price_amount) * item.quantity ).toFixed(2)}{" "} TMT

))}
{/* Footer with Total and Actions */}
{t("total_price")}: {total.toFixed(2)} TMT
{showCancelButton && ( )}
)}
); }