"use client"; import { useEffect, useState } from "react"; import { getMapData } from "@/lib/api"; import { Loader2, MapPin, Users } from "lucide-react"; import dynamic from "next/dynamic"; // Leaflet must be dynamically imported (no SSR) const MapComponent = dynamic(() => import("@/components/MapComponent"), { ssr: false, loading: () => (
), }); export default function MapPage() { const [mapData, setMapData] = useState<{ sites: any[]; patient_clusters: any[] } | null>(null); const [loading, setLoading] = useState(true); const [selectedSite, setSelectedSite] = useState(null); useEffect(() => { getMapData().then((d) => { setMapData(d); setLoading(false); }).catch(() => setLoading(false)); }, []); return (

Study Site Map

Interactive map of clinical trial sites and patient density clusters

{loading ? (
) : mapData ? ( ) : (
Failed to load map data
)}
{selectedSite && (

{selectedSite.name}

{selectedSite.city}, {selectedSite.state}

Active Trials{selectedSite.trials}
Enrolled{selectedSite.enrolled}
Capacity{selectedSite.capacity}
Fill Rate{Math.round(selectedSite.enrolled / selectedSite.capacity * 100)}%
)}

Legend

Study sites (click for details)
Patient density clusters
{mapData?.sites && (

All Sites

{mapData.sites.map((site, i) => ( ))}
)}
); }