import React, { FC, useEffect } from 'react' import { Route, Routes, useLocation } from 'react-router' //Redux import { useSelector, useDispatch } from 'react-redux' import { actionCreators as settingsActionCreators } from './store/reducers/Settings' // Components import { DynamicLayout } from './layouts' import { DynamicPage } from './pages' import { IReduxState, IRoute } from './interfaces' interface IRouteProp { path: string, element?: JSX.Element } const NestedRoutes = (routes: IRoute[], tag: string | undefined = undefined) => { if(!Array.isArray(routes)) return return routes.map((route: IRoute, index: number) => { const routeProps: IRouteProp = { path: route.path } if (route.component) { const page = routeProps.element = tag ? {page} : page } return {Array.isArray(route.childRoutes) ? NestedRoutes(route.childRoutes, tag) : ''} }) } const App: FC = () => { const { pathname } = useLocation() const dispatch = useDispatch() const { routes, adminRoutes, serviceRoutes } = useSelector((state: IReduxState) => state.settings) useEffect(() => { dispatch(settingsActionCreators.requestSettings()) }, []) useEffect(() => { window.scrollTo({ top: 0, behavior: 'smooth', }) }, [pathname]) return <> { NestedRoutes(routes, 'PublicLayout') } { NestedRoutes(adminRoutes, 'AdminLayout') } { NestedRoutes(serviceRoutes) } } export { App }