diff --git a/src/common/routing/index.jsx b/src/common/routing/index.jsx index 39dfa1f0..ea183fd0 100644 --- a/src/common/routing/index.jsx +++ b/src/common/routing/index.jsx @@ -1,2 +1,92 @@ -export history from './history' -export {getSidebarRoutes, getRouterRoutes, getRoutes} from './routes' +// @flow +import React from 'react' +import {createBrowserHistory, createMemoryHistory} from 'history' +import {asyncComponent} from 'react-async-component' +import {Loader, Dimmer, Header, Icon} from 'semantic-ui-react' +import _ from 'lodash' +import Dashboard from 'containers/Dashboard' +import Links from 'containers/Links' + +function asyncComponentCreator (url) { + return asyncComponent({ + resolve: () => { + if (process.env.BROWSER) { + return require(`containers/${url}/index.jsx`).default + } + // flow-disable-next-line: The parameter passed to import() must be a literal string + return import(/* webpackChunkName:"[index].[request]" */ `containers/${url}/index.jsx`) + }, + LoadingComponent () { + return ( + + + Loading page... + + + ) + }, + ErrorComponent () { + return ( + +
+ + Refresh + Got error while loading page. +
+
+ ) + }, + autoResolveES2015Default: true, + env: process.env.BROWSER ? 'browser' : 'node', + serverMode: 'resolve' + }) +} + +function routingFnCreator (useFor) { + const [AsyncNotFound] = ['NotFound'].map(asyncComponentCreator) + // Dashboard and Links included in build + // NotFound(404) is lazy + const routes: any[] = [ + { + path: '/', + exact: true, + component: Dashboard, + name: 'Dashboard' + }, + { + path: '/links', + exact: true, + component: Links, + name: 'Links' + }, + { + component: AsyncNotFound, + name: '404' + } + ] + + const fns = { + // Returns routing for React-Router + routing () { + return routes + .map(a => + _.pick(a, ['path', 'strict', 'exact', 'component']) + ) + }, + // Returns `name` + `path`. used in Header + meta () { + return routes + .map(a => _.pick(a, ['path', 'name'])) + } + } + + return fns[useFor] +} + +const createRequiredHistory = process.env.BROWSER + ? createBrowserHistory + : createMemoryHistory + +export const getMetaRoutes = routingFnCreator('meta') +export const getRouterRoutes = routingFnCreator('routing') +export const history = createRequiredHistory() diff --git a/src/common/routing/routes.js b/src/common/routing/routes.js deleted file mode 100644 index 96649401..00000000 --- a/src/common/routing/routes.js +++ /dev/null @@ -1,130 +0,0 @@ -// @flow -import React from 'react' -import {Route, Redirect} from 'react-router-dom' -import RouteAuth from 'components/addons/RouteAuth' -import {asyncComponent} from 'react-async-component' -import {Loader, Dimmer, Header, Icon} from 'semantic-ui-react' -import _ from 'lodash' -import type {RouteItem} from 'types' - -function asyncComponentCreator (url) { - return asyncComponent({ - // flow-disable-next-line: The parameter passed to import() must be a literal string - resolve: () => import(/* webpackChunkName:"[index].[request]" */ `containers/${url}/index.jsx`), - LoadingComponent () { - return ( - - - Loading page... - - - ) - }, - ErrorComponent () { - return ( - -
- - Refresh - Got error while loading page. -
-
- ) - }, - autoResolveES2015Default: true, - env: process.env.BROWSER ? 'browser' : 'node', - serverMode: 'resolve' - }) -} - -function routingFnCreator (useFor: 'sidebar' | 'routing' | 'all' = 'all') { - const [AsyncDashoard, AsyncLinks, AsyncLogin, AsyncNotFound] = [ - 'Dashboard', - 'Links', - 'Login', - 'NotFound' - ].map(a => { - return asyncComponentCreator(a) - }) - - const routes: Array = [ - { - path: '/', - exact: true, - icon: 'newspaper', - name: 'Dashboard', - sidebarVisible: true, - tag: RouteAuth, - component: AsyncDashoard - }, - { - path: '/links', - name: 'Links', - exact: true, - icon: 'bookmark', - sidebarVisible: true, - tag: RouteAuth, - component: AsyncLinks - }, - { - external: true, - path: 'https://github.com/Metnew/react-semantic.ui-starter', - icon: 'github', - name: 'Github', - sidebarVisible: true - }, - { - path: '/auth', - name: 'Auth', - exact: true, - tag: Route, - component: AsyncLogin - }, - // Find the way to add/remove routes conditionally - { - name: '404', - tag: RouteAuth, - component: AsyncNotFound - }, - { - tag: Redirect, - to: '/auth' - } - ] - - const fns = { - // Returns routing for sidebar menu - sidebar (x: Array = routes) { - return x - .filter(a => a.sidebarVisible) - .map(a => - _.pick(a, ['path', 'name', 'icon', 'external', 'strict', 'exact']) - ) - }, - // Returns routing for React-Router - routing (x: Array = routes) { - return x - .filter(a => !!a.tag) - .map(a => - _.pick(a, [ - 'path', - 'name', - 'strict', - 'exact', - 'component', - 'tag', - 'to' - ]) - ) - }, - all () { - return routes - } - } - - return fns[useFor] -} - -export const getRoutes = routingFnCreator() -export const getSidebarRoutes = routingFnCreator('sidebar') -export const getRouterRoutes = routingFnCreator('routing')