"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) => (
))}
)}
);
}