@@ -4,10 +4,11 @@ import { Redirect, BrowserRouter as PathRouter, HashRouter } from 'react-router-
44import { store } from '@/store/store'
55import { ErrorPage } from '@/components/pages/error'
66import { RouteLayout } from '@/components/basic/route-layout'
7+ import React from 'react'
78
89type RouteType = 'hash' | 'path'
910
10- interface RouteParameters {
11+ export interface RouteDescription {
1112 component : React . FC
1213 route : string
1314 redirection : string
@@ -23,46 +24,48 @@ const getRouters = () => ({
2324 Path : PathRouter ,
2425} )
2526
26- const createRoute = ( { component, route, redirection, dependencies } : RouteParameters ) => {
27- const mustRedirect = ( ) =>
28- ! ( dependencies
29- ? Object . keys ( dependencies ) . reduce ( ( previous , current ) => {
27+ const createRoute = ( route : RouteDescription ) => {
28+ // Checks if all dependencies are fulfilled to render a route
29+ const mustRedirect = ( mustRedirectRoute : RouteDescription ) =>
30+ ! ( mustRedirectRoute . dependencies
31+ ? Object . keys ( mustRedirectRoute . dependencies ) . reduce ( ( previous , current ) => {
3032 if ( previous === false ) {
3133 return false
3234 }
3335 const dependencyValue = get ( store . getState ( ) , current )
34- const dependencyComparison = dependencies [ current ]
35-
36- // Dependency can be checked by its value or by validator function
36+ const dependencyComparison = mustRedirectRoute . dependencies [ current ]
3737 return typeof dependencyComparison === 'function' ? ! ! dependencyComparison ( dependencyValue ) : dependencyValue === dependencyComparison
3838 } , true )
3939 : true )
4040
41- // Decide what component to return
42- const renderFunction = ( ) => {
43- const Component = component
44- const redirect = mustRedirect ( )
45- if ( redirect && ! ! redirection ) {
46- return < Redirect to = { redirection } />
47- }
48- if ( redirect && ! redirection ) {
49- return < ErrorPage />
41+ // Renders route or its replacement/proxy
42+ const createRender = ( renderRoute : RouteDescription ) : React . FC =>
43+ function render ( ) {
44+ const Component : React . FC = renderRoute . component
45+ const redirect = mustRedirect ( renderRoute )
46+ if ( redirect && ! ! renderRoute . redirection ) {
47+ return < Redirect to = { renderRoute . redirection } />
48+ }
49+ if ( redirect && ! renderRoute . redirection ) {
50+ return < ErrorPage />
51+ }
52+ return (
53+ < RouteLayout >
54+ < Component />
55+ </ RouteLayout >
56+ )
5057 }
51- return (
52- < RouteLayout >
53- < Component />
54- </ RouteLayout >
55- )
56- }
5758
5859 // A function that returns if a route can be displayed
59- const canRenderFunction = ( ) => ! mustRedirect ( )
60+ const createCanRender = ( canRenderRoute : RouteDescription ) => ( ) => ! mustRedirect ( canRenderRoute )
6061
6162 return {
62- route,
63- render : renderFunction ,
64- canRender : canRenderFunction ,
63+ route : route . route ,
64+ render : createRender ( route ) ,
65+ canRender : createCanRender ( route ) ,
6566 }
6667}
6768
68- export { getRouteType , getRouters , createRoute }
69+ const createRoutes = ( routes : RouteDescription [ ] ) => routes . map ( ( route ) => createRoute ( route ) )
70+
71+ export { getRouteType , getRouters , createRoutes }
0 commit comments