// 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 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 ; }; // ==============================|| APP - THEME, ROUTER, LOCAL ||============================== // const App = () => { const navigate = useNavigate(); useEffect(() => { if (!localStorage.getItem('authname')) { navigate('/login'); } }, [navigate]); return ( <> {/* */} <> {/* */} {/* */} ); }; export default App;