From e8fb472a9f522547d070c2bfc4fabc5ea06e45cc Mon Sep 17 00:00:00 2001 From: Michael SCHAL Date: Tue, 7 Apr 2026 17:16:33 +0200 Subject: [PATCH] feat: implement shared LoadingModal component and integrate into dashboard route loading states --- src/app/(dashboard)/analytics/loading.tsx | 31 ++----------- src/app/(dashboard)/dashboard/loading.tsx | 28 ++---------- src/app/(dashboard)/exports/loading.tsx | 22 ++------- src/app/(dashboard)/grid/loading.tsx | 40 ++--------------- src/app/(dashboard)/hit-parade/loading.tsx | 35 ++------------- src/app/(dashboard)/publicites/loading.tsx | 26 ++--------- src/app/(dashboard)/settings/loading.tsx | 18 ++------ src/app/(dashboard)/snapshots/loading.tsx | 19 ++------ src/app/(dashboard)/stock-negatif/loading.tsx | 5 +++ src/components/shared/loading-modal.tsx | 45 +++++++++++++++++++ 10 files changed, 74 insertions(+), 195 deletions(-) create mode 100644 src/app/(dashboard)/stock-negatif/loading.tsx create mode 100644 src/components/shared/loading-modal.tsx diff --git a/src/app/(dashboard)/analytics/loading.tsx b/src/app/(dashboard)/analytics/loading.tsx index dd99d6d..1f90c2f 100644 --- a/src/app/(dashboard)/analytics/loading.tsx +++ b/src/app/(dashboard)/analytics/loading.tsx @@ -1,30 +1,5 @@ +import LoadingModal from "@/components/shared/loading-modal"; + export default function AnalyticsLoading() { - return ( -
- {/* Header */} -
-
-
-
-
-
-
- - {/* Filter bar */} -
- - {/* Table skeleton */} -
-
- {Array.from({ length: 8 }).map((_, i) => ( -
-
-
-
-
-
- ))} -
-
- ); + return ; } diff --git a/src/app/(dashboard)/dashboard/loading.tsx b/src/app/(dashboard)/dashboard/loading.tsx index 89b212a..f3b9911 100644 --- a/src/app/(dashboard)/dashboard/loading.tsx +++ b/src/app/(dashboard)/dashboard/loading.tsx @@ -1,27 +1,5 @@ +import LoadingModal from "@/components/shared/loading-modal"; + export default function DashboardLoading() { - return ( -
- {/* Header skeleton */} -
-
-
-
- - {/* KPI cards row */} -
- {Array.from({ length: 4 }).map((_, i) => ( -
- ))} -
- - {/* Main content area */} -
-
-
-
- - {/* Bottom tables */} -
-
- ); + return ; } diff --git a/src/app/(dashboard)/exports/loading.tsx b/src/app/(dashboard)/exports/loading.tsx index 6c6c9ab..96505c3 100644 --- a/src/app/(dashboard)/exports/loading.tsx +++ b/src/app/(dashboard)/exports/loading.tsx @@ -1,21 +1,5 @@ -export default function ExportsLoading() { - return ( -
- {/* Header */} -
+import LoadingModal from "@/components/shared/loading-modal"; - {/* Table */} -
-
- {Array.from({ length: 8 }).map((_, i) => ( -
-
-
-
-
-
- ))} -
-
- ); +export default function ExportsLoading() { + return ; } diff --git a/src/app/(dashboard)/grid/loading.tsx b/src/app/(dashboard)/grid/loading.tsx index 4d3b3df..9744063 100644 --- a/src/app/(dashboard)/grid/loading.tsx +++ b/src/app/(dashboard)/grid/loading.tsx @@ -1,39 +1,5 @@ -export default function GridLoading() { - return ( -
-
- {/* Spinner */} -
-
-
+import LoadingModal from "@/components/shared/loading-modal"; -
- - Chargement des données - - - Récupération des articles et calcul des scores... - -
-
-
- ); +export default function GridLoading() { + return ; } diff --git a/src/app/(dashboard)/hit-parade/loading.tsx b/src/app/(dashboard)/hit-parade/loading.tsx index d85f2ae..276e208 100644 --- a/src/app/(dashboard)/hit-parade/loading.tsx +++ b/src/app/(dashboard)/hit-parade/loading.tsx @@ -1,34 +1,5 @@ +import LoadingModal from "@/components/shared/loading-modal"; + export default function HitParadeLoading() { - return ( -
- {/* Header */} -
-
-
-
-
-
-
- - {/* Podium / top cards */} -
- {Array.from({ length: 3 }).map((_, i) => ( -
- ))} -
- - {/* Rankings table */} -
-
- {Array.from({ length: 10 }).map((_, i) => ( -
-
-
-
-
-
- ))} -
-
- ); + return ; } diff --git a/src/app/(dashboard)/publicites/loading.tsx b/src/app/(dashboard)/publicites/loading.tsx index 8e74239..131b8b2 100644 --- a/src/app/(dashboard)/publicites/loading.tsx +++ b/src/app/(dashboard)/publicites/loading.tsx @@ -1,25 +1,5 @@ +import LoadingModal from "@/components/shared/loading-modal"; + export default function PublicitesLoading() { - return ( -
-
-
-
-
-
-
- {Array.from({ length: 8 }).map((_, i) => ( -
-
-
-
-
-
-
-
- ))} -
-
-
-
- ); + return ; } diff --git a/src/app/(dashboard)/settings/loading.tsx b/src/app/(dashboard)/settings/loading.tsx index 0d0039b..7b00b11 100644 --- a/src/app/(dashboard)/settings/loading.tsx +++ b/src/app/(dashboard)/settings/loading.tsx @@ -1,17 +1,5 @@ -export default function SettingsLoading() { - return ( -
- {/* Header */} -
+import LoadingModal from "@/components/shared/loading-modal"; - {/* Settings sections */} - {Array.from({ length: 3 }).map((_, i) => ( -
-
-
-
-
- ))} -
- ); +export default function SettingsLoading() { + return ; } diff --git a/src/app/(dashboard)/snapshots/loading.tsx b/src/app/(dashboard)/snapshots/loading.tsx index 4a4e705..346c5ef 100644 --- a/src/app/(dashboard)/snapshots/loading.tsx +++ b/src/app/(dashboard)/snapshots/loading.tsx @@ -1,18 +1,5 @@ -export default function SnapshotsLoading() { - return ( -
- {/* Header */} -
-
-
-
+import LoadingModal from "@/components/shared/loading-modal"; - {/* Cards grid */} -
- {Array.from({ length: 6 }).map((_, i) => ( -
- ))} -
-
- ); +export default function SnapshotsLoading() { + return ; } diff --git a/src/app/(dashboard)/stock-negatif/loading.tsx b/src/app/(dashboard)/stock-negatif/loading.tsx new file mode 100644 index 0000000..f934a03 --- /dev/null +++ b/src/app/(dashboard)/stock-negatif/loading.tsx @@ -0,0 +1,5 @@ +import LoadingModal from "@/components/shared/loading-modal"; + +export default function StockNegatifLoading() { + return ; +} diff --git a/src/components/shared/loading-modal.tsx b/src/components/shared/loading-modal.tsx new file mode 100644 index 0000000..dc0fd02 --- /dev/null +++ b/src/components/shared/loading-modal.tsx @@ -0,0 +1,45 @@ +interface LoadingModalProps { + message?: string; + subMessage?: string; +} + +export default function LoadingModal({ + message = "Chargement des données", + subMessage = "Veuillez patienter...", +}: LoadingModalProps) { + return ( +
+
+
+
+
+
+ + {message} + + + {subMessage} + +
+
+
+ ); +}