import { lazy, Suspense } from 'react'; import { Routes, Route, Navigate } from 'react-router-dom'; import { useAuthStore } from '@/stores/auth.store'; // Layouts - kept as static imports since they're used on every page import { AuthLayout } from '@/layouts/AuthLayout'; import { DashboardLayout } from '@/layouts/DashboardLayout'; // Loading fallback component function PageLoader() { return (
); } // Lazy loaded pages - Auth const LoginPage = lazy(() => import('@/pages/auth/LoginPage').then(m => ({ default: m.LoginPage }))); const RegisterPage = lazy(() => import('@/pages/auth/RegisterPage').then(m => ({ default: m.RegisterPage }))); const ForgotPasswordPage = lazy(() => import('@/pages/auth/ForgotPasswordPage').then(m => ({ default: m.ForgotPasswordPage }))); const OAuthCallbackPage = lazy(() => import('@/pages/auth/OAuthCallbackPage').then(m => ({ default: m.OAuthCallbackPage }))); // Lazy loaded pages - Dashboard const DashboardPage = lazy(() => import('@/pages/dashboard/DashboardPage').then(m => ({ default: m.DashboardPage }))); const BillingPage = lazy(() => import('@/pages/dashboard/BillingPage').then(m => ({ default: m.BillingPage }))); const UsersPage = lazy(() => import('@/pages/dashboard/UsersPage').then(m => ({ default: m.UsersPage }))); const AIPage = lazy(() => import('@/pages/dashboard/AIPage').then(m => ({ default: m.AIPage }))); const StoragePage = lazy(() => import('@/pages/dashboard/StoragePage').then(m => ({ default: m.StoragePage }))); const WebhooksPage = lazy(() => import('@/pages/dashboard/WebhooksPage').then(m => ({ default: m.WebhooksPage }))); const AuditLogsPage = lazy(() => import('@/pages/dashboard/AuditLogsPage').then(m => ({ default: m.AuditLogsPage }))); const FeatureFlagsPage = lazy(() => import('@/pages/dashboard/FeatureFlagsPage').then(m => ({ default: m.FeatureFlagsPage }))); // Lazy loaded pages - Sales const SalesPage = lazy(() => import('@/pages/dashboard/sales').then(m => ({ default: m.SalesPage }))); const LeadsPage = lazy(() => import('@/pages/dashboard/sales').then(m => ({ default: m.LeadsPage }))); const LeadDetailPage = lazy(() => import('@/pages/dashboard/sales').then(m => ({ default: m.LeadDetailPage }))); const OpportunitiesPage = lazy(() => import('@/pages/dashboard/sales').then(m => ({ default: m.OpportunitiesPage }))); const OpportunityDetailPage = lazy(() => import('@/pages/dashboard/sales').then(m => ({ default: m.OpportunityDetailPage }))); const ActivitiesPage = lazy(() => import('@/pages/dashboard/sales').then(m => ({ default: m.ActivitiesPage }))); // Lazy loaded pages - Commissions const CommissionsPage = lazy(() => import('@/pages/dashboard/commissions').then(m => ({ default: m.CommissionsPage }))); const SchemesPage = lazy(() => import('@/pages/dashboard/commissions').then(m => ({ default: m.SchemesPage }))); const EntriesPage = lazy(() => import('@/pages/dashboard/commissions').then(m => ({ default: m.EntriesPage }))); const PeriodsPage = lazy(() => import('@/pages/dashboard/commissions').then(m => ({ default: m.PeriodsPage }))); const MyEarningsPage = lazy(() => import('@/pages/dashboard/commissions').then(m => ({ default: m.MyEarningsPage }))); // Lazy loaded pages - Goals const GoalsPage = lazy(() => import('@/pages/dashboard/goals').then(m => ({ default: m.GoalsPage }))); const GoalDefinitionsPage = lazy(() => import('@/pages/dashboard/goals').then(m => ({ default: m.DefinitionsPage }))); const MyGoalsPage = lazy(() => import('@/pages/dashboard/goals').then(m => ({ default: m.MyGoalsPage }))); const GoalDetailPage = lazy(() => import('@/pages/dashboard/goals').then(m => ({ default: m.GoalDetailPage }))); const AssignmentDetailPage = lazy(() => import('@/pages/dashboard/goals').then(m => ({ default: m.AssignmentDetailPage }))); const GoalReportsPage = lazy(() => import('@/pages/dashboard/goals').then(m => ({ default: m.ReportsPage }))); // Lazy loaded pages - MLM const MLMPage = lazy(() => import('@/pages/dashboard/mlm').then(m => ({ default: m.MLMPage }))); const StructuresPage = lazy(() => import('@/pages/dashboard/mlm').then(m => ({ default: m.StructuresPage }))); const StructureDetailPage = lazy(() => import('@/pages/dashboard/mlm').then(m => ({ default: m.StructureDetailPage }))); const RanksPage = lazy(() => import('@/pages/dashboard/mlm').then(m => ({ default: m.RanksPage }))); const MyNetworkPage = lazy(() => import('@/pages/dashboard/mlm').then(m => ({ default: m.MyNetworkPage }))); const NodeDetailPage = lazy(() => import('@/pages/dashboard/mlm').then(m => ({ default: m.NodeDetailPage }))); const MLMMyEarningsPage = lazy(() => import('@/pages/dashboard/mlm').then(m => ({ default: m.MyEarningsPage }))); // Lazy loaded pages - Admin const WhatsAppSettings = lazy(() => import('@/pages/admin/WhatsAppSettings').then(m => ({ default: m.WhatsAppSettings }))); const AnalyticsDashboardPage = lazy(() => import('@/pages/admin/AnalyticsDashboardPage').then(m => ({ default: m.AnalyticsDashboardPage }))); // Lazy loaded pages - Settings const SettingsPage = lazy(() => import('@/pages/settings').then(m => ({ default: m.SettingsPage }))); // Lazy loaded pages - Superadmin const TenantsPage = lazy(() => import('@/pages/superadmin').then(m => ({ default: m.TenantsPage }))); const TenantDetailPage = lazy(() => import('@/pages/superadmin').then(m => ({ default: m.TenantDetailPage }))); const MetricsPage = lazy(() => import('@/pages/superadmin').then(m => ({ default: m.MetricsPage }))); // Lazy loaded pages - Onboarding const OnboardingPage = lazy(() => import('@/pages/onboarding').then(m => ({ default: m.OnboardingPage }))); // Protected Route wrapper function ProtectedRoute({ children }: { children: React.ReactNode }) { const isAuthenticated = useAuthStore((state) => state.isAuthenticated); if (!isAuthenticated) { return ; } return <>{children}; } // Superadmin Route wrapper (requires superadmin role) function SuperadminRoute({ children }: { children: React.ReactNode }) { const { isAuthenticated, user } = useAuthStore(); if (!isAuthenticated) { return ; } // Check if user has superadmin role // In a real app, this would check against the user's roles from the API if (user?.role !== 'superadmin') { return ; } return <>{children}; } // Guest Route wrapper (redirect to dashboard if already logged in) function GuestRoute({ children }: { children: React.ReactNode }) { const isAuthenticated = useAuthStore((state) => state.isAuthenticated); if (isAuthenticated) { return ; } return <>{children}; } // Suspense wrapper for lazy loaded pages function SuspensePage({ children }: { children: React.ReactNode }) { return }>{children}; } export function AppRouter() { return ( {/* Public routes */} } /> {/* Auth routes */} } > } /> } /> } /> {/* OAuth callback route - outside GuestRoute since user may be authenticated after callback */} } /> {/* Dashboard routes */} } > } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> {/* Sales routes */} } /> } /> } /> } /> } /> } /> {/* Commissions routes */} } /> } /> } /> } /> } /> {/* Goals routes */} } /> } /> } /> } /> } /> } /> {/* MLM routes */} } /> } /> } /> } /> } /> } /> } /> {/* Superadmin routes */} } > } /> } /> } /> } /> {/* Onboarding route */} } /> {/* 404 */} } /> ); }