"use client"; import { useState, useEffect } from "react"; import Link from "next/link"; import type { LiveRidesResult, LiveRide } from "@/lib/scrapers/queuetimes"; import { slugifyRideName } from "@/lib/ride-slug"; interface LiveRidePanelProps { parkId: string; liveRides: LiveRidesResult; parkOpenToday: boolean; isWeatherDelay?: boolean; } export function LiveRidePanel({ parkId, liveRides, parkOpenToday, isWeatherDelay }: LiveRidePanelProps) { const { rides } = liveRides; const hasCoasters = rides.some((r) => r.isCoaster); const hasFastLane = rides.some((r) => r.hasFastLane); const [coastersOnly, setCoastersOnly] = useState(false); const [fastLaneMode, setFastLaneMode] = useState(false); // Pre-select coaster filter if Coaster Mode is enabled on the homepage. useEffect(() => { if (hasCoasters && localStorage.getItem("coasterMode") === "true") { setCoastersOnly(true); } }, [hasCoasters]); // Restore Fast Lane mode from a previous visit. useEffect(() => { if (hasFastLane && localStorage.getItem("fastLaneMode") === "true") { setFastLaneMode(true); } }, [hasFastLane]); const toggleFastLane = () => { setFastLaneMode((v) => { const next = !v; localStorage.setItem("fastLaneMode", String(next)); return next; }); }; 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"}
)} {/* Toggle group — pushed to the right */} {(hasCoasters || hasFastLane) && (
{/* Fast Lane toggle — swaps shown waits to Fast Lane numbers */} {hasFastLane && ( )} {/* Coaster toggle — only shown when the park has categorised coasters */} {hasCoasters && ( )}
)}
{/* ── Ride grid ────────────────────────────────────────────────────── */}
{openRides.map((ride) => )} {closedRides.map((ride) => )}
); } function RideRow({ parkId, ride, fastLaneMode }: { parkId: string; ride: LiveRide; fastLaneMode: boolean }) { const showWait = ride.isOpen && ride.waitMinutes > 0; const fastLaneActive = fastLaneMode && ride.hasFastLane; const flWait = ride.fastLaneMinutes ?? 0; const slug = ride.slug ?? slugifyRideName(ride.name); return (
{ride.name}
{/* Fast Lane mode: swap the shown wait to the Fast Lane number */} {fastLaneMode ? ( ride.isOpen && fastLaneActive ? ( {flWait > 0 ? `⚡ ${flWait} min` : "⚡ walk-on"} ) : ride.isOpen ? ( no Fast Lane ) : null ) : ( <> {showWait && ( {ride.waitMinutes} min )} {ride.isOpen && !showWait && ( walk-on )} )} ); }