veza/apps/web/src/app/App.tsx

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>
);
}