Architettura Frontend¶
Struttura Directory¶
frontend/src/
├── App.tsx ← Router principale, wrapper provider
├── main.tsx ← Entry point, monta i provider globali
├── pages/ ← Pagine (una cartella per area funzionale)
│ ├── auth/ ← Login, Reset Password, Setup Account
│ └── admin/ ← Pannello amministrazione
├── components/
│ ├── layout/ ← Shell, Sidebar, Header
│ ├── ui/ ← Componenti UI atomici
│ ├── admin/ ← Componenti pannello admin
│ ├── calendar/ ← Componenti calendario
│ ├── common/ ← Componenti trasversali
│ └── modals/ ← Modali riutilizzabili
├── contexts/ ← State globale via React Context
│ ├── AuthContext.tsx ← Utente autenticato, token, login/logout
│ ├── ThemeContext.tsx ← Tema chiaro/scuro
│ ├── NotificationContext.tsx ← Notifiche UI
│ ├── ModalContext.tsx ← Gestione modali globale
│ └── PrivacyContext.tsx ← Modalità privacy
├── services/ ← Chiamate API (un file per modulo)
├── locales/ ← Traduzioni i18n (italiano)
└── utils/ ← Utility pure
AuthContext¶
Gestisce lo stato di autenticazione globale dell'applicazione.
// Cosa espone
{
user: User | null,
isAuthenticated: boolean,
isLoading: boolean,
login(email, password): Promise<LoginResult>,
logout(): void,
checkAuth(): Promise<User | null>
}
Flusso di avvio:
- Al mount, controlla
localStorageper un token esistente - Se trovato → inietta in
axios.defaults.headerse chiamacheckAuth() checkAuth()chiamaGET /api/auth/profileper validare il token e caricare l'utente- Se il token non è valido →
logout()automatico
Gestione Token¶
// Salvataggio dopo login
localStorage.setItem('access_token', data.access_token);
axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
// Rimozione al logout
localStorage.removeItem('access_token');
delete axios.defaults.headers.common['Authorization'];
ProtectedRoute¶
Componente che avvolge le route che richiedono autenticazione. Reindirizza a /login se !isAuthenticated. Salva il path originale in sessionStorage per il redirect post-login.
AxiosInterceptor¶
Interceptor globale per le risposte HTTP:
- 401 → logout automatico + redirect a
/login - Altri errori → propagati al componente per gestione locale
Auto-Update¶
AutoUpdate.tsx controlla periodicamente version.json per rilevare nuove versioni deployate. Se rileva una nuova versione, notifica l'utente che può ricaricare la pagina.
Nginx è configurato per non caching di index.html e version.json — garanzia che l'utente veda sempre la versione più recente al ricaricamento.
Temi¶
ThemeContext gestisce tema chiaro/scuro con persistenza nelle preferenze utente.
Servizi API¶
Un file di servizio per ogni modulo in services/. Ogni servizio usa Axios (con il token già iniettato a livello globale) per comunicare con il backend su /api/.
Esempi: finance.service.ts, calendar.service.ts, entities.service.ts