import { Layer, Source } from "react-map-gl/mapbox"; import { useMemo } from "react"; import { ICrimes } from "@/app/_utils/types/crimes"; interface HeatmapLayerProps { crimes: ICrimes[]; year: string; month: string; filterCategory: string | "all"; visible?: boolean; useAllData?: boolean; // Add prop to indicate if we should use all data } export default function HeatmapLayer({ crimes, visible = true, useAllData = false, filterCategory }: HeatmapLayerProps) { // Convert crime data to GeoJSON format for the heatmap const heatmapData = useMemo(() => { const features = crimes.flatMap(crime => crime.crime_incidents .filter(incident => { // Enhanced filtering logic if (!incident.locations?.latitude || !incident.locations?.longitude) { return false; } // Filter by category if specified if (filterCategory !== "all" && incident.crime_categories?.name !== filterCategory) { return false; } return true; }) .map(incident => ({ type: "Feature" as const, properties: { id: incident.id, category: incident.crime_categories?.name || "Unknown", intensity: 1, // Base intensity value timestamp: incident.timestamp ? new Date(incident.timestamp).getTime() : null, }, geometry: { type: "Point" as const, coordinates: [incident.locations!.longitude, incident.locations!.latitude], }, })) ); return { type: "FeatureCollection" as const, features, }; }, [crimes, filterCategory]); if (!visible) return null; return ( ); }