squiggle with signature-pad and smoother lines + blossom #258
@ -3,14 +3,13 @@ import { useAppSelector } from './hooks/store'
|
|||||||
import { Navigate, Route, Routes } from 'react-router-dom'
|
import { Navigate, Route, Routes } from 'react-router-dom'
|
||||||
import { AuthController } from './controllers'
|
import { AuthController } from './controllers'
|
||||||
import { MainLayout } from './layouts/Main'
|
import { MainLayout } from './layouts/Main'
|
||||||
|
import { appPrivateRoutes, appPublicRoutes } from './routes'
|
||||||
|
import './App.scss'
|
||||||
import {
|
import {
|
||||||
appPrivateRoutes,
|
|
||||||
appPublicRoutes,
|
|
||||||
privateRoutes,
|
privateRoutes,
|
||||||
publicRoutes,
|
publicRoutes,
|
||||||
recursiveRouteRenderer
|
recursiveRouteRenderer
|
||||||
} from './routes'
|
} from './routes/util'
|
||||||
import './App.scss'
|
|
||||||
|
|
||||||
const App = () => {
|
const App = () => {
|
||||||
const authState = useAppSelector((state) => state.auth)
|
const authState = useAppSelector((state) => state.auth)
|
||||||
|
@ -1,16 +1,4 @@
|
|||||||
import { CreatePage } from '../pages/create'
|
|
||||||
import { HomePage } from '../pages/home'
|
|
||||||
import { LandingPage } from '../pages/landing'
|
|
||||||
import { ProfilePage } from '../pages/profile'
|
|
||||||
import { SettingsPage } from '../pages/settings/Settings'
|
|
||||||
import { CacheSettingsPage } from '../pages/settings/cache'
|
|
||||||
import { NostrLoginPage } from '../pages/settings/nostrLogin'
|
|
||||||
import { ProfileSettingsPage } from '../pages/settings/profile'
|
|
||||||
import { RelaysPage } from '../pages/settings/relays'
|
|
||||||
import { SignPage } from '../pages/sign'
|
|
||||||
import { VerifyPage } from '../pages/verify'
|
|
||||||
import { hexToNpub } from '../utils'
|
import { hexToNpub } from '../utils'
|
||||||
import { Route, RouteProps } from 'react-router-dom'
|
|
||||||
|
|
||||||
export const appPrivateRoutes = {
|
export const appPrivateRoutes = {
|
||||||
homePage: '/',
|
homePage: '/',
|
||||||
@ -39,93 +27,3 @@ export const getProfileRoute = (hexKey: string) =>
|
|||||||
|
|
||||||
export const getProfileSettingsRoute = (hexKey: string) =>
|
export const getProfileSettingsRoute = (hexKey: string) =>
|
||||||
appPrivateRoutes.profileSettings.replace(':npub', hexToNpub(hexKey))
|
appPrivateRoutes.profileSettings.replace(':npub', hexToNpub(hexKey))
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper type allows for extending react-router-dom's **RouteProps** with generic type
|
|
||||||
*/
|
|
||||||
type CustomRouteProps<T> = T &
|
|
||||||
Omit<RouteProps, 'children'> & {
|
|
||||||
children?: Array<CustomRouteProps<T>>
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This function maps over nested routes with optional condition for rendering
|
|
||||||
* @param {CustomRouteProps<T>[]} routes - routes list
|
|
||||||
* @param {RenderConditionCallbackFn} renderConditionCallbackFn - render condition callback (default true)
|
|
||||||
*/
|
|
||||||
export function recursiveRouteRenderer<T>(
|
|
||||||
routes?: CustomRouteProps<T>[],
|
|
||||||
renderConditionCallbackFn: (route: CustomRouteProps<T>) => boolean = () =>
|
|
||||||
true
|
|
||||||
) {
|
|
||||||
if (!routes) return null
|
|
||||||
|
|
||||||
// Callback allows us to pass arbitrary conditions for each route's rendering
|
|
||||||
// Skipping the callback will by default evaluate to true (show route)
|
|
||||||
return routes.map((route, index) =>
|
|
||||||
renderConditionCallbackFn(route) ? (
|
|
||||||
<Route
|
|
||||||
key={`${route.path}${index}`}
|
|
||||||
path={route.path}
|
|
||||||
element={route.element}
|
|
||||||
>
|
|
||||||
{recursiveRouteRenderer(route.children, renderConditionCallbackFn)}
|
|
||||||
</Route>
|
|
||||||
) : null
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
type PublicRouteProps = CustomRouteProps<{
|
|
||||||
hiddenWhenLoggedIn?: boolean
|
|
||||||
}>
|
|
||||||
|
|
||||||
export const publicRoutes: PublicRouteProps[] = [
|
|
||||||
{
|
|
||||||
path: appPublicRoutes.landingPage,
|
|
||||||
hiddenWhenLoggedIn: true,
|
|
||||||
element: <LandingPage />
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: appPublicRoutes.profile,
|
|
||||||
element: <ProfilePage />
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: appPublicRoutes.verify,
|
|
||||||
element: <VerifyPage />
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
export const privateRoutes = [
|
|
||||||
{
|
|
||||||
path: appPrivateRoutes.homePage,
|
|
||||||
element: <HomePage />
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: appPrivateRoutes.create,
|
|
||||||
element: <CreatePage />
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: `${appPrivateRoutes.sign}/:id?`,
|
|
||||||
element: <SignPage />
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: appPrivateRoutes.settings,
|
|
||||||
element: <SettingsPage />
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: appPrivateRoutes.profileSettings,
|
|
||||||
element: <ProfileSettingsPage />
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: appPrivateRoutes.cacheSettings,
|
|
||||||
element: <CacheSettingsPage />
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: appPrivateRoutes.relays,
|
|
||||||
element: <RelaysPage />
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: appPrivateRoutes.nostrLogin,
|
|
||||||
element: <NostrLoginPage />
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
103
src/routes/util.tsx
Normal file
103
src/routes/util.tsx
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
import { Route, RouteProps } from 'react-router-dom'
|
||||||
|
import { appPrivateRoutes, appPublicRoutes } from '.'
|
||||||
|
import { CreatePage } from '../pages/create'
|
||||||
|
import { HomePage } from '../pages/home'
|
||||||
|
import { LandingPage } from '../pages/landing'
|
||||||
|
import { ProfilePage } from '../pages/profile'
|
||||||
|
import { CacheSettingsPage } from '../pages/settings/cache'
|
||||||
|
import { NostrLoginPage } from '../pages/settings/nostrLogin'
|
||||||
|
import { ProfileSettingsPage } from '../pages/settings/profile'
|
||||||
|
import { RelaysPage } from '../pages/settings/relays'
|
||||||
|
import { SettingsPage } from '../pages/settings/Settings'
|
||||||
|
import { SignPage } from '../pages/sign'
|
||||||
|
import { VerifyPage } from '../pages/verify'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper type allows for extending react-router-dom's **RouteProps** with generic type
|
||||||
|
*/
|
||||||
|
type CustomRouteProps<T> = T &
|
||||||
|
Omit<RouteProps, 'children'> & {
|
||||||
|
children?: Array<CustomRouteProps<T>>
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function maps over nested routes with optional condition for rendering
|
||||||
|
* @param {CustomRouteProps<T>[]} routes - routes list
|
||||||
|
* @param {RenderConditionCallbackFn} renderConditionCallbackFn - render condition callback (default true)
|
||||||
|
*/
|
||||||
|
export function recursiveRouteRenderer<T>(
|
||||||
|
routes?: CustomRouteProps<T>[],
|
||||||
|
renderConditionCallbackFn: (route: CustomRouteProps<T>) => boolean = () =>
|
||||||
|
true
|
||||||
|
) {
|
||||||
|
if (!routes) return null
|
||||||
|
|
||||||
|
// Callback allows us to pass arbitrary conditions for each route's rendering
|
||||||
|
// Skipping the callback will by default evaluate to true (show route)
|
||||||
|
return routes.map((route, index) =>
|
||||||
|
renderConditionCallbackFn(route) ? (
|
||||||
|
<Route
|
||||||
|
key={`${route.path}${index}`}
|
||||||
|
path={route.path}
|
||||||
|
element={route.element}
|
||||||
|
>
|
||||||
|
{recursiveRouteRenderer(route.children, renderConditionCallbackFn)}
|
||||||
|
</Route>
|
||||||
|
) : null
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
type PublicRouteProps = CustomRouteProps<{
|
||||||
|
hiddenWhenLoggedIn?: boolean
|
||||||
|
}>
|
||||||
|
|
||||||
|
export const publicRoutes: PublicRouteProps[] = [
|
||||||
|
{
|
||||||
|
path: appPublicRoutes.landingPage,
|
||||||
|
hiddenWhenLoggedIn: true,
|
||||||
|
element: <LandingPage />
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: appPublicRoutes.profile,
|
||||||
|
element: <ProfilePage />
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: appPublicRoutes.verify,
|
||||||
|
element: <VerifyPage />
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
export const privateRoutes = [
|
||||||
|
{
|
||||||
|
path: appPrivateRoutes.homePage,
|
||||||
|
element: <HomePage />
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: appPrivateRoutes.create,
|
||||||
|
element: <CreatePage />
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: `${appPrivateRoutes.sign}/:id?`,
|
||||||
|
element: <SignPage />
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: appPrivateRoutes.settings,
|
||||||
|
element: <SettingsPage />
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: appPrivateRoutes.profileSettings,
|
||||||
|
element: <ProfileSettingsPage />
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: appPrivateRoutes.cacheSettings,
|
||||||
|
element: <CacheSettingsPage />
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: appPrivateRoutes.relays,
|
||||||
|
element: <RelaysPage />
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: appPrivateRoutes.nostrLogin,
|
||||||
|
element: <NostrLoginPage />
|
||||||
|
}
|
||||||
|
]
|
Loading…
Reference in New Issue
Block a user