import { connect } from 'react-redux'; import { Redirect, Route, Switch } from 'react-router-dom'; import { RouteComponentProps } from 'react-router'; import ProtectedRoute from './common/ProtectedRoute/ProtectedRoute'; import LayoutPicker from './layout/LayoutPicker/LayoutPicker'; import { routes } from './menu/routes'; import styles from './styles.module.scss'; import IAuthStatus from '../interfaces/user'; import { useState, useEffect } from 'react'; import NotFound from './common/NotFound/NotFound'; import Feedback from './common/Feedback'; import useToast from '../hooks/useToast'; import SWRProvider from './providers/SWRProvider/SWRProvider'; import ConditionallyRender from './common/ConditionallyRender'; import EnvironmentSplash from './common/EnvironmentSplash/EnvironmentSplash'; import Loader from './common/Loader/Loader'; import useUser from '../hooks/api/getters/useUser/useUser'; interface IAppProps extends RouteComponentProps { user: IAuthStatus; fetchUiBootstrap: any; feedback: any; } const App = ({ location, user, fetchUiBootstrap }: IAppProps) => { const { toast, setToastData } = useToast(); // because we need the userId when the component load. const { splash, user: userFromUseUser } = useUser(); const [showSplash, setShowSplash] = useState(false); useEffect(() => { fetchUiBootstrap(); /* eslint-disable-next-line */ }, [user.authDetails?.type]); useEffect(() => { if (splash?.environment === undefined) return; if (!splash?.environment && !isUnauthorized()) { setShowSplash(true); } /* eslint-disable-next-line */ }, [splash.environment]); const renderMainLayoutRoutes = () => { return routes.filter(route => route.layout === 'main').map(renderRoute); }; const renderStandaloneRoutes = () => { return routes .filter(route => route.layout === 'standalone') .map(renderRoute); }; const isUnauthorized = () => { // authDetails only exists if the user is not logged in. //if (user?.permissions.length === 0) return true; return user?.authDetails !== undefined; }; // Change this to IRoute once snags with HashRouter and TS is worked out const renderRoute = (route: any) => { if (route.type === 'protected') { const unauthorized = isUnauthorized(); return ( ); } return ( ( )} /> ); }; return ( } elseShow={
} elseShow={ {renderMainLayoutRoutes()} {renderStandaloneRoutes()} } /> {toast}
} />
); }; // Set state to any for now, to avoid typing up entire state object while converting to tsx. const mapStateToProps = (state: any) => ({ user: state.user.toJS(), feedback: state.feedback, }); export default connect(mapStateToProps)(App);