"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 */}
{anyOpen && closedRides.length > 0 && (
{closedRides.length} closed / down
)}
{/* Coaster toggle — only shown when the park has categorised coasters */}
{hasCoasters && (
)}
{/* ── Ride grid ────────────────────────────────────────────────────── */}
{openRides.map((ride) => )}
{closedRides.map((ride) => )}
{/* ── Attribution ──────────────────────────────────────────────────── */}
);
}
function RideRow({ ride }: { ride: LiveRide }) {
const showWait = ride.isOpen && ride.waitMinutes > 0;
return (