import React, { Children, cloneElement, createElement, SFC } from 'react'; import { Redirect, Route, Switch } from 'react-router-dom'; import WithPermissions from './auth/WithPermissions'; import { AdminChildren, CustomRoutes, CatchAllComponent, TitleComponent, DashboardComponent, } from './types'; interface Props { catchAll: CatchAllComponent; children: AdminChildren; customRoutes?: CustomRoutes; dashboard?: DashboardComponent; title?: TitleComponent; } const RoutesWithLayout: SFC = ({ catchAll, children, customRoutes, dashboard, title, }) => { const childrenAsArray = React.Children.toArray(children); const firstChild: React.ReactElement | null = childrenAsArray.length > 0 ? (childrenAsArray[0] as React.ReactElement) : null; return ( {customRoutes && customRoutes.map((route, key) => cloneElement(route, { key }))} {Children.map(children, (child: React.ReactElement) => ( cloneElement(child, { // The context prop instruct the Resource component to // render itself as a standard component context: 'route', ...props, }) } /> ))} {dashboard ? ( ( createElement(dashboard, props)} /> )} /> ) : firstChild ? ( } /> ) : null} createElement(catchAll, { title, }) } /> ); }; export default RoutesWithLayout;