Files
modeling-app/src/Router.tsx

93 lines
2.2 KiB
TypeScript
Raw Normal View History

2023-07-27 18:59:40 -04:00
import { App } from './App'
import {
createBrowserRouter,
Outlet,
redirect,
RouterProvider,
} from 'react-router-dom'
2023-07-27 18:59:40 -04:00
import { ErrorPage } from './components/ErrorPage'
import { Settings } from './routes/Settings'
import Onboarding, {
onboardingRoutes,
onboardingPaths,
} from './routes/Onboarding'
2023-07-27 18:59:40 -04:00
import SignIn from './routes/SignIn'
import { Auth } from './Auth'
const prependRoutes =
(routesObject: Record<string, string>) => (prepend: string) => {
return Object.fromEntries(
Object.entries(routesObject).map(([constName, path]) => [
constName,
prepend + path,
])
)
}
export const paths = {
INDEX: '/',
SETTINGS: '/settings',
SIGN_IN: '/signin',
ONBOARDING: prependRoutes(onboardingPaths)(
'/onboarding/'
) as typeof onboardingPaths,
}
2023-07-27 18:59:40 -04:00
const router = createBrowserRouter([
{
path: paths.INDEX,
2023-07-27 18:59:40 -04:00
element: (
<Auth>
<Outlet />
2023-07-27 18:59:40 -04:00
<App />
</Auth>
),
errorElement: <ErrorPage />,
loader: ({ request }) => {
2023-07-27 18:59:40 -04:00
const store = localStorage.getItem('store')
if (store === null) {
return redirect(paths.ONBOARDING.INDEX)
2023-07-27 18:59:40 -04:00
} else {
const status = JSON.parse(store).state.onboardingStatus || ''
const notEnRouteToOnboarding =
!request.url.includes(paths.ONBOARDING.INDEX) &&
request.method === 'GET'
// '' is the initial state, 'done' and 'dismissed' are the final states
const hasValidOnboardingStatus =
(status !== undefined && status.length === 0) ||
!(status === 'done' || status === 'dismissed')
const shouldRedirectToOnboarding =
notEnRouteToOnboarding && hasValidOnboardingStatus
if (shouldRedirectToOnboarding) {
return redirect(paths.ONBOARDING.INDEX + status)
2023-07-27 18:59:40 -04:00
}
}
return null
},
children: [
{
path: paths.SETTINGS,
element: <Settings />,
},
{
path: paths.ONBOARDING.INDEX,
element: <Onboarding />,
children: onboardingRoutes,
},
],
2023-07-27 18:59:40 -04:00
},
{
path: paths.SIGN_IN,
2023-07-27 18:59:40 -04:00
element: <SignIn />,
},
])
/**
* All routes in the app, used in src/index.tsx
* @returns RouterProvider
*/
export const Router = () => {
return <RouterProvider router={router} />
}