Files
mockupAWS/frontend/src/App.tsx
T
Luca Sacchi Ricciardi 2c5d751f72 feat: implement user profile management (Fase 2)
- Add useProfile hook for managing user data
- Add Profile page to view/edit user information
- Add Settings layout with sidebar navigation
- Add Settings pages: Profile, Password, Notifications, Account
- Add user dropdown menu in Header with Profile/Settings links
- Add protected routes for /settings/* pages
- Implement profile update and password change functionality

Completes Fase 2 of frontend missing features analysis from todo.md
2026-04-08 13:12:57 +02:00

120 lines
5.4 KiB
TypeScript

import { Suspense, lazy } from 'react';
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom';
import { QueryProvider } from './providers/QueryProvider';
import { ThemeProvider } from './providers/ThemeProvider';
import { AuthProvider } from './contexts/AuthContext';
import { I18nProvider } from './providers/I18nProvider';
import { Toaster } from '@/components/ui/toaster';
import { Layout } from './components/layout/Layout';
import { ProtectedRoute } from './components/auth/ProtectedRoute';
import { PageLoader } from './components/ui/page-loader';
import { OnboardingProvider } from './components/onboarding/OnboardingProvider';
import { KeyboardShortcutsProvider } from './components/keyboard/KeyboardShortcutsProvider';
import { CommandPalette } from './components/command-palette/CommandPalette';
// Lazy load pages for code splitting
const Dashboard = lazy(() => import('./pages/Dashboard').then(m => ({ default: m.Dashboard })));
const ScenariosPage = lazy(() => import('./pages/ScenariosPage').then(m => ({ default: m.ScenariosPage })));
const ScenarioDetail = lazy(() => import('./pages/ScenarioDetail').then(m => ({ default: m.ScenarioDetail })));
const Compare = lazy(() => import('./pages/Compare').then(m => ({ default: m.Compare })));
const Reports = lazy(() => import('./pages/Reports').then(m => ({ default: m.Reports })));
const Login = lazy(() => import('./pages/Login').then(m => ({ default: m.Login })));
const Register = lazy(() => import('./pages/Register').then(m => ({ default: m.Register })));
const ForgotPassword = lazy(() => import('./pages/ForgotPassword').then(m => ({ default: m.ForgotPassword })));
const ResetPassword = lazy(() => import('./pages/ResetPassword').then(m => ({ default: m.ResetPassword })));
const SettingsLayout = lazy(() => import('./pages/settings/SettingsLayout').then(m => ({ default: m.SettingsLayout })));
const SettingsProfile = lazy(() => import('./pages/settings/SettingsProfile').then(m => ({ default: m.SettingsProfile })));
const SettingsPassword = lazy(() => import('./pages/settings/SettingsPassword').then(m => ({ default: m.SettingsPassword })));
const SettingsNotifications = lazy(() => import('./pages/settings/SettingsNotifications').then(m => ({ default: m.SettingsNotifications })));
const SettingsAccount = lazy(() => import('./pages/settings/SettingsAccount').then(m => ({ default: m.SettingsAccount })));
const ApiKeys = lazy(() => import('./pages/ApiKeys').then(m => ({ default: m.ApiKeys })));
const AnalyticsDashboard = lazy(() => import('./pages/AnalyticsDashboard').then(m => ({ default: m.AnalyticsDashboard })));
const NotFound = lazy(() => import('./pages/NotFound').then(m => ({ default: m.NotFound })));
// Wrapper for protected routes that need the main layout
function ProtectedLayout() {
return (
<ProtectedRoute>
<Layout />
</ProtectedRoute>
);
}
// Wrapper for routes with providers (outside Router)
function AppProviders({ children }: { children: React.ReactNode }) {
return (
<I18nProvider>
<ThemeProvider defaultTheme="system">
<QueryProvider>
<AuthProvider>
{children}
</AuthProvider>
</QueryProvider>
</ThemeProvider>
</I18nProvider>
);
}
// Wrapper for providers that need Router context
function RouterProviders({ children }: { children: React.ReactNode }) {
return (
<OnboardingProvider>
<KeyboardShortcutsProvider>
{children}
<CommandPalette />
</KeyboardShortcutsProvider>
</OnboardingProvider>
);
}
function App() {
return (
<AppProviders>
<BrowserRouter>
<RouterProviders>
<Suspense fallback={<PageLoader />}>
<Routes>
{/* Public routes */}
<Route path="/login" element={<Login />} />
<Route path="/register" element={<Register />} />
<Route path="/forgot-password" element={<ForgotPassword />} />
<Route path="/reset-password" element={<ResetPassword />} />
{/* Protected routes with layout */}
<Route path="/" element={<ProtectedLayout />}>
<Route index element={<Dashboard />} />
<Route path="scenarios" element={<ScenariosPage />} />
<Route path="scenarios/:id" element={<ScenarioDetail />} />
<Route path="scenarios/:id/reports" element={<Reports />} />
<Route path="compare" element={<Compare />} />
<Route
path="settings"
element={
<SettingsLayout>
<Routes>
<Route index element={<Navigate to="/settings/profile" replace />} />
<Route path="profile" element={<SettingsProfile />} />
<Route path="password" element={<SettingsPassword />} />
<Route path="notifications" element={<SettingsNotifications />} />
<Route path="account" element={<SettingsAccount />} />
<Route path="api-keys" element={<ApiKeys />} />
</Routes>
</SettingsLayout>
}
/>
<Route path="analytics" element={<AnalyticsDashboard />} />
</Route>
{/* 404 */}
<Route path="*" element={<NotFound />} />
</Routes>
</Suspense>
</RouterProviders>
<Toaster />
</BrowserRouter>
</AppProviders>
);
}
export default App;