import { useEffect, lazy, Suspense } from 'react'; import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'; import { ToastContainer } from 'react-toastify'; import 'react-toastify/dist/ReactToastify.css'; import { GlobalLoadingProvider } from './contexts/GlobalLoadingContext'; import { CookieConsentProvider } from './contexts/CookieConsentContext'; import { CurrencyProvider } from './contexts/CurrencyContext'; import { CompanySettingsProvider } from './contexts/CompanySettingsContext'; import { AuthModalProvider } from './contexts/AuthModalContext'; import OfflineIndicator from './components/common/OfflineIndicator'; import CookieConsentBanner from './components/common/CookieConsentBanner'; import CookiePreferencesModal from './components/common/CookiePreferencesModal'; import AnalyticsLoader from './components/common/AnalyticsLoader'; import Loading from './components/common/Loading'; import ScrollToTop from './components/common/ScrollToTop'; import AuthModalManager from './components/modals/AuthModalManager'; import ResetPasswordRouteHandler from './components/ResetPasswordRouteHandler'; import useAuthStore from './store/useAuthStore'; import useFavoritesStore from './store/useFavoritesStore'; import { LayoutMain } from './components/layout'; import AdminLayout from './pages/AdminLayout'; import { ProtectedRoute, AdminRoute, StaffRoute, AccountantRoute, CustomerRoute } from './components/auth'; const HomePage = lazy(() => import('./pages/HomePage')); const DashboardPage = lazy(() => import('./pages/customer/DashboardPage')); const RoomListPage = lazy(() => import('./pages/customer/RoomListPage')); const RoomDetailPage = lazy(() => import('./pages/customer/RoomDetailPage')); const SearchResultsPage = lazy(() => import('./pages/customer/SearchResultsPage')); const FavoritesPage = lazy(() => import('./pages/customer/FavoritesPage')); const MyBookingsPage = lazy(() => import('./pages/customer/MyBookingsPage')); const BookingSuccessPage = lazy(() => import('./pages/customer/BookingSuccessPage') as Promise<{ default: React.ComponentType }>); const BookingDetailPage = lazy(() => import('./pages/customer/BookingDetailPage')); const FullPaymentPage = lazy(() => import('./pages/customer/FullPaymentPage')); const PaymentConfirmationPage = lazy(() => import('./pages/customer/PaymentConfirmationPage')); const PaymentResultPage = lazy(() => import('./pages/customer/PaymentResultPage')); const PayPalReturnPage = lazy(() => import('./pages/customer/PayPalReturnPage')); const PayPalCancelPage = lazy(() => import('./pages/customer/PayPalCancelPage')); const InvoicePage = lazy(() => import('./pages/customer/InvoicePage')); const ProfilePage = lazy(() => import('./pages/customer/ProfilePage')); const LoyaltyPage = lazy(() => import('./pages/customer/LoyaltyPage')); const AboutPage = lazy(() => import('./pages/AboutPage')); const ContactPage = lazy(() => import('./pages/ContactPage')); const PrivacyPolicyPage = lazy(() => import('./pages/PrivacyPolicyPage')); const TermsPage = lazy(() => import('./pages/TermsPage')); const RefundsPolicyPage = lazy(() => import('./pages/RefundsPolicyPage')); const CancellationPolicyPage = lazy(() => import('./pages/CancellationPolicyPage')); const AccessibilityPage = lazy(() => import('./pages/AccessibilityPage')); const FAQPage = lazy(() => import('./pages/FAQPage')); const AdminDashboardPage = lazy(() => import('./pages/admin/DashboardPage')); const InvoiceManagementPage = lazy(() => import('./pages/admin/InvoiceManagementPage')); const PaymentManagementPage = lazy(() => import('./pages/admin/PaymentManagementPage')); const UserManagementPage = lazy(() => import('./pages/admin/UserManagementPage')); const GuestProfilePage = lazy(() => import('./pages/admin/GuestProfilePage')); const BookingManagementPage = lazy(() => import('./pages/admin/BookingManagementPage')); const PageContentDashboardPage = lazy(() => import('./pages/admin/PageContentDashboard')); const AnalyticsDashboardPage = lazy(() => import('./pages/admin/AnalyticsDashboardPage')); const BusinessDashboardPage = lazy(() => import('./pages/admin/BusinessDashboardPage')); const SettingsPage = lazy(() => import('./pages/admin/SettingsPage')); const ReceptionDashboardPage = lazy(() => import('./pages/admin/ReceptionDashboardPage')); const LoyaltyManagementPage = lazy(() => import('./pages/admin/LoyaltyManagementPage')); const StaffDashboardPage = lazy(() => import('./pages/staff/DashboardPage')); const ChatManagementPage = lazy(() => import('./pages/staff/ChatManagementPage')); const StaffLayout = lazy(() => import('./pages/StaffLayout')); const AccountantDashboardPage = lazy(() => import('./pages/accountant/DashboardPage')); const AccountantLayout = lazy(() => import('./pages/AccountantLayout')); const NotFoundPage = lazy(() => import('./pages/NotFoundPage')); function App() { const { isAuthenticated, userInfo, logout, initializeAuth } = useAuthStore(); const { fetchFavorites, syncGuestFavorites, loadGuestFavorites, } = useFavoritesStore(); useEffect(() => { initializeAuth(); }, [initializeAuth]); useEffect(() => { if (isAuthenticated) { syncGuestFavorites().then(() => { fetchFavorites(); }); } else { loadGuestFavorites(); } }, [ isAuthenticated, fetchFavorites, syncGuestFavorites, loadGuestFavorites, ]); const handleLogout = async () => { await logout(); }; return ( }> {} } > } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> {} } /> } /> } /> } /> } /> } /> } /> } /> {} } /> {} } > } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> {} } > } /> } /> } /> } /> } /> } /> } /> } /> } /> {/* Accountant Routes */} } > } /> } /> } /> } /> } /> {} } /> ); } export default App;