2025-03-31 13:36:35 +01:00
|
|
|
"use client";
|
2025-05-31 16:43:20 +01:00
|
|
|
import { useState, useMemo } from "react";
|
2025-05-04 16:04:44 +01:00
|
|
|
import useSWR from "swr";
|
|
|
|
|
import Sidebar from "@/components/Sidebar";
|
2025-05-12 13:25:57 +01:00
|
|
|
import Map from "@components/Map";
|
2025-05-31 16:43:20 +01:00
|
|
|
import LogObservatoryModal from "@/components/LogObservatoryModal"; // Adjust if your path is different
|
2025-05-26 22:16:46 +01:00
|
|
|
import { fetcher } from "@utils/axiosHelpers";
|
2025-05-27 14:10:41 +01:00
|
|
|
import { Observatory } from "@prismaclient";
|
|
|
|
|
import { getRelativeDate } from "@utils/formatters";
|
|
|
|
|
import GeologicalEvent from "@appTypes/Event";
|
2025-03-19 19:43:34 +00:00
|
|
|
|
2025-03-17 13:21:02 +00:00
|
|
|
export default function Observatories() {
|
2025-05-31 16:43:20 +01:00
|
|
|
const [selectedEventId, setSelectedEventId] = useState("");
|
|
|
|
|
const [hoveredEventId, setHoveredEventId] = useState("");
|
|
|
|
|
const [logModalOpen, setLogModalOpen] = useState(false);
|
|
|
|
|
|
|
|
|
|
const { data, error, isLoading, mutate } = useSWR(
|
|
|
|
|
"/api/observatories",
|
|
|
|
|
fetcher
|
|
|
|
|
);
|
2025-03-31 13:36:35 +01:00
|
|
|
|
2025-05-31 16:43:20 +01:00
|
|
|
const observatoryEvents = useMemo(
|
|
|
|
|
() =>
|
|
|
|
|
data && data.observatories
|
|
|
|
|
? data.observatories
|
|
|
|
|
.map(
|
|
|
|
|
(x: Observatory): GeologicalEvent => ({
|
|
|
|
|
id: x.id.toString(),
|
|
|
|
|
title: `New Observatory - ${x.name}`,
|
|
|
|
|
longitude: x.longitude,
|
|
|
|
|
latitude: x.latitude,
|
|
|
|
|
text1: "",
|
|
|
|
|
text2: getRelativeDate(x.dateEstablished),
|
|
|
|
|
date: x.dateEstablished,
|
|
|
|
|
})
|
|
|
|
|
)
|
|
|
|
|
.sort(
|
|
|
|
|
(a: GeologicalEvent, b: GeologicalEvent) =>
|
|
|
|
|
new Date(b.date).getTime() - new Date(a.date).getTime()
|
|
|
|
|
)
|
|
|
|
|
: [],
|
|
|
|
|
[data]
|
|
|
|
|
);
|
2025-05-27 14:10:41 +01:00
|
|
|
|
2025-05-31 16:43:20 +01:00
|
|
|
return (
|
|
|
|
|
<div className="flex h-[calc(100vh-3.5rem)] w-full overflow-hidden">
|
|
|
|
|
<div className="flex-grow h-full">
|
|
|
|
|
<Map
|
|
|
|
|
events={observatoryEvents}
|
|
|
|
|
selectedEventId={selectedEventId}
|
|
|
|
|
setSelectedEventId={setSelectedEventId}
|
|
|
|
|
hoveredEventId={hoveredEventId}
|
|
|
|
|
setHoveredEventId={setHoveredEventId}
|
|
|
|
|
mapType="observatories"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
<Sidebar
|
|
|
|
|
logTitle="Observatory Mapping"
|
|
|
|
|
logSubtitle="Record and search observatories - time/date set-up, location, scientists and recent earthquakes"
|
|
|
|
|
recentsTitle="New Observatories"
|
|
|
|
|
events={observatoryEvents}
|
|
|
|
|
selectedEventId={selectedEventId}
|
|
|
|
|
setSelectedEventId={setSelectedEventId}
|
|
|
|
|
hoveredEventId={hoveredEventId}
|
|
|
|
|
setHoveredEventId={setHoveredEventId}
|
|
|
|
|
button1Name="Log a New Observatory"
|
|
|
|
|
button2Name="Search Observatories"
|
|
|
|
|
onButton1Click={() => setLogModalOpen(true)}
|
|
|
|
|
/>
|
|
|
|
|
<LogObservatoryModal
|
|
|
|
|
open={logModalOpen}
|
|
|
|
|
onClose={() => setLogModalOpen(false)}
|
|
|
|
|
onSuccess={() => mutate()}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
2025-03-19 19:20:18 +00:00
|
|
|
}
|