The mount path is set per-placement by the frontgen server's <base href> (/krishna-sales/ on qa). The hardcoded /krishna_sales basename didn't match, so the Router refused to render. Read it from the document base so one artifact serves any mount path.
64 lines
2.2 KiB
TypeScript
64 lines
2.2 KiB
TypeScript
import { BrowserRouter, Navigate, Route, Routes } from 'react-router-dom'
|
|
import { AuthProvider } from './auth/AuthProvider'
|
|
import { LoginPage } from './screens/LoginPage'
|
|
import { ConsoleLayout } from './screens/ConsoleLayout'
|
|
|
|
import { DatasetItemsPage } from './screens/admin/DatasetItemsPage'
|
|
import { ProtectedRoute, getDefaultRoute } from './auth/ProtectedRoute'
|
|
import { useAuth } from './auth/context'
|
|
|
|
function RootRedirect() {
|
|
const { roles, isAdmin } = useAuth();
|
|
return <Navigate to={getDefaultRoute(roles, isAdmin)} replace />;
|
|
}
|
|
|
|
import { routeConfig } from './routesConfig'
|
|
|
|
// Mount path comes from the document <base href> the frontgen server writes at
|
|
// placement time (e.g. "/krishna-sales/"), so one built artifact serves any
|
|
// mount without a hardcoded slug. Falls back to "/" for local dev.
|
|
const routerBasename =
|
|
(document.querySelector('base')?.getAttribute('href') || '/').replace(/\/$/, '') || '/'
|
|
|
|
function App() {
|
|
return (
|
|
<AuthProvider>
|
|
<BrowserRouter basename={routerBasename}>
|
|
<Routes>
|
|
<Route path="/login" element={<LoginPage />} />
|
|
<Route element={<ConsoleLayout />}>
|
|
{routeConfig.map((route, i) => {
|
|
const path = route.path.startsWith('/') ? route.path.substring(1) : route.path;
|
|
|
|
// Maintain nested route for Dataset items specifically
|
|
if (path === 'admin/datasets') {
|
|
return (
|
|
<Route
|
|
key={i}
|
|
path={path}
|
|
element={<ProtectedRoute adminOnly={route.adminOnly} roles={route.roles}>{route.element}</ProtectedRoute>}
|
|
>
|
|
<Route path=":id" element={<DatasetItemsPage />} />
|
|
</Route>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<Route
|
|
key={i}
|
|
path={path}
|
|
element={<ProtectedRoute roles={route.roles} adminOnly={route.adminOnly}>{route.element}</ProtectedRoute>}
|
|
/>
|
|
);
|
|
})}
|
|
|
|
<Route path="*" element={<RootRedirect />} />
|
|
</Route>
|
|
</Routes>
|
|
</BrowserRouter>
|
|
</AuthProvider>
|
|
)
|
|
}
|
|
|
|
export default App
|