"use client";
import { useState, useEffect } from "react";
import type { LiveRidesResult, LiveRide } from "@/lib/scrapers/queuetimes";
interface LiveRidePanelProps {
liveRides: LiveRidesResult;
parkOpenToday: boolean;
}
export function LiveRidePanel({ liveRides, parkOpenToday }: LiveRidePanelProps) {
const { rides } = liveRides;
const hasCoasters = rides.some((r) => r.isCoaster);
const [coastersOnly, setCoastersOnly] = useState(false);
// Pre-select coaster filter if Coaster Mode is enabled on the homepage.
useEffect(() => {
if (hasCoasters && localStorage.getItem("coasterMode") === "true") {
setCoastersOnly(true);
}
}, [hasCoasters]);
const visible = coastersOnly ? rides.filter((r) => r.isCoaster) : rides;
const openRides = visible.filter((r) => r.isOpen);
const closedRides = visible.filter((r) => !r.isOpen);
const anyOpen = openRides.length > 0;
return (
{/* ── Toolbar: summary + coaster toggle ────────────────────────────── */}
{/* Open count badge */}
{anyOpen ? (
{openRides.length} open
) : (
{parkOpenToday ? "Not open yet — check back soon" : "No rides open"}
)}
{/* Closed count badge — always shown when there are closed rides */}
{closedRides.length > 0 && (
{closedRides.length} {anyOpen ? "closed / down" : "rides total"}
)}
{/* Coaster toggle — only shown when the park has categorised coasters */}
{hasCoasters && (
)}
{/* ── Ride grid ────────────────────────────────────────────────────── */}
{openRides.map((ride) => )}
{closedRides.map((ride) => )}
);
}
function RideRow({ ride }: { ride: LiveRide }) {
const showWait = ride.isOpen && ride.waitMinutes > 0;
return (
{ride.name}
{showWait && (
{ride.waitMinutes} min
)}
{ride.isOpen && !showWait && (
walk-on
)}
);
}