"use client" import { Card, CardContent, CardHeader, CardTitle } from "@/app/_components/ui/card" import { Skeleton } from "@/app/_components/ui/skeleton" import DistrictLayer, { type DistrictFeature } from "./layers/district-layer" import MapView from "./map" import { Button } from "@/app/_components/ui/button" import { AlertCircle, FilterX } from "lucide-react" import { getMonthName } from "@/app/_utils/common" import { useCrimeMapHandler } from "@/app/(pages)/(admin)/dashboard/crime-management/crime-overview/_handlers/crime-map-handlers" import { useRef, useState } from "react" import { CrimePopup } from "./pop-up" import type { CrimeIncident } from "./markers/crime-marker" import YearSelector from "./controls/year-selector" import MonthSelector from "./controls/month-selector" import { useFullscreen } from "@/app/_hooks/use-fullscreen" import { Overlay } from "./overlay" import { useGetAvailableYears, useGetCrimeByYearAndMonth } from "@/app/(pages)/(admin)/dashboard/crime-management/crime-overview/_queries/queries" import MapLegend from "./controls/map-legend" export default function CrimeMap() { // Set default year to 2024 instead of "all" const [selectedYear, setSelectedYear] = useState(2024) const [selectedMonth, setSelectedMonth] = useState("all") const [selectedDistrict, setSelectedDistrict] = useState(null) const [selectedIncident, setSelectedIncident] = useState(null) const [showLegend, setShowLegend] = useState(true) const mapContainerRef = useRef(null) // Use the custom fullscreen hook const { isFullscreen } = useFullscreen(mapContainerRef) const { data: availableYears, isLoading: isYearsLoading, error: yearsError } = useGetAvailableYears() const { data: crimes, isLoading: isCrimesLoading, error: isCrimesError, refetch: refetchCrimes } = useGetCrimeByYearAndMonth(selectedYear, selectedMonth) // Extract all incidents from all districts for marker display const allIncidents = crimes?.flatMap((district) => district.incidents.map((incident) => ({ id: incident.id, timestamp: incident.timestamp, description: incident.description, status: incident.status, category: incident.category, type: incident.type, address: incident.address, latitude: incident.latitude, longitude: incident.longitude, })), ) || [] // Handle district click const handleDistrictClick = (feature: DistrictFeature) => { setSelectedDistrict(feature) } // Handle incident marker click const handleIncidentClick = (incident: CrimeIncident) => { setSelectedIncident(incident) } // Apply filters const applyFilters = () => { refetchCrimes() } // Reset filters const resetFilters = () => { setSelectedYear(2024) setSelectedMonth("all") refetchCrimes() } // Determine the title based on filters const getMapTitle = () => { let title = `${selectedYear}` if (selectedMonth !== "all") { title += ` - ${getMonthName(Number(selectedMonth))}` } return title } return ( Crime Map {getMapTitle()}
{/* Year selector component */} {/* Month selector component */}
{isCrimesLoading ? (
) : isCrimesError ? (

Failed to load crime data. Please try again later.

) : (
{/* District Layer with crime data */} {/* Popup for selected incident */} {selectedIncident && ( setSelectedIncident(null)} crime={selectedIncident} /> )} {isFullscreen && ( <>
)}
)}
) }