@@ -151,7 +151,81 @@ export const logout = async (): Promise<boolean> => {
151151
152152## Redirect to login page
153153
154- Now, we will implement a redirect to login page on ` 401 ` Not Authorize responses:
154+ Create ` AuthRoute ` :
155+
156+ _ ./front/src/core/router/router.component.tsx_
157+
158+ ``` diff
159+ import React from 'react';
160+ import {
161+ HashRouter,
162+ Routes,
163+ Route,
164+ Navigate,
165+ + Outlet,
166+ } from 'react-router-dom';
167+ import { useApiConfig } from '#core/api';
168+ + import { AuthContext } from '#core/auth';
169+ import { LoginScene, ListScene } from '#scenes';
170+ - import { switchRoutes } from './routes';
171+ + import { switchRoutes, linkRoutes } from './routes';
172+
173+ export const RouterComponent: React.FC = () => {
174+ return (
175+ <HashRouter>
176+ <AppRoutes />
177+ </HashRouter>
178+ );
179+ };
180+
181+ + const PrivateRoutes = () => {
182+ + const { userSession } = React.useContext(AuthContext);
183+ + return userSession?.userName ? (
184+ + <Outlet />
185+ + ) : (
186+ + <Navigate to={linkRoutes.login} />
187+ + );
188+ + };
189+
190+ const AppRoutes: React.FC = () => {
191+ useApiConfig();
192+ return (
193+ <Routes>
194+ <Route path={switchRoutes.login} element={<LoginScene />} />
195+ + <Route element={<PrivateRoutes />}>
196+ + <Route path={switchRoutes.list} element={<ListScene />} />
197+ + </Route>
198+ <Route
199+ path={switchRoutes.root}
200+ element={<Navigate to={switchRoutes.login} />}
201+ />
202+ </Routes>
203+ );
204+ };
205+
206+ ```
207+
208+ > Try to navigate to /list without login.
209+
210+ Now, let's take the next scenario:
211+
212+ 1 . User logs in.
213+ 2 . Make some requests and use the app.
214+ 3 . User goes to sleep and the token expires, but the app is still open.
215+ 4 . User wakes up and tries to make a request.
216+ 5 . We will recieve a ` 401 ` response. But the app doesn't redirect to login page.
217+
218+ > Add comments to the ` PrivateRoutes ` code to explain the scenario.
219+
220+ _ ./front/src/core/router/router.component.tsx_
221+
222+ ``` jsx
223+ // <Route element={<PrivateRoutes />}>
224+ < Route path= {switchRoutes .list } element= {< ListScene / > } / >
225+ // </Route>
226+ ```
227+
228+ Let's do it:
155229
156230_ ./front/src/core/api/api.hooks.ts_
157231
@@ -222,62 +296,6 @@ const AppRoutes: React.FC = () => {
222296
223297> Try to fetch clients or orders without login.
224298
225- Create ` AuthRoute ` :
226-
227- _ ./front/src/core/router/router.component.tsx_
228-
229- ``` diff
230- import React from 'react';
231- import {
232- HashRouter,
233- Routes,
234- Route,
235- Navigate,
236- + Outlet,
237- } from 'react-router-dom';
238- import { useApiConfig } from '#core/api';
239- + import { AuthContext } from '#core/auth';
240- import { LoginScene, ListScene } from '#scenes';
241- - import { switchRoutes } from './routes';
242- + import { switchRoutes, linkRoutes } from './routes';
243-
244- export const RouterComponent: React.FC = () => {
245- return (
246- <HashRouter>
247- <AppRoutes />
248- </HashRouter>
249- );
250- };
251-
252- + const PrivateRoutes = () => {
253- + const { userSession } = React.useContext(AuthContext);
254- + return userSession?.userName ? (
255- + <Outlet />
256- + ) : (
257- + <Navigate to={linkRoutes.login} />
258- + );
259- + };
260-
261- const AppRoutes: React.FC = () => {
262- useApiConfig();
263- return (
264- <Routes>
265- <Route path={switchRoutes.login} element={<LoginScene />} />
266- + <Route element={<PrivateRoutes />}>
267- + <Route path={switchRoutes.list} element={<ListScene />} />
268- + </Route>
269- <Route
270- path={switchRoutes.root}
271- element={<Navigate to={switchRoutes.login} />}
272- />
273- </Routes>
274- );
275- };
276-
277- ```
278-
279- > Try to navigate to /list without login.
280-
281299# Using CORS
282300
283301Let's update example to check if it's working with cors:
0 commit comments