"use client" import { useState } 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 type { Order } from "@/lib/types/api" interface OrdersPageProps { locale?: string } export default function OrdersPageClient({ locale }: OrdersPageProps) { const [isCancelDialogOpen, setIsCancelDialogOpen] = useState(false) const [orderToCancel, setOrderToCancel] = useState(null) const { toast } = useToast() const { data: orders, isLoading, isError, error } = useOrders() const { mutate: cancelOrder, isPending: isCancellingOrder } = useCancelOrder() const t = { orders: "Заказы", myOrders: "Мои заказы", active: "Активные", completed: "Завершенные", activeOrders: "Активные заказы", completedOrders: "Завершенные заказы", cancelOrder: "Отменить заказ", keepOrder: "Оставить заказ", areYouSure: "Вы уверены?", cancelConfirmation: "Вы уверены, что хотите отменить этот заказ? Это действие нельзя отменить.", cancelling: "Отмена...", orderNumber: "Заказ №", ordered: "Заказано", completed: "Завершено", estimatedDelivery: "Ожид. доставка", quantity: "Кол-во", total: "Итого", noOrders: "У вас пока нет заказов", noActiveOrders: "У вас нет активных заказов", noCompletedOrders: "У вас нет завершенных заказов", loadError: "Не удалось загрузить заказы. Пожалуйста, попробуйте позже.", orderCancelled: "Заказ отменен", orderCancelledDescription: "Ваш заказ был успешно отменен", error: "Ошибка", cannotCancelShipped: "Нельзя отменить заказ, который уже отправлен или доставлен", } const handleCancelOrder = (order: Order) => { // Check if order can be cancelled if (order.status === "shipped" || order.status === "delivered") { toast({ title: t.error, description: t.cannotCancelShipped, variant: "destructive", }) return } setOrderToCancel(order) setIsCancelDialogOpen(true) } const confirmCancelOrder = () => { if (!orderToCancel) return cancelOrder(orderToCancel.id, { onSuccess: () => { toast({ title: t.orderCancelled, description: t.orderCancelledDescription, }) setIsCancelDialogOpen(false) setOrderToCancel(null) }, onError: (error: any) => { toast({ title: t.error, description: error.message || "Не удалось отменить заказ", variant: "destructive", }) }, }) } const getStatusBadge = (status: Order["status"]) => { const statusMap: Record = { pending: { label: "Ожидание", variant: "outline" }, processing: { label: "Обработка", variant: "secondary" }, shipped: { label: "Отправлен", variant: "default" }, delivered: { label: "Доставлен", variant: "default", className: "bg-green-600" }, cancelled: { label: "Отменен", variant: "destructive" }, } const statusInfo = statusMap[status] || { label: status, variant: "default" } return ( {statusInfo.label} ) } const activeOrders = orders?.filter((o) => ["pending", "processing", "shipped"].includes(o.status)) || [] const completedOrders = orders?.filter((o) => ["delivered", "cancelled"].includes(o.status)) || [] if (isLoading) { return (

{t.myOrders}

{Array.from({ length: 6 }).map((_, i) => ( ))}
) } if (isError) { return (

{t.myOrders}

{t.loadError}

{error &&

{error.message}

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

{t.myOrders}

{t.noOrders}

) } return (

{t.myOrders}

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

{t.noActiveOrders}

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

{t.noCompletedOrders}

) : (
{completedOrders.map((order) => ( ))}
)}
{t.cancelOrder} #{orderToCancel?.id} {t.cancelConfirmation}
) } interface OrderCardProps { order: Order onCancel: (order: Order) => void isCancelling: boolean getStatusBadge: (status: Order["status"]) => React.ReactNode translations: any showCancelButton: boolean } function OrderCard({ order, onCancel, isCancelling, getStatusBadge, translations: t, showCancelButton, }: OrderCardProps) { const canCancel = showCancelButton && order.status !== "shipped" && order.status !== "delivered" && order.status !== "cancelled" return (

{t.orderNumber}{order.id}

{getStatusBadge(order.status)}

{t.ordered}: {new Date(order.created_at).toLocaleDateString()}

{order.estimated_delivery && (

{t.estimatedDelivery}: {order.estimated_delivery}

)} {!showCancelButton && order.updated_at && (

{t.completed}: {new Date(order.updated_at).toLocaleDateString()}

)}
{order.items?.map((item) => (
{item.product?.image && ( {item.product.name} )}

{item.product?.name}

{t.quantity}: {item.quantity}

))}
{t.total} {order.total_formatted || `$${order.total}`}
{canCancel && (
)}
) }