"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 { useToast } from "@/hooks/use-toast"; import { useOrders, useCancelOrder } from "@/lib/hooks"; import { useTranslations } from "next-intl"; import type { Order } from "@/lib/types/api"; interface OrdersPageClientProps { locale: string; } export default function OrdersPageClient({ locale }: OrdersPageClientProps) { const [isCancelDialogOpen, setIsCancelDialogOpen] = useState(false); const [orderToCancel, setOrderToCancel] = useState(null); const { toast } = useToast(); const t = useTranslations(); const { data: orders, isLoading, isError, error } = useOrders(); const { mutate: cancelOrder, isPending: isCancellingOrder } = useCancelOrder(); const handleCancelOrder = useCallback((order: Order) => { setOrderToCancel(order); setIsCancelDialogOpen(true); }, []); const confirmCancelOrder = useCallback(() => { if (!orderToCancel) return; cancelOrder(orderToCancel.id, { onSuccess: () => { toast({ title: t("order_cancelled"), description: t("order_cancelled_description"), }); setIsCancelDialogOpen(false); setOrderToCancel(null); }, onError: (error: any) => { toast({ title: t("error"), description: error.message || t("cancel_order_failed"), variant: "destructive", }); }, }); }, [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şlama") || 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); }, []); const loadingSkeleton = useMemo(() => (

{t("my_orders")}

{Array.from({ length: 6 }).map((_, i) => ( ))}
), [t]); if (isLoading) { return loadingSkeleton; } if (isError) { return (

{t("my_orders")}

{t("load_orders_error")}

); } if (!orders || orders.length === 0) { return (

{t("my_orders")}

{t("no_orders")}

); } return (

{t("my_orders")}

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

{t("no_active_orders")}

) : (
{activeOrders.map((order) => ( ))}
)}
{completedOrders.length === 0 ? (

{t("no_completed_orders")}

) : (
{completedOrders.map((order) => ( ))}
)}
{t("cancel_order")} #{orderToCancel?.id} {t("cancel_confirmation")}
); } interface OrderCardProps { order: Order; onCancel: (order: Order) => void; isCancelling: boolean; getStatusBadge: (status: string) => React.ReactNode; calculateTotal: (order: Order) => number; showCancelButton: boolean; } function OrderCard({ order, onCancel, isCancelling, getStatusBadge, calculateTotal, showCancelButton, }: OrderCardProps) { const t = useTranslations(); const total = useMemo(() => calculateTotal(order), [calculateTotal, order]); return (

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

{getStatusBadge(order.status)}

{t("delivery_time")}: {order.delivery_time}

{t("delivery_date")}:{" "} {new Date(order.delivery_at).toLocaleDateString()}

{t("address")}: {order.customer_address}

{t("payment_method")}: {order.payment_type}

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

{item.product.name}

{t("product_quantity")}: {item.quantity} × {item.unit_price_amount} TMT

))}
{t("total_price")} {total.toFixed(2)} TMT
{showCancelButton && (
)}
); }