// React
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/Content'
// Components
import { DynamicLayout } from './layouts'
import { DynamicPage } from './pages'
import { IRouteModel } from './models'
import { ApplicationState } from './store'
interface IRouteProp {
path: string,
element?: JSX.Element
}
const NestedRoutes = (routes: IRouteModel[], tag: string | undefined = undefined) => {
if(!Array.isArray(routes)) return
return routes.map((route: IRouteModel, index: number) => {
const routeProps: IRouteProp = {
path: route.target
}
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 state = useSelector((state: ApplicationState) => state.content)
useEffect(() => {
dispatch(settingsActionCreators.requestContent())
}, [])
useEffect(() => {
window.scrollTo({
top: 0,
behavior: 'smooth',
})
}, [pathname])
return <>
{state?.routes ? NestedRoutes(state.routes, 'PublicLayout') : ''}
{state?.adminRoutes ? NestedRoutes(state.adminRoutes, 'AdminLayout') : ''}
{state?.serviceRoutes ? NestedRoutes(state.serviceRoutes) : ''}
>
}
export {
App
}