// "use client" // import { useState, useEffect, useRef } from "react" // import { useMap } from "react-map-gl/mapbox" // import { MAPBOX_TILESET_ID } from "@/app/_utils/const/map" // import { $Enums } from "@prisma/client" // import type { ICrimes } from "@/app/_utils/types/crimes" // import DistrictLayer, { DistrictFeature } from "./district-layer" // import DistrictExtrusionLayer from "./district-extrusion-layer" // import CrimeClusterLayer from "./crime-cluster-layer" // export interface MapLayerManagerProps { // visible?: boolean // crimes: ICrimes[] // year: string // month: string // filterCategory: string | "all" // tilesetId?: string // isTimelapsePlaying?: boolean // onDistrictClick?: (feature: DistrictFeature) => void // } // export default function MapLayerManager({ // visible = true, // crimes = [], // year, // month, // filterCategory = "all", // tilesetId = MAPBOX_TILESET_ID, // isTimelapsePlaying = false, // onDistrictClick, // }: MapLayerManagerProps) { // const { current: map } = useMap() // const [focusedDistrictId, setFocusedDistrictId] = useState(null) // const [isStyleLoaded, setIsStyleLoaded] = useState(false) // const [beforeId, setBeforeId] = useState(undefined) // const initAttempts = useRef(0) // // Compute crime data by district for all layer components to use // const crimeDataByDistrict = crimes.reduce( // (acc, crime) => { // const districtId = crime.district_id // acc[districtId] = { // number_of_crime: crime.number_of_crime, // level: crime.level, // } // return acc // }, // {} as Record, // ) // // Ensure map is ready after mounting - try multiple approaches // useEffect(() => { // if (!map) { // console.error("Map not available in MapLayerManager"); // return; // } // console.log("MapLayerManager mounted, checking map status"); // // Direct initialization if already loaded // if (map.getMap().isStyleLoaded()) { // console.log("Map style already loaded - direct init"); // setIsStyleLoaded(true); // try { // const layers = map.getMap().getStyle().layers; // for (const layer of layers) { // if (layer.type === "symbol") { // setBeforeId(layer.id); // break; // } // } // } catch (err) { // console.warn("Error finding symbol layer:", err); // } // return; // } // // Listen for style load event // const onStyleLoad = () => { // console.log("Map style.load event fired"); // setIsStyleLoaded(true); // try { // const layers = map.getMap().getStyle().layers; // for (const layer of layers) { // if (layer.type === "symbol") { // setBeforeId(layer.id); // break; // } // } // } catch (err) { // console.warn("Error finding symbol layer:", err); // } // }; // // Add event listener // map.getMap().once('style.load', onStyleLoad); // // Multiple retry attempts with increasing delays // const checkStyleLoaded = () => { // initAttempts.current += 1; // if (initAttempts.current > 10) { // console.error("Failed to detect loaded map style after 10 attempts"); // return; // } // if (map.getMap().isStyleLoaded()) { // console.log(`Map style loaded (detected on attempt ${initAttempts.current})`); // map.getMap().off('style.load', onStyleLoad); // setIsStyleLoaded(true); // try { // const layers = map.getMap().getStyle().layers; // for (const layer of layers) { // if (layer.type === "symbol") { // setBeforeId(layer.id); // break; // } // } // } catch (err) { // console.warn("Error finding symbol layer:", err); // } // } else { // console.log(`Waiting for map style to load... (attempt ${initAttempts.current})`); // setTimeout(checkStyleLoaded, 200 * initAttempts.current); // Increasing delay // } // }; // // Start checking after a short delay // setTimeout(checkStyleLoaded, 100); // // Cleanup // return () => { // map.getMap().off('style.load', onStyleLoad); // }; // }, [map]); // // Force a re-check when map or visibility changes // useEffect(() => { // if (!map || !visible) return; // if (!isStyleLoaded && map.getMap().isStyleLoaded()) { // console.log("Map style detected as loaded after prop change"); // setIsStyleLoaded(true); // try { // const layers = map.getMap().getStyle().layers; // for (const layer of layers) { // if (layer.type === "symbol") { // setBeforeId(layer.id); // break; // } // } // } catch (err) { // console.warn("Error finding symbol layer:", err); // } // } // }, [map, visible, isStyleLoaded]); // // Print debug info // useEffect(() => { // console.log("MapLayerManager state:", { // mapAvailable: !!map, // isStyleLoaded, // beforeId, // crimeCount: crimes.length, // visible // }); // }, [map, isStyleLoaded, beforeId, crimes, visible]); // // Debug: Force isStyleLoaded after a timeout as a last resort // useEffect(() => { // if (isStyleLoaded || !map) return; // const forceTimeout = setTimeout(() => { // if (!isStyleLoaded && map) { // console.warn("Forcing isStyleLoaded=true after timeout"); // setIsStyleLoaded(true); // } // }, 2000); // return () => clearTimeout(forceTimeout); // }, [map, isStyleLoaded]); // if (!visible || !map) { // console.log("MapLayerManager not rendering: visible=", visible, "map=", !!map); // return null; // } // return ( // <> // {map && (isStyleLoaded || initAttempts.current > 5) && ( // <> // // // // // ) // } // // ); // }