65 lines
2.0 KiB
JavaScript
65 lines
2.0 KiB
JavaScript
// project import
|
|
import Routes from 'routes';
|
|
import Locales from 'components/Locales';
|
|
import ScrollTop from 'components/ScrollTop';
|
|
import Notistack from 'components/third-party/Notistack';
|
|
import { useNavigate } from 'react-router';
|
|
import { useEffect } from 'react';
|
|
import { generateToken, initFirebaseNotificationListener } from 'firebase_notification/notification';
|
|
import InternetStatus from 'components/updateNetworkStatus';
|
|
import useInactivityLogout from 'hooks/useInactivityLogout';
|
|
|
|
// auth-provider
|
|
// import { JWTProvider as AuthProvider } from 'contexts/JWTContext';
|
|
|
|
// Defined at module scope, not inside App(), so it keeps a stable component
|
|
// identity across App re-renders — nesting it inside App() meant every App
|
|
// render created a brand-new AppContent function, which React treats as a
|
|
// different component type and remounts (dropping Routes/Snackbar state and
|
|
// re-running the FCM setup effect) on every re-render.
|
|
const AppContent = () => {
|
|
useInactivityLogout();
|
|
|
|
useEffect(() => {
|
|
generateToken();
|
|
const unsubscribe = initFirebaseNotificationListener();
|
|
return () => unsubscribe?.();
|
|
}, []);
|
|
|
|
// The old redux-driven MUI <Snackbar> used to mount here. Nothing ever
|
|
// dispatched `openSnackbar`, so it was permanently closed — every real toast
|
|
// goes through notistack (OpenToast / GlobalToast). Removed with MUI.
|
|
return <Routes />;
|
|
};
|
|
|
|
// ==============================|| APP - THEME, ROUTER, LOCAL ||============================== //
|
|
|
|
const App = () => {
|
|
const navigate = useNavigate();
|
|
useEffect(() => {
|
|
if (!localStorage.getItem('authname')) {
|
|
navigate('/login');
|
|
}
|
|
}, [navigate]);
|
|
|
|
return (
|
|
<>
|
|
<InternetStatus />
|
|
<Locales>
|
|
<ScrollTop>
|
|
{/* <AuthProvider> */}
|
|
<>
|
|
<Notistack>
|
|
{/* <Routes />
|
|
<Snackbar /> */}
|
|
<AppContent />
|
|
</Notistack>
|
|
</>
|
|
{/* </AuthProvider> */}
|
|
</ScrollTop>
|
|
</Locales>
|
|
</>
|
|
);
|
|
};
|
|
export default App;
|