"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 } from "lucide-react" import { getMonthName } from "@/app/_utils/common" import { useRef, useState, useCallback, useMemo } from "react" import { CrimePopup } from "./pop-up" import type { CrimeIncident } from "./markers/crime-marker" import { useFullscreen } from "@/app/_hooks/use-fullscreen" import { Overlay } from "./overlay" import MapLegend from "./controls/map-legend" import { usePrefetchedCrimeData } from "@/app/(pages)/(admin)/dashboard/crime-management/crime-overview/_hooks/use-prefetch-crimes" import { useGetCrimeCategories } from "@/app/(pages)/(admin)/dashboard/crime-management/crime-overview/_queries/queries" import { ITopTooltipsMapId } from "./controls/map-tooltips" import MapSelectors from "./controls/map-selector" import TopNavigation from "./controls/map-navigations" import CrimeSidebar from "./sidebar/map-sidebar" import SidebarToggle from "./sidebar/sidebar-toggle" export default function CrimeMap() { // State for sidebar const [sidebarCollapsed, setSidebarCollapsed] = useState(true) const [selectedDistrict, setSelectedDistrict] = useState(null) const [selectedIncident, setSelectedIncident] = useState(null) const [showLegend, setShowLegend] = useState(true) const [selectedCategory, setSelectedCategory] = useState("all") const [activeControl, setActiveControl] = useState("incidents") const mapContainerRef = useRef(null) // Use the custom fullscreen hook const { isFullscreen } = useFullscreen(mapContainerRef) // Toggle sidebar function const toggleSidebar = useCallback(() => { setSidebarCollapsed(!sidebarCollapsed) }, [sidebarCollapsed]) // Use our new prefetched data hook const { availableYears, isYearsLoading, crimes, isCrimesLoading, crimesError, setSelectedYear, setSelectedMonth, selectedYear, selectedMonth, } = usePrefetchedCrimeData() // Extract all unique categories const { data: categoriesData, isLoading: isCategoryLoading } = useGetCrimeCategories() // Transform categories data to string array const categories = useMemo(() => categoriesData ? categoriesData.map(category => category.name) : [] , [categoriesData]) // Filter incidents based on selected category const filteredCrimes = useMemo(() => { if (!crimes) return [] if (selectedCategory === "all") return crimes return crimes.map((district: { incidents: CrimeIncident[], number_of_crime: number }) => ({ ...district, incidents: district.incidents.filter(incident => incident.category === selectedCategory ), // Update number_of_crime to reflect the filtered count number_of_crime: district.incidents.filter( incident => incident.category === selectedCategory ).length })) }, [crimes, selectedCategory]) // Extract all incidents from all districts for marker display const allIncidents = useMemo(() => { if (!filteredCrimes) return [] return filteredCrimes.flatMap((district: { incidents: CrimeIncident[] }) => 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, })) ) }, [filteredCrimes]) // Handle district click const handleDistrictClick = (feature: DistrictFeature) => { setSelectedDistrict(feature) } // Handle incident marker click const handleIncidentClick = (incident: CrimeIncident) => { setSelectedIncident(incident) } // Reset filters const resetFilters = useCallback(() => { setSelectedYear(2024) setSelectedMonth("all") setSelectedCategory("all") }, [setSelectedYear, setSelectedMonth]) // Determine the title based on filters const getMapTitle = () => { let title = `${selectedYear}` if (selectedMonth !== "all") { title += ` - ${getMonthName(Number(selectedMonth))}` } if (selectedCategory !== "all") { title += ` - ${selectedCategory}` } return title } return ( Crime Map {getMapTitle()} {isCrimesLoading ? (
) : crimesError ? (

Failed to load crime data. Please try again later.

) : (
{/* District Layer with crime data */} {/* Popup for selected incident */} {selectedIncident && ( setSelectedIncident(null)} crime={selectedIncident} /> )} {/* Components that are only visible in fullscreen mode */} {isFullscreen && ( <>
{/* Sidebar component without overlay */} )}
)}
) }