import { useEffect } from 'react'; import { BrowserRouter, Route, Switch } from 'react-router-dom'; import 'external-svg-loader'; // Redux import { useDispatch, useSelector } from 'react-redux'; import { bindActionCreators } from 'redux'; import { autoLogin, getConfig } from './store/action-creators'; import { actionCreators, store } from './store'; import { State } from './store/reducers'; // Utils import { checkVersion, decodeToken } from './utility'; // Routes import { Home } from './components/Home/Home'; import { Apps } from './components/Apps/Apps'; import { Settings } from './components/Settings/Settings'; import { Bookmarks } from './components/Bookmarks/Bookmarks'; import { NotificationCenter } from './components/NotificationCenter/NotificationCenter'; // Get config store.dispatch(getConfig()); // Validate token if (localStorage.token) { store.dispatch(autoLogin()); } export const App = (): JSX.Element => { const { config, loading } = useSelector((state: State) => state.config); const dispath = useDispatch(); const { fetchQueries, setTheme, logout, createNotification } = bindActionCreators(actionCreators, dispath); useEffect(() => { // check if token is valid const tokenIsValid = setInterval(() => { if (localStorage.token) { const expiresIn = decodeToken(localStorage.token).exp * 1000; const now = new Date().getTime(); if (now > expiresIn) { logout(); createNotification({ title: 'Info', message: 'Session expired. You have been logged out', }); } } }, 1000); // set user theme if present if (localStorage.theme) { setTheme(localStorage.theme); } // check for updated checkVersion(); // load custom search queries fetchQueries(); return () => window.clearInterval(tokenIsValid); }, []); // If there is no user theme, set the default one useEffect(() => { if (!loading && !localStorage.theme) { setTheme(config.defaultTheme, false); } }, [loading]); return ( <> ); };