"use client"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { useEffect, useMemo, useState } from "react"; import { getDashboardSummary, type DashboardSummaryResponse } from "../../src/lib/api"; import { clearAuth, getStoredToken, getStoredUser } from "../../src/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; } // FIX: Implement role-based access control by checking the authenticated user's role from localStorage. Only users with "user" or "admin" roles can access the dashboard. If the role is missing or not allowed, clear the auth state and redirect to login. const storedUser = getStoredUser(); // add this import at top of file const role = typeof storedUser?.role === "string" ? storedUser.role : ""; if (!role || ["driver", "سائق"].includes(role)) { clearAuth(); // add this import at top of file 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}

))}

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

تقدم الرحلات

مباشر من /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 — تنظيم الرحلات
)}
); }