App.tsx 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import { ThemeProvider } from "@/context/ThemeProvider";
  2. import { BrowserRouter as Router } from "react-router-dom";
  3. import { RoutesComponent } from "@/router";
  4. import { Toaster } from "@/components/ui/sonner";
  5. import { LoadingSpinner } from "@/components/ui/loaderComponent";
  6. import { OrderStateProvider } from "./context/OrderContext";
  7. import { useNotifications } from "./hooks/useNotifications";
  8. import { useJsApiLoader } from "@react-google-maps/api";
  9. import { KeycloakProvider } from "./hooks/useKeycloak";
  10. const NotificationListener = () => {
  11. useNotifications();
  12. return null;
  13. };
  14. const App = () => {
  15. const { isLoaded, loadError } = useJsApiLoader({
  16. id: "google-map-script",
  17. googleMapsApiKey: import.meta.env.VITE_GOOGLE_MAPS_API_KEY,
  18. });
  19. if (loadError) {
  20. console.error("Google Maps load error:", loadError);
  21. }
  22. if (!isLoaded) {
  23. return (
  24. <div className="flex h-screen items-center justify-center">
  25. <LoadingSpinner />
  26. </div>
  27. );
  28. }
  29. return (
  30. <ThemeProvider defaultTheme="system" storageKey="vite-ui-theme">
  31. <OrderStateProvider>
  32. <Router>
  33. <KeycloakProvider>
  34. <NotificationListener />
  35. <LoadingSpinner />
  36. <RoutesComponent />
  37. <Toaster />
  38. </KeycloakProvider>
  39. </Router>
  40. </OrderStateProvider>
  41. </ThemeProvider>
  42. );
  43. };
  44. export default App;