feat: smooth scroll to schedule section when filtering from cards
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { useState, useMemo } from "react";
|
import { useState, useMemo, useCallback } from "react";
|
||||||
import { CalendarDays, Users, LayoutGrid } from "lucide-react";
|
import { CalendarDays, Users, LayoutGrid } from "lucide-react";
|
||||||
import { SectionHeading } from "@/components/ui/SectionHeading";
|
import { SectionHeading } from "@/components/ui/SectionHeading";
|
||||||
import { Reveal } from "@/components/ui/Reveal";
|
import { Reveal } from "@/components/ui/Reveal";
|
||||||
@@ -31,6 +31,21 @@ export function Schedule({ data: schedule, classItems }: ScheduleProps) {
|
|||||||
|
|
||||||
const isAllMode = locationMode === "all";
|
const isAllMode = locationMode === "all";
|
||||||
|
|
||||||
|
const scrollToSchedule = useCallback(() => {
|
||||||
|
const el = document.getElementById("schedule");
|
||||||
|
if (el) el.scrollIntoView({ behavior: "smooth", block: "start" });
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const setFilterTrainerFromCard = useCallback((trainer: string | null) => {
|
||||||
|
setFilterTrainer(trainer);
|
||||||
|
if (trainer) scrollToSchedule();
|
||||||
|
}, [scrollToSchedule]);
|
||||||
|
|
||||||
|
const setFilterTypeFromCard = useCallback((type: string | null) => {
|
||||||
|
setFilterType(type);
|
||||||
|
if (type) scrollToSchedule();
|
||||||
|
}, [scrollToSchedule]);
|
||||||
|
|
||||||
const typeDots = useMemo(() => buildTypeDots(classItems), [classItems]);
|
const typeDots = useMemo(() => buildTypeDots(classItems), [classItems]);
|
||||||
|
|
||||||
// Build days: either from one location or merged from all
|
// Build days: either from one location or merged from all
|
||||||
@@ -271,9 +286,9 @@ export function Schedule({ data: schedule, classItems }: ScheduleProps) {
|
|||||||
typeDots={typeDots}
|
typeDots={typeDots}
|
||||||
filteredDays={filteredDays}
|
filteredDays={filteredDays}
|
||||||
filterType={filterType}
|
filterType={filterType}
|
||||||
setFilterType={setFilterType}
|
setFilterType={setFilterTypeFromCard}
|
||||||
filterTrainer={filterTrainer}
|
filterTrainer={filterTrainer}
|
||||||
setFilterTrainer={setFilterTrainer}
|
setFilterTrainer={setFilterTrainerFromCard}
|
||||||
hasActiveFilter={hasActiveFilter}
|
hasActiveFilter={hasActiveFilter}
|
||||||
clearFilters={clearFilters}
|
clearFilters={clearFilters}
|
||||||
showLocation={isAllMode}
|
showLocation={isAllMode}
|
||||||
@@ -291,7 +306,7 @@ export function Schedule({ data: schedule, classItems }: ScheduleProps) {
|
|||||||
key={day.day}
|
key={day.day}
|
||||||
className={filteredDays.length === 1 ? "w-full max-w-[340px]" : ""}
|
className={filteredDays.length === 1 ? "w-full max-w-[340px]" : ""}
|
||||||
>
|
>
|
||||||
<DayCard day={day} typeDots={typeDots} showLocation={isAllMode} filterTrainer={filterTrainer} setFilterTrainer={setFilterTrainer} filterType={filterType} setFilterType={setFilterType} />
|
<DayCard day={day} typeDots={typeDots} showLocation={isAllMode} filterTrainer={filterTrainer} setFilterTrainer={setFilterTrainerFromCard} filterType={filterType} setFilterType={setFilterTypeFromCard} />
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
|
|
||||||
@@ -310,9 +325,9 @@ export function Schedule({ data: schedule, classItems }: ScheduleProps) {
|
|||||||
typeDots={typeDots}
|
typeDots={typeDots}
|
||||||
filteredDays={filteredDays}
|
filteredDays={filteredDays}
|
||||||
filterType={filterType}
|
filterType={filterType}
|
||||||
setFilterType={setFilterType}
|
setFilterType={setFilterTypeFromCard}
|
||||||
filterTrainer={filterTrainer}
|
filterTrainer={filterTrainer}
|
||||||
setFilterTrainer={setFilterTrainer}
|
setFilterTrainer={setFilterTrainerFromCard}
|
||||||
showLocation={isAllMode}
|
showLocation={isAllMode}
|
||||||
/>
|
/>
|
||||||
</Reveal>
|
</Reveal>
|
||||||
|
|||||||
Reference in New Issue
Block a user