"use client"; import { useEffect, useState } from "react"; import { getStoredToken } from "../../lib/auth"; import { get } from "../../services/api"; import { Spinner, Alert } from "../../Components/UI"; interface Order { id: string; shipmentNumber: string; recipientName: string; recipientPhone: string; currentStatus: "Created" | "Assigned" | "InTransit" | "Delivered" | "Returned" | "Cancelled"; totalPrice?: number; paymentMethod?: string; paymentStatus?: "Pending" | "Paid" | "Failed" | "Refunded"; client?: { name: string }; trip?: { tripNumber: string }; createdAt: string; } interface ApiResponse { data: { data: Order[]; pagination: { total: number; page: number; pages: number }; meta?: { total: number; pages: number }; }; } const STATUS_MAP: Record = { Created: { label: "تم الإنشاء", color: "#1E40AF", bg: "#EFF6FF", border: "#BFDBFE" }, Assigned: { label: "مُعيَّن", color: "#5B21B6", bg: "#F5F3FF", border: "#DDD6FE" }, InTransit: { label: "قيد التوصيل", color: "#854D0E", bg: "#FFFBEB", border: "#FDE68A" }, Delivered: { label: "تم التسليم", color: "#166534", bg: "#DCFCE7", border: "#BBF7D0" }, Returned: { label: "مُرتجع", color: "#991B1B", bg: "#FEF2F2", border: "#FECACA" }, Cancelled: { label: "ملغي", color: "#64748B", bg: "#F1F5F9", border: "#E2E8F0" }, }; const PAY_MAP: Record = { Pending: { label: "معلَّق", color: "#D97706" }, Paid: { label: "مدفوع", color: "#16A34A" }, Failed: { label: "فشل", color: "#DC2626" }, Refunded: { label: "مُسترجع", color: "#64748B" }, }; const cardStyle: React.CSSProperties = { borderRadius: "var(--radius-xl)", border: "1px solid var(--color-border)", background: "var(--color-surface)", overflow: "hidden", boxShadow: "var(--shadow-card)", }; const thStyle: React.CSSProperties = { padding: "0.75rem 1.5rem", fontSize: 11, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.2em", color: "var(--color-text-muted)", background: "var(--color-surface-muted)", borderBottom: "1px solid var(--color-border)", }; export default function OrdersPage() { const [orders, setOrders] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [search, setSearch] = useState(""); const [page, setPage] = useState(1); const [total, setTotal] = useState(0); const [pages, setPages] = useState(1); const [statusFilter, setStatusFilter] = useState(""); useEffect(() => { const token = getStoredToken(); setLoading(true); setError(null); const params = new URLSearchParams({ page: String(page), limit: "10" }); if (search) params.set("search", search); if (statusFilter) params.set("currentStatus", statusFilter); get(`orders?${params}`, token) .then((res) => { const payload = res.data ?? res; setOrders(payload.data ?? []); setTotal(payload.meta?.total ?? 0); setPages(payload.meta?.pages ?? 1); }) .catch((err: Error) => setError(err.message)) .finally(() => setLoading(false)); }, [page, search, statusFilter]); return (
{/* Header */}

إدارة الشحنات

الطلبات

إجمالي {total} طلب

{/* Status filter */} {/* Search */}
{ setSearch(e.target.value); setPage(1); }} dir="rtl" style={{ width: "100%", height: 40, paddingRight: 36, paddingLeft: 12, borderRadius: "var(--radius-lg)", border: "1px solid var(--color-border)", background: "var(--color-surface)", fontSize: 13, color: "var(--color-text-primary)", outline: "none", fontFamily: "var(--font-sans)", }} />
{error && setError(null)} />} {/* Table */}
رقم الشحنة المستلم العميل المبلغ الحالة التاريخ
{loading ? (
جارٍ التحميل…
) : orders.length === 0 ? (

لا توجد نتائج

) : (
    {orders.map((o, i) => { const status = STATUS_MAP[o.currentStatus]; const pay = o.paymentStatus ? PAY_MAP[o.paymentStatus] : null; return (
  • {o.shipmentNumber}

    {o.trip && (

    رحلة: {o.trip.tripNumber}

    )}

    {o.recipientName}

    {o.recipientPhone}

    {o.client?.name ?? "—"}

    {o.totalPrice != null ? `${o.totalPrice.toFixed(2)} ر.س` : "—"}

    {pay && (

    {pay.label}

    )}
    {status.label} {new Date(o.createdAt).toLocaleDateString("ar-SA", { year: "numeric", month: "short", day: "numeric", })}
  • ); })}
)} {pages > 1 && (
صفحة {page} من {pages}
{[ { label: "السابق", action: () => setPage(p => Math.max(1, p - 1)), disabled: page === 1 }, { label: "التالي", action: () => setPage(p => Math.min(pages, p + 1)), disabled: page === pages }, ].map(btn => ( ))}
)}
); }