"use client" import { useEffect, useState } from "react" 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 MapLegend from "./controls/map-legend" import YearSelector from "./controls/year-selector" import CrimeMarker, { type CrimeIncident } from "./markers/crime-marker" import { useToast } from "@/app/_hooks/use-toast" import MapView from "./map" import { useQuery } from "@tanstack/react-query" import { getAvailableYears } from "@/app/(pages)/(admin)/dashboard/crime-management/crime-overview/action" const years = [2020, 2021, 2022, 2023, 2024, 2025] export default function CrimeMap() { const [loading, setLoading] = useState(false) const [year, setYear] = useState(new Date().getFullYear().toString()) const [availableYears, setAvailableYears] = useState(years) const [districtData, setDistrictData] = useState([]) const [crimeIncidents, setCrimeIncidents] = useState([]) const [showIncidents, setShowIncidents] = useState(false) const { toast } = useToast() // fetch available years (example function) // const { data: year } = useQuery({ // queryKey: ["available-years"], // queryFn: getAvailableYears, // }) // Fetch crime incidents (example function) const fetchCrimeIncidents = async (districtId: string) => { try { // This would be replaced with an actual API call // const response = await fetch(`/api/crime-incidents?districtId=${districtId}&year=${year}`) // const data = await response.json() // For demonstration, we'll create some sample data const sampleIncidents: CrimeIncident[] = [ { id: "1", latitude: -8.1842 + (Math.random() - 0.5) * 0.1, longitude: 113.7031 + (Math.random() - 0.5) * 0.1, description: "Theft incident", date: "2023-05-15", category: "Theft", }, { id: "2", latitude: -8.1842 + (Math.random() - 0.5) * 0.1, longitude: 113.7031 + (Math.random() - 0.5) * 0.1, description: "Vandalism", date: "2023-06-22", category: "Property Crime", }, { id: "3", latitude: -8.1842 + (Math.random() - 0.5) * 0.1, longitude: 113.7031 + (Math.random() - 0.5) * 0.1, description: "Assault", date: "2023-07-10", category: "Violent Crime", }, ] setCrimeIncidents(sampleIncidents) setShowIncidents(true) } catch (error) { console.error("Error fetching crime incidents:", error) } } const handleDistrictClick = (feature: any) => { const districtId = feature.properties.id const districtName = feature.properties.name toast({ title: `Selected: ${districtName}`, description: "Loading crime incidents for this district...", }) fetchCrimeIncidents(districtId) } const handleIncidentClick = (incident: CrimeIncident) => { toast({ title: "Crime Incident", description: `${incident.description} on ${incident.date}`, }) } return ( {/* Crime Rate Map - Jember Regency */} {loading ? ( ) : (
{/* District Layer */} {/* Crime Incident Markers */} {showIncidents && crimeIncidents.map((incident) => ( ))} {/* Map Legend */} {/* */}
)}
) }