"use client"; import { useEffect, useState } from "react"; import { getStoredToken } from "../../lib/auth"; import { get, post, put, del } from "../../services/api"; import { Spinner, Alert } from "../../Components/UI"; interface Driver { id: string; name: string; userName?: string; phone: string; nationality?: string; licenseNumber?: string; licenseExpiry?: string; nationalIdExpiry?: string; status: "Active" | "Inactive" | "InTrip" | "Suspended"; isActive: boolean; branch?: { name: string }; createdAt: string; } interface ApiResponse { data: { data: Driver[]; pagination: { total: number; page: number; pages: number }; meta?: { total: number; pages: number }; }; } const STATUS_MAP: Record = { Active: { label: "نشط", color: "#166534", bg: "#DCFCE7", border: "#BBF7D0" }, InTrip: { label: "في رحلة", color: "#1E40AF", bg: "#EFF6FF", border: "#BFDBFE" }, Inactive: { label: "غير نشط", color: "#64748B", bg: "#F1F5F9", border: "#E2E8F0" }, Suspended: { label: "موقوف", color: "#991B1B", bg: "#FEF2F2", border: "#FECACA" }, }; function fmtDate(iso?: string) { if (!iso) return "—"; return new Date(iso).toLocaleDateString("ar-SA", { year: "numeric", month: "short", day: "numeric", }); } function expirySoon(iso?: string) { if (!iso) return false; return (new Date(iso).getTime() - Date.now()) / 86_400_000 <= 90; } 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 DriversPage() { const [drivers, setDrivers] = 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); useEffect(() => { const token = getStoredToken(); setLoading(true); setError(null); const query = `?page=${page}&limit=10${search ? `&search=${encodeURIComponent(search)}` : ""}`; get(`driver${query}`, token) .then((res) => { const payload = res.data ?? res; setDrivers(payload.data ?? []); setTotal(payload.meta?.total ?? 0); setPages(payload.meta?.pages ?? 1); }) .catch((err: Error) => setError(err.message)) .finally(() => setLoading(false)); }, [page, search]); return (
{/* Header */}

إدارة الكوادر

السائقون

إجمالي {total} سائق مسجل

{ 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 ? (
جارٍ التحميل…
) : drivers.length === 0 ? (

لا توجد نتائج {search && `لـ "${search}"`}

) : (
    {drivers.map((d, i) => { const status = STATUS_MAP[d.status]; const licWarn = expirySoon(d.licenseExpiry); const idWarn = expirySoon(d.nationalIdExpiry); return (
  • {d.name}

    {d.phone}

    {d.branch?.name ?? "—"} {d.nationality ?? "—"} {licWarn && "⚠ "}{fmtDate(d.licenseExpiry)} {status.label} {idWarn && "⚠ "}{fmtDate(d.nationalIdExpiry)}
  • ); })}
)} {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 => ( ))}
)}
); }