From e5340b9a4cc74717b58397ccaf08018b3be6b809 Mon Sep 17 00:00:00 2001 From: Piotr Monwid-Olechnowicz Date: Mon, 8 Sep 2025 18:44:40 +0200 Subject: [PATCH 1/2] Add current time marker --- .../schedule/_components/schedule-list.tsx | 25 +++++++++++ .../_components/use-current-time-marker.ts | 45 +++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 src/app/conf/2025/schedule/_components/use-current-time-marker.ts diff --git a/src/app/conf/2025/schedule/_components/schedule-list.tsx b/src/app/conf/2025/schedule/_components/schedule-list.tsx index 82727dc80e..9147aff854 100644 --- a/src/app/conf/2025/schedule/_components/schedule-list.tsx +++ b/src/app/conf/2025/schedule/_components/schedule-list.tsx @@ -17,6 +17,7 @@ import { ResetFiltersButton, } from "./filters" import { formatBlockTime } from "./format-block-time" +import { useCurrentTimeMarker } from "./use-current-time-marker" export interface FiltersConfig extends Partial< @@ -138,6 +139,8 @@ export function ScheduleList({ const firstDayIsDayZero = Object.keys(firstDay).length < 3 const startIndex = firstDayIsDayZero ? 0 : 1 + const getTimeMarker = useCurrentTimeMarker() + return ( <>
@@ -229,6 +232,16 @@ export function ScheduleList({ blockEnd.getTime(), ) + let timeMarker = getTimeMarker(sessionDate, blockEnd) + // if end times differ and blockEnd is far from start, we treat this as a long event, like "solutions showcase" + if ( + endTimesDiffer && + blockEnd.getTime() - new Date(sessionDate).getTime() > + 1000 * 60 * 60 * 2 + ) { + timeMarker = null + } + return (
+ {timeMarker && ( +
+ now: + {timeMarker.currentTime} +
+ )} {hasDashedBorder && ( (new Date()) + + useEffect(() => { + const id = setInterval(() => setNow(new Date()), 60 * 1000) + return () => clearInterval(id) + }, []) + + const showNowMarkers = + now.getTime() >= CONFERENCE_START.getTime() && + now.getTime() <= CONFERENCE_END.getTime() + + const getTimeMarker = (sessionDate: string, blockEnd: Date) => { + const blockStart = new Date(sessionDate) + const isCurrentBlock = + showNowMarkers && + now.getTime() >= blockStart.getTime() && + now.getTime() < blockEnd.getTime() + + if (!isCurrentBlock) { + return null + } + + const blockDuration = blockEnd.getTime() - blockStart.getTime() + const timePassed = now.getTime() - blockStart.getTime() + const positionPercentage = Math.min( + 100, + Math.max(0, (timePassed / blockDuration) * 100), + ) + const currentTimeFormatted = format(now, "HH:mm") + + return { + positionPercentage, + currentTime: currentTimeFormatted, + } + } + + return getTimeMarker +} From 0084e12fc2b20f629d22006fd1d0b002ed15f676 Mon Sep 17 00:00:00 2001 From: Piotr Monwid-Olechnowicz Date: Mon, 8 Sep 2025 18:57:08 +0200 Subject: [PATCH 2/2] Add a button to scroll to current time marker --- .../2025/schedule/_components/filters.tsx | 6 +++- .../schedule/_components/schedule-list.tsx | 34 ++++++++++++------- .../_components/use-current-time-marker.ts | 2 +- src/app/conf/_design-system/anchor.tsx | 11 +++++- 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/src/app/conf/2025/schedule/_components/filters.tsx b/src/app/conf/2025/schedule/_components/filters.tsx index c187890b06..daa2b7bf3b 100644 --- a/src/app/conf/2025/schedule/_components/filters.tsx +++ b/src/app/conf/2025/schedule/_components/filters.tsx @@ -97,6 +97,10 @@ export function ResetFiltersButton({ }) { const hasFilters = Object.values(filters).flat().length > 0 + if (!hasFilters) { + return null + } + return (
- - setFiltersState( - FilterStates.initial( - Object.keys(filterFields) as (keyof ScheduleSession)[], - ), - ) - } - className="max-lg:mb-4 max-lg:w-fit max-lg:self-end" - /> +
+ + + setFiltersState( + FilterStates.initial( + Object.keys(filterFields) as (keyof ScheduleSession)[], + ), + ) + } + className="max-lg:mb-4 max-lg:w-fit max-lg:self-end" + /> +
{showFilter && ( ) : ( - + ) }) as (props: AnchorProps) => ReactElement