"use client"; import { useState } 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); 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) => )}
{/* ── Attribution ──────────────────────────────────────────────────── */}
Powered by{" "} Queue-Times.com {" "}· Updates every 5 minutes
); } function RideRow({ ride }: { ride: LiveRide }) { const showWait = ride.isOpen && ride.waitMinutes > 0; return (
{ride.name}
{showWait && ( {ride.waitMinutes} min )} {ride.isOpen && !showWait && ( walk-on )}
); }