57 lines
1.8 KiB
TypeScript
57 lines
1.8 KiB
TypeScript
import { useEffect } from 'react';
|
|
|
|
import { useAuthStore } from '@/stores/auth';
|
|
import { useUIStore } from '@/stores/ui';
|
|
import { ErrorBoundary } from '@/components/ErrorBoundary';
|
|
import { PWAInstallBanner } from '@/components/pwa/PWAInstallBanner';
|
|
import { ToastProvider } from '@/components/feedback/ToastProvider';
|
|
import { AppRouter } from '@/router';
|
|
import { csrfService } from '@/services/csrf';
|
|
|
|
export function App() {
|
|
const { refreshUser } = useAuthStore();
|
|
const { setTheme } = useUIStore();
|
|
|
|
// Initialiser l'application
|
|
useEffect(() => {
|
|
// Vérifier l'authentification au chargement
|
|
refreshUser();
|
|
|
|
// Récupérer le token CSRF si l'utilisateur est déjà authentifié
|
|
// (refreshUser() est asynchrone, donc on vérifie après un court délai)
|
|
const checkAndFetchCSRF = async () => {
|
|
// Attendre un peu pour que refreshUser() se termine
|
|
await new Promise(resolve => setTimeout(resolve, 100));
|
|
const { isAuthenticated } = useAuthStore.getState();
|
|
if (isAuthenticated) {
|
|
csrfService.refreshToken().catch((error) => {
|
|
console.warn('Failed to fetch CSRF token on app init:', error);
|
|
});
|
|
}
|
|
};
|
|
checkAndFetchCSRF();
|
|
|
|
// Appliquer le thème au chargement
|
|
const savedTheme = localStorage.getItem('ui-storage');
|
|
if (savedTheme) {
|
|
try {
|
|
const parsed = JSON.parse(savedTheme);
|
|
if (parsed.state?.theme) {
|
|
setTheme(parsed.state.theme);
|
|
}
|
|
} catch (error) {
|
|
console.error('Error parsing theme from localStorage:', error);
|
|
}
|
|
}
|
|
}, [refreshUser, setTheme]);
|
|
|
|
return (
|
|
<ErrorBoundary>
|
|
<ToastProvider>
|
|
<AppRouter />
|
|
{/* PWA Install Banner */}
|
|
<PWAInstallBanner />
|
|
</ToastProvider>
|
|
</ErrorBoundary>
|
|
);
|
|
}
|