"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"; import EarthquakeLogModal from "@components/EarthquakeLogModal"; import { useStoreState } from "@hooks/store"; // --- NO ACCESS MODAL --- function NoAccessModal({ open, onClose }) { if (!open) return null; return (

Access Denied

Sorry, you do not have access rights to Log an Earthquake. Please Log in here, or contact an Admin if you believe this is a mistake

); } // --- 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(""); const [searchModalOpen, setSearchModalOpen] = useState(false); const [logModalOpen, setLogModalOpen] = useState(false); const [noAccessModalOpen, setNoAccessModalOpen] = useState(false); const user = useStoreState((state) => state.user); const role: "GUEST" | "SCIENTIST" | "ADMIN" = user?.role ?? "GUEST"; const canLogEarthquake = role === "SCIENTIST" || role === "ADMIN"; // Fetch recent earthquakes const { data, error, isLoading, mutate } = useSWR("/api/earthquakes", createPoster({ rangeDaysPrev: 10 })); // Prepare events 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] ); // This handler is always called, regardless of button state! const handleLogClick = () => { if (canLogEarthquake) { setLogModalOpen(true); } else { setNoAccessModalOpen(true); } }; return (
setSearchModalOpen(true)} button1Disabled={!canLogEarthquake} // <--- For style only! /> setSearchModalOpen(false)} onSelect={(eq) => setSelectedEventId(eq.code)} /> setLogModalOpen(false)} onSuccess={() => mutate()} // To refresh /> setNoAccessModalOpen(false)} />
); }