В итоге все маршруты у меня были в 1 коммутаторе, а затем были разные схемы для авторизованных маршрутов.
export default function App() {
return (
<BrowserRouter>
<Switch>
{pages.map(
(
{
exact,
path,
component: Component,
layout: Layout,
requiredPermissions
},
index
) => (
<Route
key={index}
exact={exact}
path={path}
render={props => (
<Layout requiredPermissions={requiredPermissions}>
<Component {...props} />
</Layout>
)}
/>
)
)}
<Route component={NotFound} />
</Switch>
</BrowserRouter>
);
}
Каждая страница может быть определена так:
export const pages = [
// Public pages
{
exact: true,
path: routes.login,
component: LoginPage,
layout: PublicLayout,
requiredPermissions: []
},
// Authenticated pages
{
exact: true,
path: routes.dashboard,
component: Dashboard,
layout: AuthedLayout,
requiredPermissions: []
},
...
Обработка токенов будет выполняться в «AuthedLayout»:
export default function AuthedLayout(props) {
const { loading, token, name, refreshError } = useCheckAccessToken();
const userPermissions = GetUserPermissions(token);
return !refreshError ? (
<Fragment>
<LoadingOverlay loadingStatus={loading} />
<NavBar name={name} />
<props.children.type token={token} userPermissions={userPermissions} />
</Fragment>
) : !(!loading && token && name && !refreshError) ? (
<Redirect to="/login" />
) : (
"Unhandled Exception."
);
}
Надеюсь, что это кому-то помогло.