"use client"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { useEffect, useMemo, useState } from "react"; import { getDashboardSummary, type DashboardSummaryResponse } from "../lib/api"; import { getStoredToken } from "../lib/auth"; export default function DashboardPage() { const router = useRouter(); const [data, setData] = useState(null); const [error, setError] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { if (!getStoredToken()) { router.replace("/login"); return; } let mounted = true; async function load() { try { const summary = await getDashboardSummary(); if (mounted) setData(summary); } catch (err) { if (mounted) setError(err instanceof Error ? err.message : "Unable to load dashboard data."); } finally { if (mounted) setLoading(false); } } load(); return () => { mounted = false; }; }, [router]); const stats = data?.data?.stats; const alerts = data?.data?.alerts; const activeTrips = data?.data?.activeTrips || []; const summaryCards = useMemo( () => [ { label: "العملاء", value: stats?.clients ?? 0, tone: "from-cyan-500 to-sky-600" }, { label: "الطلبات", value: stats?.orders ?? 0, tone: "from-violet-500 to-fuchsia-600" }, { label: "الرحلات", value: stats?.trips ?? 0, tone: "from-emerald-500 to-green-600" }, { label: "المركبات", value: (stats?.cars ?? 0) + (stats?.drivers ?? 0), tone: "from-amber-400 to-orange-500" }, ], [stats], ); return (

لوحة العمليات

ذكاء الأسطول في لمحة سريعة

هذه الشاشة متوافقة مع نقطة ملخص لوحة الإدارة في الخلفية وتوفر عرضًا واضحًا لطلب الأسطول، وتنبيهات السلامة، وتقدم الرحلات.

العودة إلى بوابة العميل
{loading &&

جارٍ تحميل مقاييس الخلفية…

} {error &&

{error}

} {!loading && !error && ( <>
{summaryCards.map((item) => (

{item.label}

{item.value}

))}

الرحلات النشطة

تقدم الرحلات

مباشر من /v1/dashboard/summary
{activeTrips.length ? activeTrips.map((trip) => (

{trip.tripNumber}

{trip.title}

{trip.progress}%
)) :

لا توجد رحلات في-progress حالياً.

}

تنبيهات الالتزام

التجديدات القادمة

{(alerts?.expiringCars || []).slice(0, 3).map((item, index) => (
{String((item as Record).message || "Vehicle expiry alert")}
))} {(alerts?.expiringDrivers || []).slice(0, 3).map((item, index) => (
{String((item as Record).message || "Driver expiry alert")}
))} {(alerts?.upcomingMaint || []).slice(0, 3).map((item, index) => (
{String((item as Record).message || "Maintenance alert")}
))}

الأمان

لمحة الحساب

آخر تسجيل دخول: {data?.data?.accountSecurity?.lastLogin || "لم يتم العثور على حدث تسجيل دخول"}
بيانات الجهاز: {data?.data?.accountSecurity?.requestMeta ? JSON.stringify(data.data.accountSecurity.requestMeta) : "غير متاح"}

خريطة الخلفية

النقاط النهائية المستندة إلى Swagger

  • /v1/dashboard/summary — نظرة عامة تشغيلية
  • /v1/client — إدارة العملاء
  • /v1/orders — دورة شحن الطلبات
  • /v1/trip — تنظيم الرحلات
)}
); }