lamassu-server/packages/admin-ui/src/routing/routes.jsx
2025-05-23 16:53:04 +01:00

127 lines
3.7 KiB
JavaScript

import Fade from '@mui/material/Fade'
import Slide from '@mui/material/Slide'
import * as R from 'ramda'
import React, { useContext } from 'react'
import { Redirect, Switch, useLocation } from 'wouter'
import Login from '../pages/Authentication/Login'
import Register from '../pages/Authentication/Register'
import Reset2FA from '../pages/Authentication/Reset2FA'
import ResetPassword from '../pages/Authentication/ResetPassword'
import AppContext from '../AppContext'
import Dashboard from '../pages/Dashboard'
import Machines from '../pages/Machines'
import PrivateRoute from './PrivateRoute'
import PublicRoute from './PublicRoute'
import getLamassuRoutes from './lamassu.routes'
const wrapperClasses = 'flex flex-1 flex-col h-full'
const tree = getLamassuRoutes()
const map = R.map(R.when(R.has('children'), R.prop('children')))
const mappedRoutes = R.compose(R.flatten, map)(tree)
const parentRoutes = R.filter(R.has('children'))(mappedRoutes).concat(
R.filter(R.has('children'))(tree),
)
const leafRoutes = R.compose(R.flatten, map)(mappedRoutes)
const flattened = R.concat(leafRoutes, parentRoutes)
const hasSidebar = route =>
R.any(r => r.route === route)(
R.compose(
R.flatten,
R.map(R.prop('children')),
R.filter(R.has('children')),
)(mappedRoutes),
)
const getParent = route =>
R.find(
R.propEq(
R.dropLast(
1,
R.dropLastWhile(x => x !== '/', route),
),
'route',
),
)(flattened)
const Routes = () => {
const [location] = useLocation()
const { userData } = useContext(AppContext)
const getFilteredRoutes = () => {
// return all to prevent the user from being stuck at a 404 page
if (!userData) return flattened
return flattened.filter(value => {
const keys = value.allowedRoles
return R.includes(userData.role, keys)
})
}
const Transition = history.state ? Slide : Fade
const transitionProps =
Transition === Slide
? {
direction:
R.findIndex(R.propEq(history.state.prev, 'route'))(leafRoutes) >
R.findIndex(R.propEq(location, 'route'))(leafRoutes)
? 'right'
: 'left',
}
: { timeout: 400 }
return (
<Switch>
<PrivateRoute exact path="/">
<Redirect to="/dashboard" />
</PrivateRoute>
<PrivateRoute path="/dashboard">
<Transition
className={wrapperClasses}
{...transitionProps}
in={true}
mountOnEnter
unmountOnExit>
<div className={wrapperClasses}>
<Dashboard />
</div>
</Transition>
</PrivateRoute>
<PrivateRoute path="/machines/:id">
<Machines />
</PrivateRoute>
<PublicRoute path="/register" component={Register} />
<PublicRoute path="/resetpassword" component={ResetPassword} />
<PublicRoute path="/reset2fa" component={Reset2FA} />
<PublicRoute path="/login" restricted component={Login} />
{getFilteredRoutes().map(({ route, component: Page, key }) => (
<PrivateRoute path={route} key={key}>
<Transition
className={wrapperClasses}
{...transitionProps}
in={
location === route ||
(route.includes(':') && location.startsWith(route.split(':')[0]))
}
mountOnEnter
unmountOnExit>
<div className={wrapperClasses}>
<Page name={key} />
</div>
</Transition>
</PrivateRoute>
))}
<PublicRoute path="/404" />
<PublicRoute path="*">
<Redirect to="/404" />
</PublicRoute>
</Switch>
)
}
export { tree, getParent, hasSidebar, Routes }