diff --git a/app/layout.tsx b/app/layout.tsx index 99ff85d..b802701 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,4 +1,5 @@ import type { Metadata, Viewport } from "next"; +import "leaflet/dist/leaflet.css"; import "./globals.css"; import { AuthProvider } from "@/components/AuthProvider"; import OfflineIndicator from "@/components/OfflineIndicator"; diff --git a/app/map/page.tsx b/app/map/page.tsx index 76629a6..ece9c48 100644 --- a/app/map/page.tsx +++ b/app/map/page.tsx @@ -1,6 +1,6 @@ 'use client'; -import { useState, useEffect, useCallback, Suspense } from 'react'; +import { useState, useEffect, useCallback, Suspense, Component } from 'react'; import { useRouter } from 'next/navigation'; import dynamic from 'next/dynamic'; import { OrderItem } from '@/lib/types'; @@ -23,6 +23,32 @@ const CollectionMap = dynamic(() => import('@/components/CollectionMap'), { ), }); +class MapErrorBoundary extends Component<{ children: React.ReactNode }, { hasError: boolean; error: string }> { + constructor(props: { children: React.ReactNode }) { + super(props); + this.state = { hasError: false, error: '' }; + } + static getDerivedStateFromError(error: Error) { + return { hasError: true, error: error.message }; + } + render() { + if (this.state.hasError) { + return ( +
+
+ +
+

Map failed to load.

+ +
+ ); + } + return this.props.children; + } +} + export default function MapPage() { const router = useRouter(); const { isLoggedIn, isLoading: authLoading } = useAuth(); @@ -131,7 +157,9 @@ export default function MapPage() {
}> - + + + )} diff --git a/components/CollectionMap.tsx b/components/CollectionMap.tsx index 5e01478..c580a60 100644 --- a/components/CollectionMap.tsx +++ b/components/CollectionMap.tsx @@ -2,12 +2,11 @@ import { useEffect, useMemo, useState, useCallback, useRef } from 'react'; import { MapContainer, TileLayer, Marker, Popup, Polyline, useMap } from 'react-leaflet'; -import { OrderItem, Supplier, DriverLocation } from '@/lib/types'; +import { OrderItem, Supplier } from '@/lib/types'; import { formatCurrency, calculateDistance, parseCoordinates } from '@/lib/utils'; import { getDriverTrail, isAuthenticated, getCurrentUser } from '@/lib/pocketbase'; -import { Navigation, AlertTriangle, Route, Crosshair, Layers } from 'lucide-react'; +import { Navigation, AlertTriangle, Route, Crosshair } from 'lucide-react'; import L from 'leaflet'; -import 'leaflet/dist/leaflet.css'; const defaultIcon = L.icon({ iconUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/images/marker-icon.png', @@ -129,8 +128,14 @@ export default function CollectionMap({ items, onNavigate }: MapViewProps) { }; return ( -
- +
+