/** * SchoolMap Component * Client-side Leaflet map wrapper for displaying school locations */ 'use client'; import dynamic from 'next/dynamic'; import { useRef, useState, useEffect, useCallback } from 'react'; import type { School } from '@/lib/types'; import styles from './SchoolMap.module.css'; // Dynamic import to avoid SSR issues with Leaflet const LeafletMap = dynamic(() => import('./LeafletMapInner'), { ssr: false, loading: () => (

Loading map...

), }); interface SchoolMapProps { schools: School[]; center?: [number, number]; zoom?: number; referencePoint?: [number, number]; onMarkerClick?: (school: School) => void; } export function SchoolMap({ schools, center, zoom = 13, referencePoint, onMarkerClick }: SchoolMapProps) { const wrapperRef = useRef(null); const [isFullscreen, setIsFullscreen] = useState(false); // Sync state with browser fullscreen events (e.g. Escape key) useEffect(() => { const onFsChange = () => setIsFullscreen(!!document.fullscreenElement); document.addEventListener('fullscreenchange', onFsChange); return () => document.removeEventListener('fullscreenchange', onFsChange); }, []); const toggleFullscreen = useCallback(() => { if (!document.fullscreenElement) { wrapperRef.current?.requestFullscreen(); } else { document.exitFullscreen(); } }, []); // Calculate center if not provided const mapCenter: [number, number] = center || (() => { if (schools.length === 0) return [51.5074, -0.1278]; if (schools.length === 1 && schools[0].latitude && schools[0].longitude) { return [schools[0].latitude, schools[0].longitude]; } const validSchools = schools.filter(s => s.latitude && s.longitude); if (validSchools.length === 0) return [51.5074, -0.1278]; const avgLat = validSchools.reduce((sum, s) => sum + (s.latitude || 0), 0) / validSchools.length; const avgLng = validSchools.reduce((sum, s) => sum + (s.longitude || 0), 0) / validSchools.length; return [avgLat, avgLng]; })(); return (
); }