import React, { Suspense } from 'react'; import { createBrowserRouter, RouterProvider } from 'react-router-dom'; import { AppShell } from '@/components/layout/AppShell'; import { ProtectedRoute } from './ProtectedRoute'; import { LoginPage } from '@/pages/Login'; import { PasswordResetRequestPage } from '@/pages/PasswordResetRequest'; import { PasswordResetConfirmPage } from '@/pages/PasswordResetConfirm'; import { Loader2 } from 'lucide-react'; import { PluginRouteRenderer } from '@/components/plugins/PluginRouteRenderer'; // Lazy-loaded pages (code-splitting) const DashboardPage = React.lazy(() => import('@/pages/Dashboard').then(m => ({ default: m.DashboardPage }))); const ContactsListPage = React.lazy(() => import('@/pages/ContactsList').then(m => ({ default: m.ContactsListPage }))); const ContactDetailPage = React.lazy(() => import('@/pages/ContactDetailPage').then(m => ({ default: m.ContactDetailPage }))); const AuditLogPage = React.lazy(() => import('@/pages/AuditLog').then(m => ({ default: m.AuditLogPage }))); const GlobalSearchResultsPage = React.lazy(() => import('@/pages/GlobalSearchResults').then(m => ({ default: m.GlobalSearchResultsPage }))); const SettingsPage = React.lazy(() => import('@/pages/Settings').then(m => ({ default: m.SettingsPage }))); const SettingsProfilePage = React.lazy(() => import('@/pages/SettingsProfile').then(m => ({ default: m.SettingsProfilePage }))); const SettingsRolesPage = React.lazy(() => import('@/pages/SettingsRoles').then(m => ({ default: m.SettingsRolesPage }))); const SettingsUsersPage = React.lazy(() => import('@/pages/SettingsUsers').then(m => ({ default: m.SettingsUsersPage }))); const SettingsGroupsPage = React.lazy(() => import('@/pages/SettingsGroups').then(m => ({ default: m.SettingsGroupsPage }))); const SettingsPluginsPage = React.lazy(() => import('@/pages/SettingsPlugins').then(m => ({ default: m.SettingsPluginsPage }))); const SettingsSystemPage = React.lazy(() => import('@/pages/SettingsSystem').then(m => ({ default: m.SettingsSystemPage }))); const SettingsCurrenciesPage = React.lazy(() => import('@/pages/SettingsCurrencies').then(m => ({ default: m.SettingsCurrenciesPage }))); const SettingsTaxesPage = React.lazy(() => import('@/pages/SettingsTaxes').then(m => ({ default: m.SettingsTaxesPage }))); const SettingsSequencesPage = React.lazy(() => import('@/pages/SettingsSequences').then(m => ({ default: m.SettingsSequencesPage }))); const CalendarPage = React.lazy(() => import('@/pages/Calendar').then(m => ({ default: m.CalendarPage }))); const CalendarKanbanPage = React.lazy(() => import('@/pages/CalendarKanban').then(m => ({ default: m.CalendarKanbanPage }))); const DmsPage = React.lazy(() => import('@/pages/Dms').then(m => ({ default: m.DmsPage }))); const DmsTrashPage = React.lazy(() => import('@/pages/DmsTrash').then(m => ({ default: m.DmsTrashPage }))); const MailPage = React.lazy(() => import('@/pages/Mail').then(m => ({ default: m.MailPage }))); const MailSettingsPage = React.lazy(() => import('@/pages/MailSettings').then(m => ({ default: m.MailSettingsPage }))); const SettingsNotificationsPage = React.lazy(() => import('@/pages/SettingsNotifications').then(m => ({ default: m.SettingsNotificationsPage }))); const AIAssistantPage = React.lazy(() => import('@/pages/AIAssistant').then(m => ({ default: m.AIAssistantPage }))); const AISettingsPage = React.lazy(() => import('@/pages/AISettings').then(m => ({ default: m.AISettingsPage }))); const ProactiveAISettings = React.lazy(() => import('@/pages/ProactiveAISettings').then(m => ({ default: m.ProactiveAISettings }))); const SettingsThemePage = React.lazy(() => import('@/pages/SettingsTheme').then(m => ({ default: m.SettingsThemePage }))); const SettingsMcpPage = React.lazy(() => import('@/pages/SettingsMcp').then(m => ({ default: m.SettingsMcpPage }))); const SettingsMenuOrderPage = React.lazy(() => import('@/pages/SettingsMenuOrder').then(m => ({ default: m.SettingsMenuOrderPage }))); const SettingsStammdatenPage = React.lazy(() => import('@/pages/SettingsStammdaten').then(m => ({ default: m.SettingsStammdatenPage }))); const SettingsUserManagementPage = React.lazy(() => import('@/pages/SettingsUserManagement').then(m => ({ default: m.SettingsUserManagementPage }))); const AutomationDashboardPage = React.lazy(() => import('@/pages/AutomationDashboard').then(m => ({ default: m.AutomationDashboardPage }))); const AgentDashboardPage = React.lazy(() => import('@/pages/AgentDashboard').then(m => ({ default: m.AgentDashboardPage }))); const AutomationSettingsPage = React.lazy(() => import('@/pages/AutomationSettings').then(m => ({ default: m.AutomationSettingsPage }))); const ReportsPage = React.lazy(() => import('@/pages/Reports').then(m => ({ default: m.ReportsPage }))); const TasksPage = React.lazy(() => import('@/pages/Tasks').then(m => ({ default: m.TasksPage }))); /** Centered spinner fallback for lazy-loaded routes */ function PageLoader() { return (
); } /** Wrap a lazy element in Suspense with PageLoader fallback */ function withSuspense(element: React.ReactElement) { return }>{element}; } const router = createBrowserRouter([ { path: '/login', element: , }, { path: '/password-reset', element: , }, { path: '/password-reset/confirm', element: , }, { element: ( ), children: [ { path: '/', element: withSuspense() }, { path: '/dashboard', element: withSuspense() }, { path: '/contacts', element: withSuspense() }, { path: '/contacts/:id', element: withSuspense() }, { path: '/audit-log', element: withSuspense() }, { path: '/search', element: withSuspense() }, { path: '/calendar', element: withSuspense() }, { path: '/calendar/kanban', element: withSuspense() }, { path: '/dms', element: withSuspense() }, { path: '/dms/trash', element: withSuspense() }, { path: '/mail', element: withSuspense() }, { path: '/mail/settings', element: withSuspense() }, { path: '/ai-assistant', element: withSuspense() }, { path: '/automation', element: withSuspense() }, { path: '/agents', element: withSuspense() }, { path: '/reports', element: withSuspense() }, { path: '/tasks', element: withSuspense() }, { path: '/profile', element: withSuspense() }, { path: '/settings', element: withSuspense(), children: [ { path: 'stammdaten', element: withSuspense() }, { path: 'user-management', element: withSuspense() }, { path: 'roles', element: withSuspense() }, { path: 'users', element: withSuspense() }, { path: 'groups', element: withSuspense() }, { path: 'plugins', element: withSuspense() }, { path: 'system', element: withSuspense() }, { path: 'currencies', element: withSuspense() }, { path: 'taxes', element: withSuspense() }, { path: 'sequences', element: withSuspense() }, { path: 'mail', element: withSuspense() }, { path: 'notifications', element: withSuspense() }, { path: 'ai', element: withSuspense() }, { path: 'ai-proactive', element: withSuspense() }, { path: 'theme', element: withSuspense() }, { path: 'automation', element: withSuspense() }, { path: 'mcp', element: withSuspense() }, { path: 'menu', element: withSuspense() }, { path: '*', element: }, ], }, { path: '*', element: }, ], }, ]); export function AppRouter() { return ; }