"use client"; import { useState, useEffect } from "react"; import type { LiveRidesResult, LiveRide } from "@/lib/scrapers/queuetimes"; interface LiveRidePanelProps { liveRides: LiveRidesResult; parkOpenToday: boolean; isWeatherDelay?: boolean; } export function LiveRidePanel({ liveRides, parkOpenToday, isWeatherDelay }: 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
) : isWeatherDelay ? (
⛈ Weather Delay — all rides currently closed
) : (
{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 )}
); }