mirror of
https://github.com/pawelmalak/flame.git
synced 2026-02-28 01:13:11 +08:00
89 lines
2.4 KiB
TypeScript
89 lines
2.4 KiB
TypeScript
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<any>(getConfig());
|
|
|
|
// Validate token
|
|
if (localStorage.token) {
|
|
store.dispatch<any>(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);
|
|
}
|
|
}, [loading]);
|
|
|
|
return (
|
|
<>
|
|
<BrowserRouter>
|
|
<Switch>
|
|
<Route exact path="/" component={Home} />
|
|
<Route path="/settings" component={Settings} />
|
|
<Route path="/applications" component={Apps} />
|
|
<Route path="/bookmarks" component={Bookmarks} />
|
|
</Switch>
|
|
</BrowserRouter>
|
|
<NotificationCenter />
|
|
</>
|
|
);
|
|
};
|