Files
Doormilexpress_console/src/App.js

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;