1- import React , { useContext , useEffect } from 'react' ;
1+ import React , { useContext , useEffect , useMemo } from 'react' ;
22import {
3- BrowserRouter
3+ createBrowserRouter , RouteObject , RouterProvider
44} from 'react-router' ;
55import { Amplify } from 'aws-amplify' ;
66import { ClassPrefix } from '@carbon/react' ;
@@ -11,11 +11,19 @@ import awsconfig from './aws-exports';
1111import prefix from './styles/classPrefix' ;
1212import './styles/custom.scss' ;
1313import 'react-toastify/dist/ReactToastify.css' ;
14+
15+ import Layout from './layout/PrivateLayout' ;
16+ import Landing from './views/Landing' ;
17+ import FourOhFour from './views/ErrorViews/FourOhFour' ;
18+ import LoginOrgSelection from './views/LoginOrgSelection' ;
19+ import ServiceStatus from './views/ServiceStatus' ;
1420import { NavigateProvider } from './contexts/NavigationContext' ;
1521import AuthContext from './contexts/AuthContext' ;
22+ import BrowserRoutes from './routes' ;
23+ import ROUTES from './routes/constants' ;
24+ import ProtectedRoute from './routes/ProtectedRoute' ;
1625import { ThemePreference } from './utils/ThemePreference' ;
1726import CustomQueryProvider from './components/CustomQueryProvider' ;
18- import AppRoutes from './AppRoutes' ;
1927
2028Amplify . configure ( awsconfig ) ;
2129
@@ -25,25 +33,82 @@ Amplify.configure(awsconfig);
2533 * @returns {JSX.Element } instance of the app ready to use.
2634 */
2735const App : React . FC = ( ) => {
28- const { isCurrentAuthUser } = useContext ( AuthContext ) ;
36+ const { signed , isCurrentAuthUser, selectedClientRoles } = useContext ( AuthContext ) ;
2937
3038 useEffect ( ( ) => {
3139 isCurrentAuthUser ( window . location . pathname ) ;
3240 } , [ ] ) ;
3341
42+ const roleSelectionRoutes : RouteObject [ ] = [
43+ {
44+ path : ROUTES . ALL_ROUTES ,
45+ element : < LoginOrgSelection />
46+ }
47+ ] ;
48+
49+ const signedRoutes : RouteObject [ ] = [
50+ {
51+ path : ROUTES . ROOT ,
52+ element : < ProtectedRoute /> ,
53+ children : [
54+ {
55+ element : < Layout /> ,
56+ children : BrowserRoutes
57+ }
58+ ]
59+ } ,
60+ {
61+ path : ROUTES . FOUR_OH_FOUR ,
62+ element : < FourOhFour />
63+ } ,
64+ {
65+ path : ROUTES . ALL_ROUTES ,
66+ element : < FourOhFour />
67+ }
68+ ] ;
69+
70+ const notSignedRoutes : RouteObject [ ] = [
71+ {
72+ path : ROUTES . ALL_ROUTES ,
73+ element : < Landing />
74+ }
75+ ] ;
76+
77+ const sharedRoutes : RouteObject [ ] = [
78+ {
79+ path : ROUTES . SERVICE_STATUS ,
80+ element : < ServiceStatus />
81+ }
82+ ] ;
83+
84+ const browserRouter = useMemo ( ( ) => {
85+ const selectBrowserRoutes = ( ) => {
86+ if ( ! signed ) {
87+ return notSignedRoutes ;
88+ }
89+ if ( selectedClientRoles ) {
90+ return signedRoutes ;
91+ }
92+ return roleSelectionRoutes ;
93+ } ;
94+
95+ const selectedRoutes = selectBrowserRoutes ( ) ;
96+ selectedRoutes . push ( ...sharedRoutes ) ;
97+
98+ return createBrowserRouter ( selectedRoutes ) ;
99+ } , [ signed , selectedClientRoles ] ) ;
100+
101+ const handleRedirectTo403 = ( ) => {
102+ browserRouter . navigate ( '/403' ) ;
103+ } ;
104+
34105 return (
35106 < ClassPrefix prefix = { prefix } >
36107 < ThemePreference >
37- < NavigateProvider onRedirect = { ( ) => {
38- // go to 403 page
39- window . location . href = '/403' ;
40- } }
41- >
108+ < NavigateProvider onRedirect = { handleRedirectTo403 } >
42109 < CustomQueryProvider >
43110 < ToastContainer />
44- < BrowserRouter >
45- < AppRoutes />
46- </ BrowserRouter >
111+ < RouterProvider router = { browserRouter } />
47112 < ReactQueryDevtools initialIsOpen = { false } />
48113 </ CustomQueryProvider >
49114 </ NavigateProvider >
0 commit comments