"use client"; import { useMemo, useState } from "react"; import useSWR from "swr"; import Map from "@components/Map"; import Sidebar from "@components/Sidebar"; import { createPoster } from "@utils/axiosHelpers"; import { Earthquake } from "@prismaclient"; import { getRelativeDate } from "@utils/formatters"; import GeologicalEvent from "@appTypes/Event"; import axios from "axios"; // --- SEARCH MODAL COMPONENT --- function EarthquakeSearchModal({ open, onClose, onSelect }) { const [search, setSearch] = useState(""); const [results, setResults] = useState([]); const [loading, setLoading] = useState(false); const handleSearch = async (e) => { e.preventDefault(); setLoading(true); setResults([]); try { const res = await axios.post("/api/earthquakes/search", { query: search }); setResults(res.data.earthquakes || []); } catch (e) { alert("Failed to search."); } setLoading(false); }; if (!open) return null; return (

Search Earthquakes

setSearch(e.target.value)} className="flex-grow px-3 py-2 border rounded" required />
{results.length === 0 && !loading && search !== "" && (

No results found.

)}
    {results.map(eq => (
  • { onSelect(eq); onClose(); }} tabIndex={0} >
    {eq.code} {" "} {eq.location} {new Date(eq.date).toLocaleDateString()}
    = 7 ? "bg-red-500" : eq.magnitude >= 6 ? "bg-orange-400" : "bg-yellow-400"}`}> {eq.magnitude}
  • ))}
); } // --- MAIN PAGE COMPONENT --- export default function Earthquakes() { const [selectedEventId, setSelectedEventId] = useState(""); const [hoveredEventId, setHoveredEventId] = useState(""); // Search modal state const [searchModalOpen, setSearchModalOpen] = useState(false); // Fetch recent earthquakes as before const { data, error, isLoading } = useSWR("/api/earthquakes", createPoster({ rangeDaysPrev: 5 })); // Prepare events for maps/sidebar const earthquakeEvents = useMemo( () => data && data.earthquakes ? data.earthquakes .map( (x: Earthquake): GeologicalEvent => ({ id: x.code, title: `Earthquake in ${x.code.split("-")[2]}`, magnitude: x.magnitude, longitude: x.longitude, latitude: x.latitude, text1: "", text2: getRelativeDate(x.date), date: x.date, }) ) .sort((a: GeologicalEvent, b: GeologicalEvent) => new Date(b.date).getTime() - new Date(a.date).getTime()) : [], [data] ); // Optional: show details of selected search result (not implemented here) // const [selectedSearchResult, setSelectedSearchResult] = useState(null); return (
setSearchModalOpen(true)} // <-- important! /> setSearchModalOpen(false)} onSelect={eq => { setSelectedEventId(eq.code); // select on map/sidebar // setSelectedSearchResult(eq); // you can use this if you want to show detail modal }} />
); }