"use client"; import { useState, useMemo } from "react"; import { MapPin } from "lucide-react"; import { siteContent } from "@/data/content"; import { SectionHeading } from "@/components/ui/SectionHeading"; import { Reveal } from "@/components/ui/Reveal"; import { DayCard } from "./schedule/DayCard"; import { ScheduleFilters } from "./schedule/ScheduleFilters"; import { MobileSchedule } from "./schedule/MobileSchedule"; import type { StatusFilter } from "./schedule/constants"; export function Schedule() { const { schedule } = siteContent; const [locationIndex, setLocationIndex] = useState(0); const [filterTrainer, setFilterTrainer] = useState(null); const [filterType, setFilterType] = useState(null); const [filterStatus, setFilterStatus] = useState("all"); const [showTrainers, setShowTrainers] = useState(false); const location = schedule.locations[locationIndex]; const { trainers, types, hasAnySlots, hasAnyRecruiting } = useMemo(() => { const trainerSet = new Set(); const typeSet = new Set(); let slots = false; let recruiting = false; for (const day of location.days) { for (const cls of day.classes) { trainerSet.add(cls.trainer); typeSet.add(cls.type); if (cls.hasSlots) slots = true; if (cls.recruiting) recruiting = true; } } return { trainers: Array.from(trainerSet).sort(), types: Array.from(typeSet).sort(), hasAnySlots: slots, hasAnyRecruiting: recruiting, }; }, [location]); const filteredDays = useMemo(() => { const noFilter = !filterTrainer && !filterType && filterStatus === "all"; if (noFilter) return location.days; return location.days .map((day) => ({ ...day, classes: day.classes.filter( (cls) => (!filterTrainer || cls.trainer === filterTrainer) && (!filterType || cls.type === filterType) && (filterStatus === "all" || (filterStatus === "hasSlots" && cls.hasSlots) || (filterStatus === "recruiting" && cls.recruiting)) ), })) .filter((day) => day.classes.length > 0); }, [location.days, filterTrainer, filterType, filterStatus]); const hasActiveFilter = !!(filterTrainer || filterType || filterStatus !== "all"); function clearFilters() { setFilterTrainer(null); setFilterType(null); setFilterStatus("all"); } return (
{schedule.title} {/* Location tabs */}
{schedule.locations.map((loc, i) => ( ))}
{/* Compact filters — desktop only */}
{/* Mobile: compact agenda list with tap-to-filter */} {/* Desktop: grid layout */}
); }