"use client"; import { useState, useEffect, useCallback, startTransition } from "react"; import { Card } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { ChevronDown, RefreshCw } from "lucide-react"; import { toast } from "sonner"; import { adminListOrders, adminUpdateOrderStatus, AdminOrderApi } from "@/lib/api/orders"; import { useLanguage } from "@/contexts/LanguageContext"; import { ApiError } from "@/lib/api"; type Status = "all" | "pending" | "paid" | "shipped" | "delivered" | "cancelled" | "refunded"; const NEXT_STATUSES: Record = { pending: ["paid", "cancelled"], paid: ["shipped", "cancelled"], shipped: ["delivered"], delivered: [], cancelled: [], refunded: [], }; export default function AdminCommandes() { const { t, locale } = useLanguage(); const [orders, setOrders] = useState([]); const [loading, setLoading] = useState(true); const [filter, setFilter] = useState("all"); const [updating, setUpdating] = useState(null); const STATUS_CONFIG: Record = { pending: { label: t("admin.status.pending"), variant: "secondary" }, paid: { label: t("admin.status.paid"), variant: "default" }, shipped: { label: t("admin.status.shipped"), variant: "outline" }, delivered: { label: t("admin.status.delivered"), variant: "default" }, cancelled: { label: t("admin.status.cancelled"), variant: "destructive" }, refunded: { label: t("admin.status.refunded"), variant: "destructive" }, }; const load = useCallback(async () => { setLoading(true); try { const res = await adminListOrders(filter === "all" ? undefined : filter); setOrders(res.data); } catch (err) { toast.error(err instanceof ApiError ? err.message : t("admin.error")); } finally { setLoading(false); } }, [filter]); useEffect(() => { startTransition(() => load()); }, [load]); const handleStatus = async (id: string, status: string) => { setUpdating(id); try { await adminUpdateOrderStatus(id, status); setOrders((prev) => prev.map((o) => (o.id === id ? { ...o, status } : o))); toast.success(t("admin.settings.saved")); } catch (err) { toast.error(err instanceof ApiError ? err.message : t("admin.error")); } finally { setUpdating(null); } }; return (

{t("admin.orders.title")}

{orders.length} {t("admin.orders.subtitle")}

setFilter(v as Status)}> {t("admin.orders.tab_all")} {t("admin.orders.tab_pending")} {t("admin.orders.tab_paid")} {t("admin.orders.tab_shipped")} {t("admin.orders.tab_delivered")} {t("admin.orders.tab_cancelled")} {loading ? (
{Array.from({ length: 5 }).map((_, i) => (
))}
) : ( {t("admin.orders.col_ref")} {t("admin.orders.col_customer")} {t("admin.orders.col_date")} {t("admin.orders.col_total")} {t("admin.status")} {t("admin.actions")} {orders.length === 0 ? ( {t("admin.orders.none")} ) : ( orders.map((o) => { const cfg = STATUS_CONFIG[o.status] ?? { label: o.status, variant: "outline" as const }; const nextStatuses = NEXT_STATUSES[o.status] ?? []; return ( #{o.id.slice(0, 8).toUpperCase()}
{o.client_name ?? "—"}
{o.client_email ?? ""}
{new Date(o.created_at).toLocaleDateString(locale, { day: "2-digit", month: "short", year: "numeric" })} {o.total_amount.toFixed(2)} € {cfg.label} {nextStatuses.length > 0 ? ( {nextStatuses.map((s) => ( handleStatus(o.id, s)}> {STATUS_CONFIG[s]?.label ?? s} ))} ) : ( )}
); }) )}
)}
); }