109 lines
3.1 KiB
JavaScript
109 lines
3.1 KiB
JavaScript
import React from 'react';
|
|
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom';
|
|
import { AuthProvider, useAuth } from './context/AuthContext';
|
|
import { ErrorBoundary } from './components/ErrorBoundary';
|
|
import { LoginPage } from './pages/LoginPage';
|
|
import { HomePage } from './pages/HomePage';
|
|
import { UserPage } from './pages/UserPage';
|
|
import { AdminPage } from './pages/AdminPage';
|
|
import { StoresPage } from './pages/StoresPage';
|
|
import { AnalyticsPage } from './pages/AnalyticsPage';
|
|
import { NutritionAnalyticsPage } from './pages/NutritionAnalyticsPage';
|
|
|
|
function ProtectedRoute({ children, allowedRoles }) {
|
|
const { user, role } = useAuth();
|
|
|
|
if (!user) {
|
|
return <Navigate to="/login" replace />;
|
|
}
|
|
|
|
const effectiveRole = role || (user.role === 'store' ? 'user' : user.role);
|
|
|
|
if (allowedRoles && !allowedRoles.includes(effectiveRole)) {
|
|
if (window.location.pathname === '/user') {
|
|
return children;
|
|
}
|
|
return <Navigate to="/user" replace />;
|
|
}
|
|
|
|
return children;
|
|
}
|
|
|
|
export default function App() {
|
|
return (
|
|
<ErrorBoundary>
|
|
<AuthProvider>
|
|
<BrowserRouter>
|
|
<Routes>
|
|
{/* Public Login Route */}
|
|
<Route path="/login" element={<LoginPage />} />
|
|
|
|
{/* Catalog Route - RESTRICTED TO ADMIN ONLY */}
|
|
<Route
|
|
path="/"
|
|
element={
|
|
<ProtectedRoute allowedRoles={['admin']}>
|
|
<HomePage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
|
|
{/* User Workspace Route */}
|
|
<Route
|
|
path="/user"
|
|
element={
|
|
<ProtectedRoute allowedRoles={['admin', 'user', 'store']}>
|
|
<UserPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
|
|
{/* Admin Panel Route - RESTRICTED TO ADMIN ONLY */}
|
|
<Route
|
|
path="/admin"
|
|
element={
|
|
<ProtectedRoute allowedRoles={['admin']}>
|
|
<AdminPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
|
|
{/* Store Intelligence Route */}
|
|
<Route
|
|
path="/stores"
|
|
element={
|
|
<ProtectedRoute allowedRoles={['admin', 'user', 'store']}>
|
|
<StoresPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
|
|
{/* Analytics Route */}
|
|
<Route
|
|
path="/analytics"
|
|
element={
|
|
<ProtectedRoute allowedRoles={['admin', 'user', 'store']}>
|
|
<AnalyticsPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
|
|
{/* Nutrition Intelligence Route */}
|
|
<Route
|
|
path="/nutrition-analytics"
|
|
element={
|
|
<ProtectedRoute allowedRoles={['admin', 'user', 'store']}>
|
|
<NutritionAnalyticsPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
|
|
{/* Catch-all redirect */}
|
|
<Route path="*" element={<Navigate to="/" replace />} />
|
|
</Routes>
|
|
</BrowserRouter>
|
|
</AuthProvider>
|
|
</ErrorBoundary>
|
|
);
|
|
}
|