11import { useEffect } from "react" ;
22import {
33 BrowserRouter as Router ,
4- Redirect ,
4+ Navigate ,
55 Route ,
6- Switch ,
6+ Routes ,
77} from "react-router-dom" ;
8- import { useLoadCurrentUser , usePermissions } from "src/redux/auth" ;
98
109import { refreshCsrfToken } from "src/apiClient/client" ;
1110import BaseLayout from "src/components/BaseLayout" ;
@@ -17,6 +16,7 @@ import { MyOfficeHoursHistory } from "src/pages/OfficeHours/MyOfficeHoursHistory
1716import { OfficeHoursHistory } from "src/pages/OfficeHours/OfficeHoursHistory" ;
1817import { RequestDeskCreditPage } from "src/pages/OfficeHours/RequestDeskCreditPage" ;
1918import { ChangePassword } from "src/pages/People/PersonProfile/PersonChangePassword" ;
19+ import { useLoadCurrentUser , usePermissions } from "src/redux/auth" ;
2020
2121import { AllGearPage , GearItemPage } from "./pages/Gear" ;
2222import { AddNewGear } from "./pages/Gear/AddNewGear" ;
@@ -31,98 +31,100 @@ function App() {
3131 const { loggedIn, isLoading } = useLoadCurrentUser ( ) ;
3232 const { pathname, search } = window . location ;
3333 const { isApprover } = usePermissions ( ) ;
34+
3435 useEffect ( ( ) => {
3536 if ( loggedIn ) {
3637 // Pre-load CSRF token
3738 refreshCsrfToken ( ) ;
3839 }
3940 } , [ loggedIn ] ) ;
4041
42+ if ( isLoading ) {
43+ return null ;
44+ }
45+
46+ const publicRoutes = (
47+ < >
48+ < Route path = "/login" element = { < LoginPage /> } />
49+ < Route
50+ path = "/reset-password/request"
51+ element = { < RequestPasswordReset /> }
52+ />
53+ < Route
54+ path = "/reset-password/confirm"
55+ element = { < RequestPasswordConfirm /> }
56+ />
57+ </ >
58+ ) ;
59+
60+ // If not logged in and not loading, redirect to login
61+ if ( ! isLoading && ! loggedIn ) {
62+ return (
63+ < Router basename = "/" >
64+ < BaseLayout >
65+ < Routes >
66+ { publicRoutes }
67+ < Route
68+ path = "*"
69+ element = {
70+ < Navigate
71+ to = { {
72+ pathname : "/login" ,
73+ search : `redirectTo=${ encodeURIComponent (
74+ pathname + search ,
75+ ) } `,
76+ } }
77+ replace
78+ />
79+ }
80+ />
81+ </ Routes >
82+ </ BaseLayout >
83+ </ Router >
84+ ) ;
85+ }
86+
4187 return (
4288 < Router basename = "/" >
4389 < BaseLayout >
44- < Switch >
45- < Route path = "/login" >
46- < LoginPage />
47- </ Route >
48- < Route exact path = "/reset-password/request/" >
49- < RequestPasswordReset />
50- </ Route >
51- < Route exact path = "/reset-password/confirm/" >
52- < RequestPasswordConfirm />
53- </ Route >
54- < Route exact path = "/change-password/" >
55- < ChangePassword />
56- </ Route >
57- { ! isLoading && ! loggedIn && (
58- < Redirect
59- to = { {
60- pathname : "/login" ,
61- search : `redirectTo=${ encodeURIComponent ( pathname + search ) } ` ,
62- } }
63- />
64- ) }
65- < Route exact path = "/people" >
66- < PeoplePage />
67- </ Route >
68- < Route path = "/people/:personId" >
69- < PersonPage />
70- </ Route >
71- < Route exact path = "/add-person" >
72- < AddNewPerson />
73- </ Route >
74- < Route exact path = "/add-gear" >
75- < AddNewGear />
76- </ Route >
77- < Route exact path = "/gear" >
78- < AllGearPage />
79- </ Route >
80- < Route path = "/gear/:gearId" >
81- < GearItemPage />
82- </ Route >
83- < Route exact path = "/office-hours" >
84- < OfficeHoursPage />
85- </ Route >
86- < Route exact path = "/gear-inventory" >
87- < GearInventoryPage />
88- </ Route >
89- < Route exact path = "/approvals" >
90- < ApprovalsPage />
91- </ Route >
90+ < Routes >
91+ { publicRoutes }
92+
93+ < Route path = "/change-password" element = { < ChangePassword /> } />
94+
95+ < Route path = "/people" element = { < PeoplePage /> } />
96+ < Route path = "/people/:personId" element = { < PersonPage /> } />
97+ < Route path = "/add-person" element = { < AddNewPerson /> } />
98+
99+ < Route path = "/add-gear" element = { < AddNewGear /> } />
100+ < Route path = "/gear" element = { < AllGearPage /> } />
101+ < Route path = "/gear/:gearId" element = { < GearItemPage /> } />
102+
103+ < Route path = "/office-hours" element = { < OfficeHoursPage /> } />
104+ < Route path = "/gear-inventory" element = { < GearInventoryPage /> } />
105+ < Route path = "/approvals" element = { < ApprovalsPage /> } />
106+
92107 { isApprover && (
93- < Route exact path = "/add-approval" >
94- < AddNewApproval />
95- </ Route >
96- ) }
97- { loggedIn && (
98- < Route exact path = "/request-desk-credit" >
99- < RequestDeskCreditPage />
100- </ Route >
101- ) }
102- { loggedIn && (
103- < Route exact path = "/approve-desk-credit" >
104- < ApproveDeskCreditPage />
105- </ Route >
108+ < Route path = "/add-approval" element = { < AddNewApproval /> } />
106109 ) }
107- { loggedIn && (
108- < Route exact path = "/office-hours-history" >
109- < OfficeHoursHistory />
110- </ Route >
111- ) }
112- { loggedIn && (
113- < Route exact path = "/volunteer-history" >
114- < MyOfficeHoursHistory />
115- </ Route >
116- ) }
117- < Route exact path = "/" >
118- < Redirect to = "/people" />
119- </ Route >
120- { loggedIn && (
121- < Route path = "*" >
122- < Redirect to = "/people" />
123- </ Route >
124- ) }
125- </ Switch >
110+
111+ < Route
112+ path = "/request-desk-credit"
113+ element = { < RequestDeskCreditPage /> }
114+ />
115+ < Route
116+ path = "/approve-desk-credit"
117+ element = { < ApproveDeskCreditPage /> }
118+ />
119+ < Route
120+ path = "/office-hours-history"
121+ element = { < OfficeHoursHistory /> }
122+ />
123+ < Route path = "/volunteer-history" element = { < MyOfficeHoursHistory /> } />
124+
125+ < Route path = "/" element = { < Navigate to = "/people" replace /> } />
126+ < Route path = "*" element = { < Navigate to = "/people" replace /> } />
127+ </ Routes >
126128 </ BaseLayout >
127129 </ Router >
128130 ) ;
0 commit comments