diff --git a/src/components/common/GlobalLoadingWrapper.jsx b/src/components/common/GlobalLoadingWrapper.jsx
new file mode 100644
index 0000000..9c843a7
--- /dev/null
+++ b/src/components/common/GlobalLoadingWrapper.jsx
@@ -0,0 +1,32 @@
+import { useNavigation } from 'react-router-dom';
+import { useSelector } from 'react-redux';
+import Spinner from './Spinner';
+
+const selectIsAnyLoading = (state) =>
+ state.auth.isLoading ||
+ state.campaigns.loading ||
+ state.donations.loading ||
+ state.dashboard.loading;
+
+const GlobalLoadingWrapper = ({ children }) => {
+ const navigation = useNavigation();
+ const isReduxLoading = useSelector(selectIsAnyLoading);
+
+ const isLoading = navigation.state !== 'idle' || isReduxLoading;
+
+ return (
+ <>
+ {children}
+ {isLoading && (
+
-
404 - Page Not Found
-
The page you are looking for does not exist.
-
Go back to Home
+
+
+
+ 404
+
+
+
+ Page Not Found
+
+
+
+ The page you're looking for doesn't exist or may have been moved.
+ Check the URL or head back home.
+
+
+
+
+ Go Back Home
+
+
+
+
+
);
};
diff --git a/src/routes/AppRouter.jsx b/src/routes/AppRouter.jsx
index a41a5e1..027afad 100644
--- a/src/routes/AppRouter.jsx
+++ b/src/routes/AppRouter.jsx
@@ -1,41 +1,53 @@
+import { lazy, Suspense } from 'react';
import { BrowserRouter, Routes, Route } from 'react-router-dom';
-// Layout
import MainLayout from '../components/layout/MainLayout';
+import GlobalLoadingWrapper from '../components/common/GlobalLoadingWrapper';
+import Spinner from '../components/common/Spinner';
+import NotFound from '../pages/NotFound';
+import ErrorTest from '../components/common/ErrorTest';
-// Pages
-import Home from '../pages/Home';
-import Explore from '../pages/Explore';
+// Auth pages — small, kept as static imports
import Login from '../pages/Login';
import Register from '../pages/Register';
import ForgotPasswordPage from '../pages/auth/ForgotPasswordPage';
-import Dashboard from '../pages/Dashboard';
-import CampaignDetails from '../pages/CampaignDetails';
-import CreateCampaign from '../pages/CreateCampaign';
-import Admin from '../pages/Admin';
-import NotFound from '../pages/NotFound';
-// Test Component
-import ErrorTest from '../components/common/ErrorTest';
+// Main pages — lazy-loaded for code splitting
+const Home = lazy(() => import('../pages/Home'));
+const Explore = lazy(() => import('../pages/Explore'));
+const CampaignDetails = lazy(() => import('../pages/CampaignDetails'));
+const CreateCampaign = lazy(() => import('../pages/CreateCampaign'));
+const Dashboard = lazy(() => import('../pages/Dashboard'));
+const Admin = lazy(() => import('../pages/Admin'));
+
+const SuspenseFallback = () => (
+
+
+
+);
const AppRouter = () => {
return (
-
- } />
- } />
- } />
- } />
- } />
- } />
- }>
- } />
- } />
- } />
- } />
- } />
-
-
+
+ }>
+
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ }>
+ } />
+ } />
+ } />
+ } />
+ } />
+
+
+
+
);
};