import { Suspense, lazy, useEffect } from "react"; import { Route, Switch, useLocation } from "wouter"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { HelmetProvider } from "react-helmet-async"; import { preloadCriticalRoutes } from "./shared/utils/routePreloader"; import { trackFeature, trackSessionDepth, FEATURES } from "./utils/analytics"; // Core components that should load immediately import Header from "./shared/components/Header"; import Footer from "./shared/components/Footer"; import BottomNavigationBar from "./components/navigation/BottomNavigationBar"; import FeedbackWidget from "./components/feedback/FeedbackWidget"; import CustomerSupportChat from "./shared/components/CustomerSupportChat"; import WelcomeModal from "./components/onboarding/WelcomeModal"; import StreamlinedOnboarding from "./components/onboarding/StreamlinedOnboarding"; // Lazy load all route components for better performance const Home = lazy(() => import("./core/pages/home")); const Landing = lazy(() => import("./pages/Landing")); const AboutUs = lazy(() => import("./pages/about-us")); const Pricing = lazy(() => import("./core/pages/pricing")); const ComplexityDashboard = lazy( () => import("./modules/analytics/complexity-dashboard"), ); const EcoRecommendationEngine = lazy( () => import("./modules/sustainability/eco-recommendation-engine"), ); const CommunityKnowledgeSharing = lazy( () => import("./pages/community-knowledge-sharing"), ); const InteractivePestRiskAssessment = lazy( () => import("./pages/interactive-pest-risk-assessment"), ); const AIFeaturesHub = lazy(() => import("./modules/ai/ai-features-hub")); const AIPestDemo = lazy(() => import("./pages/ai-pest-demo")); const CRM = lazy(() => import("./core/pages/crm")); const PestControl = lazy(() => import("./core/pages/pest-control")); const ResidentialServices = lazy( () => import("./core/pages/residential-services"), ); const SpecialistServices = lazy(() => import("./pages/specialist-services")); const Quotation = lazy(() => import("./core/pages/quotation")); const Quote = lazy(() => import("./core/pages/quote")); const NotFound = lazy(() => import("./pages/not-found")); const BookDemo = lazy(() => import("./pages/book-demo")); const BackendAdmin = lazy(() => import("./core/pages/backend-admin")); const PricingAdmin = lazy(() => import("./pages/pricing-admin")); const UnifiedPerformanceDashboard = lazy( () => import("./pages/unified-performance-dashboard"), ); const AnalyticsDashboard = lazy( () => import("./modules/analytics/analytics-dashboard"), ); const SustainabilityImpactTracker = lazy( () => import("./modules/sustainability/sustainability-impact-tracker"), ); const SmartPestAlerts = lazy(() => import("./pages/smart-pest-alerts")); const GatedAIVoiceAssistant = lazy( () => import("./modules/ai/GatedAIVoiceAssistant"), ); const IoTPestSensors = lazy(() => import("./modules/iot/iot-pest-sensors")); const SustainabilityDashboard = lazy( () => import("./modules/sustainability/sustainability-dashboard"), ); const SeasonalPreventionCalendar = lazy( () => import("./pages/seasonal-prevention-calendar"), ); const PreventionCoach = lazy(() => import("./pages/prevention-coach")); const GatedARPestLens = lazy(() => import("./modules/ar-vr/GatedARPestLens")); const SmartTreatmentOptimizer = lazy( () => import("./pages/smart-treatment-optimizer"), ); const EnvironmentalRiskAssessment = lazy( () => import("./pages/environmental-risk-assessment"), ); const PestRiskQuiz = lazy(() => import("./pages/pest-risk-quiz")); const MobilePestScanner = lazy( () => import("./modules/ai/mobile-pest-scanner"), ); const CommercialSolutions = lazy( () => import("./core/pages/commercial-solutions"), ); const IndustrialSolutions = lazy(() => import("./pages/industrial-solutions")); const EmergencyPestControl = lazy( () => import("./pages/emergency-pest-control"), ); const HygieneServices = lazy(() => import("./pages/hygiene-services")); const AftercareServices = lazy(() => import("./pages/aftercare-services")); const IPMServices = lazy(() => import("./pages/ipm-services")); const AISolutionsPlatform = lazy(() => import("./pages/ai-solutions-platform")); const QualityAssurance = lazy(() => import("./pages/quality-assurance")); const PestProtectionPlans = lazy(() => import("./pages/pest-protection-plans")); const SpecialistQuote = lazy(() => import("./pages/specialist-quote")); const AIAssistant = lazy(() => import("./modules/ai/ai-assistant")); const AIDetectionChallengeLive = lazy( () => import("./modules/ai/ai-detection-challenge-live"), ); const AIPreventionSidekick = lazy( () => import("./modules/ai/ai-prevention-sidekick"), ); const ARPestIdentification = lazy( () => import("./modules/ar-vr/ar-pest-identification"), ); const PredictiveCalendar = lazy( () => import("./modules/analytics/predictive-calendar"), ); const FormsHub = lazy(() => import("./pages/forms-hub")); const WorkflowAdmin = lazy(() => import("./pages/workflow-admin")); const MarketingStrategy = lazy(() => import("./pages/marketing-strategy")); const MarketingCalendar = lazy(() => import("./pages/marketing-calendar")); const MarketingDashboard = lazy(() => import("./pages/marketing-dashboard")); const HighROICampaigns = lazy(() => import("./pages/high-roi-campaigns")); const NotificationPreferences = lazy( () => import("./pages/notification-preferences"), ); const Education = lazy(() => import("./pages/education")); const VREducation = lazy(() => import("./modules/ar-vr/vr-education")); const LearningAudit = lazy(() => import("./pages/learning-audit")); const PestLifecycleStorytelling = lazy( () => import("./pages/pest-lifecycle-storytelling"), ); const DownloadApp = lazy(() => import("./pages/DownloadApp")); const SeasonalForecast = lazy( () => import("./modules/analytics/seasonal-forecast"), ); const BugReport = lazy(() => import("./pages/bug-report")); const Checkout = lazy(() => import("./core/pages/checkout")); const PaymentSuccess = lazy(() => import("./core/pages/payment-success")); const PestLifecycleAnimations = lazy( () => import("./pages/pest-lifecycle-animations"), ); const QrServiceTracking = lazy(() => import("./pages/qr-service-tracking")); const SurveyReport = lazy(() => import("./pages/survey-report")); const TreatmentReport = lazy(() => import("./pages/treatment-report").then((module) => ({ default: (props: any) => ( ), })), ); const Contact = lazy(() => import("./core/pages/contact")); const Book = lazy(() => import("./core/pages/book")); const AdminCommandCenter = lazy( () => import("./core/pages/admin-command-center"), ); const KnowledgeBase = lazy(() => import("./pages/knowledge-base")); const SopManagement = lazy(() => import("./pages/sop-management")); const FieldTechnicianMobile = lazy( () => import("./pages/field-technician-mobile"), ); const SurveyReportV2 = lazy(() => import("./pages/survey-report-v2")); const CmsAdmin = lazy(() => import("./pages/cms-admin")); // New Admin Monitoring & Communication Pages const SystemLogsPage = lazy(() => import("./pages/admin/system-logs")); const PerformanceMetricsPage = lazy( () => import("./pages/admin/performance-metrics"), ); const DatabaseStatusPage = lazy(() => import("./pages/admin/database-status")); const CommunicationManagementPage = lazy( () => import("./pages/admin/communication-management"), ); const TechnicianAssessment = lazy( () => import("./pages/technician-assessment"), ); const FeatureIdeas = lazy(() => import("./pages/feature-ideas")); const EducationHub = lazy(() => import("./pages/education-hub")); const AssessmentSchedule = lazy(() => import("./pages/assessment-schedule")); const TermsOfService = lazy(() => import("./pages/terms-of-service")); const PrivacyPolicy = lazy(() => import("./pages/privacy-policy")); const SecurityPage = lazy(() => import("./pages/security")); const EnterprisePage = lazy(() => import("./pages/enterprise")); const FreeTrial = lazy(() => import("./pages/free-trial")); const SeasonalTrendsDashboard = lazy( () => import("./modules/analytics/seasonal-trends-dashboard"), ); const PestTrendsDashboard = lazy(() => import("./pages/pest-trends-dashboard")); const QuickBooks = lazy(() => import("./modules/integrations/quickbooks")); const WasteManagement = lazy(() => import("./pages/waste-management")); const HygieneAssessment = lazy(() => import("./pages/hygiene-assessment")); const ServiceCompletion = lazy(() => import("./pages/service-completion")); const CoshhDataSheets = lazy(() => import("./pages/coshh-data-sheets")); const DashboardRenderer = lazy(() => import("./components/dashboard/DashboardRenderer").then((module) => ({ default: module.DashboardRenderer, })), ); const ComplianceAudit = lazy(() => import("./pages/compliance-audit")); const TreatmentReports = lazy(() => import("./pages/treatment-reports")); const ServiceAgreements = lazy(() => import("./pages/service-agreements")); const CustomerFeedback = lazy(() => import("./pages/customer-feedback")); const CommandCenter = lazy(() => import("./pages/command-center")); const ProfilePage = lazy(() => import("./pages/profile")); const SettingsPage = lazy(() => import("./pages/settings")); const EcoWarriorBadges = lazy( () => import("./modules/sustainability/eco-warrior-badges"), ); const AccessControl = lazy(() => import("./pages/access-control")); const CustomerImportPage = lazy(() => import("./pages/customer-import")); const CookiePolicy = lazy(() => import("./pages/cookie-policy")); const Careers = lazy(() => import("./pages/careers")); const FeatureManagement = lazy(() => import("./pages/admin/FeatureManagement")); const Blog = lazy(() => import("./pages/blog")); const FAQ = lazy(() => import("./pages/faq")); const ServiceAreas = lazy(() => import("./pages/service-areas")); const CaseStudies = lazy(() => import("./pages/case-studies")); const Reviews = lazy(() => import("./pages/reviews")); const Sitemap = lazy(() => import("./pages/sitemap")); const TenderLibrary = lazy(() => import("./pages/TenderLibrary")); const ServiceManagement = lazy(() => import("./pages/ServiceManagement")); const RBACManagement = lazy(() => import("./pages/rbac-management")); const IpManagementDashboard = lazy( () => import("./pages/IpManagementDashboard"), ); // CRM Sub-pages const CRMCustomers = lazy(() => import("./pages/crm/customers")); const CRMSuppliers = lazy(() => import("./pages/crm/suppliers")); const CRMContacts = lazy(() => import("./pages/crm/contacts")); const CRMAddresses = lazy(() => import("./pages/crm/addresses")); const Login = lazy(() => import("./core/pages/login")); import SidebarNav from "./components/navigation/SidebarNav"; import CommandPalette from "./components/navigation/CommandPalette"; import { queryClient } from "./shared/utils/queryClient"; import { BrandingProvider, useBranding, } from "./shared/contexts/BrandingContext"; import { useAuth } from "./shared/hooks/useAuth"; import RouteProtection from "./components/RouteProtection"; import AuthGuard from "./components/AuthGuard"; import AdminRoute from "./components/AdminRoute"; import BrandSEOManager from "./shared/components/BrandSEOManager"; import { Toaster } from "./shared/components/ui/toaster"; // Enhanced loading and error handling components import PageLoader from "./shared/components/PageLoader"; import ErrorBoundary from "./shared/components/ErrorBoundary"; function AppLayout() { const { isAegis360, currentBrand } = useBranding(); const { isAuthenticated } = useAuth(); // Only render sidebar for authenticated Aegis360 users const shouldShowSidebar = isAegis360 && isAuthenticated && currentBrand; return (
{shouldShowSidebar && }
); } function LoginRedirect() { const [, setLocation] = useLocation(); useEffect(() => { setLocation("/login"); }, [setLocation]); return null; } function Router() { return ( }> {/* PROTECTED ADMIN/MANAGEMENT ROUTES - Require Authentication */} {/* PROTECTED CRM Sub-pages - Require Authentication */} {/* Marketing Strategy routes added here */} {/* Previously missing routes - Adding now */} {/* New Admin Monitoring & Communication Routes */} {/* New Legal/Business Pages */} {/* PROTECTED TENDER ROUTES - Require Authentication */} ); } function App() { // TASK 2: Session depth tracking with route navigation monitoring const [location] = useLocation(); useEffect(() => { preloadCriticalRoutes(); }, []); // TASK 2: Track feature access based on route navigation useEffect(() => { const routeToFeatureMap: Record = { "/dashboard": FEATURES.DASHBOARD, "/settings": FEATURES.SETTINGS, "/reports": FEATURES.REPORTS, "/treatment-reports": FEATURES.REPORTS, "/survey-report": FEATURES.REPORTS, "/crm": FEATURES.CRM, "/quote": FEATURES.QUOTES, "/quotation": FEATURES.QUOTES, "/book": FEATURES.APPOINTMENTS, "/analytics-dashboard": FEATURES.ANALYTICS, "/unified-performance-dashboard": FEATURES.ANALYTICS, "/seasonal-prevention-calendar": FEATURES.PREVENTION_CALENDAR, "/iot-pest-sensors": FEATURES.IOT_SENSORS, "/compliance-audit": FEATURES.COMPLIANCE, "/pricing-admin": FEATURES.PRICING_ADMIN, "/backend-admin": FEATURES.BACKEND_ADMIN, "/mobile-pest-scanner": FEATURES.MOBILE_SCANNER, "/ar-pest-identification": FEATURES.AR_PEST_LENS, }; const featureName = routeToFeatureMap[location]; if (featureName) { trackFeature(featureName); } // Track session depth on major navigation events if (location !== "/" && location !== "/landing") { trackSessionDepth(); } }, [location]); // TASK 2: Track session depth on page visibility change (user returns to tab) useEffect(() => { const handleVisibilityChange = () => { if (document.visibilityState === "visible") { trackSessionDepth(); } }; document.addEventListener("visibilitychange", handleVisibilityChange); return () => { document.removeEventListener("visibilitychange", handleVisibilityChange); }; }, []); // TASK 2: Track session depth before page unload useEffect(() => { const handleBeforeUnload = () => { trackSessionDepth(); }; window.addEventListener("beforeunload", handleBeforeUnload); return () => { window.removeEventListener("beforeunload", handleBeforeUnload); }; }, []); return (
); } export default App;