From 0b35f11abf251b5f45bc7f7926275692cde69048 Mon Sep 17 00:00:00 2001 From: enes Date: Fri, 26 Jul 2024 13:15:14 +0200 Subject: [PATCH] feat: add children support to routes arrays --- src/App.tsx | 52 ++++++++++++------------------ src/pages/landing/LandingPage.tsx | 3 +- src/routes/index.tsx | 53 +++++++++++++++++++++++++++---- 3 files changed, 69 insertions(+), 39 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 8956df1..5755be7 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -7,7 +7,8 @@ import { appPrivateRoutes, appPublicRoutes, privateRoutes, - publicRoutes + publicRoutes, + recursiveRouteRenderer } from './routes' import { State } from './store/rootReducer' import { getNsecBunkerDelegatedKey, saveNsecBunkerDelegatedKey } from './utils' @@ -48,39 +49,28 @@ const App = () => { return `${appPublicRoutes.login}?callbackPath=${callbackPathEncoded}` } + const publicRoutesList = recursiveRouteRenderer({ + routes: publicRoutes, + renderConditionCallback: (r) => { + if (authState?.loggedIn) { + if (!r.hiddenWhenLoggedIn) { + return true + } + } else { + return true + } + + return false + } + }) + + const privateRouteList = recursiveRouteRenderer({ routes: privateRoutes }) + return ( }> - {authState?.loggedIn && - privateRoutes.map((route, index) => ( - - ))} - {publicRoutes.map((route, index) => { - if (authState?.loggedIn) { - if (!route.hiddenWhenLoggedIn) { - return ( - - ) - } - } else { - return ( - - ) - } - })} - + {authState?.loggedIn && privateRouteList} + {publicRoutesList} } /> diff --git a/src/pages/landing/LandingPage.tsx b/src/pages/landing/LandingPage.tsx index 2498bb3..ec0baba 100644 --- a/src/pages/landing/LandingPage.tsx +++ b/src/pages/landing/LandingPage.tsx @@ -8,7 +8,7 @@ import { } from '@mui/material' import { useEffect } from 'react' import { useSelector } from 'react-redux' -import { useLocation, useNavigate } from 'react-router-dom' +import { Outlet, useLocation, useNavigate } from 'react-router-dom' import { appPublicRoutes } from '../../routes' import { State } from '../../store/rootReducer' import { saveVisitedLink } from '../../utils' @@ -279,6 +279,7 @@ export const LandingPage = () => { )} */} + ) } diff --git a/src/routes/index.tsx b/src/routes/index.tsx index 9f12299..f7ff68a 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -10,6 +10,7 @@ import { RelaysPage } from '../pages/settings/relays' import { SignPage } from '../pages/sign' import { VerifyPage } from '../pages/verify' import { hexToNpub } from '../utils' +import { Route, RouteProps } from 'react-router-dom' export const appPrivateRoutes = { homePage: '/', @@ -35,16 +36,54 @@ export const getProfileRoute = (hexKey: string) => export const getProfileSettingsRoute = (hexKey: string) => appPrivateRoutes.profileSettings.replace(':npub', hexToNpub(hexKey)) -export const publicRoutes = [ +type CustomRouteProps = T & + Omit & { + children?: Array> + } + +interface CustomRoutes { + routes?: CustomRouteProps[] + renderConditionCallback?: (route: CustomRouteProps) => boolean +} + +type PublicRouteProps = CustomRouteProps<{ + hiddenWhenLoggedIn?: boolean +}> + +export function recursiveRouteRenderer({ + routes, + renderConditionCallback = () => true +}: CustomRoutes) { + if (!routes) return null + + return routes.map((route, index) => + renderConditionCallback(route) ? ( + + {recursiveRouteRenderer({ + routes: route.children, + renderConditionCallback + })} + + ) : null + ) +} + +export const publicRoutes: PublicRouteProps[] = [ { path: appPublicRoutes.landingPage, hiddenWhenLoggedIn: true, - element: - }, - { - path: appPublicRoutes.login, - hiddenWhenLoggedIn: true, - element: + element: , + children: [ + { + path: appPublicRoutes.login, + hiddenWhenLoggedIn: true, + element: + } + ] }, { path: appPublicRoutes.profile,