import React from 'react';
import { Switch, Route, Redirect } from 'react-router';
import { CSSTransitionGroup } from 'react-transition-group';
import WindowChrome from './components/WindowChrome';
import LoginPage from './containers/LoginPage';
import ConnectPage from './containers/ConnectPage';
import SettingsPage from './containers/SettingsPage';
import AccountPage from './containers/AccountPage';
import SelectLocationPage from './containers/SelectLocationPage';
import { getTransitionProps } from './transitions';
/**
* Create routes
*
* @export
* @param {function} getState - function to get redux state
* @param {object} componentProps - extra props to propagate across components
* @returns {React.element}
*/
export default function makeRoutes(getState, componentProps) {
/**
* Merge props and render component
* @param {React.Component} component - component class
* @param {...} rest - props
* @private
*/
const renderMergedProps = (component, ...rest) => {
const finalProps = Object.assign({}, componentProps, ...rest);
return (
React.createElement(component, finalProps)
);
};
/**
* Renders public route
* Example:
* @private
*/
const PublicRoute = ({ component, ...rest }) => {
return (
{
return renderMergedProps(component, routeProps, ...rest);
}} />
);
};
/**
* Renders protected route that requires authentication, otherwise redirects to /
* Example:
* @private
*/
const PrivateRoute = ({ component, ...rest }) => {
return (
{
const { account } = getState();
const isLoggedIn = account.status === 'ok';
if(isLoggedIn) {
return renderMergedProps(component, routeProps, ...rest);
} else {
return ();
}
}} />
);
};
/**
* Renders login route that is only available to non-authenticated
* users. Otherwise this route redirects user to /connect.
* Example:
* @private
*/
const LoginRoute = ({ component, ...rest }) => {
return (
{
const { account } = getState();
const isLoggedIn = account.status === 'ok';
if(isLoggedIn) {
return ();
} else {
return renderMergedProps(component, routeProps, ...rest);
}
}} />
);
};
// store previous route
let previousRoute;
return (
{
const toRoute = location.pathname;
const fromRoute = previousRoute;
const transitionProps = getTransitionProps(fromRoute, toRoute);
previousRoute = toRoute;
return (
);
}} />
);
}