Vulcan/packages/nova-lib/lib/routes.js

69 lines
1.9 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { Components, getComponent } from './components';
export const Routes = {}; // will be populated on startup (see nova:routing)
export const RoutesTable = {}; // storage for infos about routes themselves
/*
A route is defined in the list like:
RoutesTable.foobar = {
name: 'foobar',
path: '/xyz',
component: getComponent('FooBar')
componentName: 'FooBar' // optional
}
*/
export const addRoute = routeOrRouteArray => {
// be sure to have an array of routes to manipulate
const addedRoutes = Array.isArray(routeOrRouteArray) ? routeOrRouteArray : [routeOrRouteArray];
// modify the routes table with the new routes
addedRoutes.map(({name, path, ...properties}) => {
// check if there is already a route registered to this path
// note: destructure in order to get the first item of the array, as _.filter returns an array
const [routeWithSamePath] = _.filter(RoutesTable, route => route.path === path);
if (routeWithSamePath) {
// delete the route registered with same path
delete RoutesTable[routeWithSamePath.name];
}
// register the new route
RoutesTable[name] = {
name,
path,
...properties
};
});
}
export const getRoute = name => {
const routeDef = RoutesTable[name];
// components should be loaded by now (populateComponentsApp function), we can grab the component in the lookup table and assign it to the route
if (!routeDef.component && routeDef.componentName) {
routeDef.component = getComponent(routeDef.componentName);
}
return routeDef;
}
/**
* Populate the lookup table for routes to be callable
* Called once on app startup
**/
export const populateRoutesApp = () => {
// loop over each component in the list
Object.keys(RoutesTable).map(name => {
// populate an entry in the lookup table
Routes[name] = getRoute(name);
// uncomment for debug
// console.log('init route:', name);
});
}