2026-07-12 18:09:43 -04:00
|
|
|
import { useWeekendContext } from '../hooks/useWeekendContext'
|
|
|
|
|
import { BetweenRacesView } from '../components/weekend/BetweenRacesView'
|
|
|
|
|
import { BetweenSessionsView } from '../components/weekend/BetweenSessionsView'
|
|
|
|
|
import { LiveHandoffView } from '../components/weekend/LiveHandoffView'
|
|
|
|
|
import { PreSessionView } from '../components/weekend/PreSessionView'
|
|
|
|
|
import { WeekendError, WeekendLimited, WeekendLoading } from '../components/weekend/StatusViews'
|
2026-07-12 19:40:04 -04:00
|
|
|
import { WeekendFocusBanner } from '../components/weekend/WeekendFocusBanner'
|
fix(#73): consume canonical Weekend Context contract and repair navigation
Address the independent review blockers on PR #80 after rebasing onto the
authoritative #72 Weekend Context API.
- Replace the invented frontend WeekendContext with the exact backend contract
(temporal_state, previous/focus/next meetings, previous_completed/active/next/
default_analysis sessions with availability). Every valid canonical payload now
maps to a designed state via a total resolveViewState; a well-formed response
can never fall through to the limited-data placeholder.
- Make the canonical read the single source of truth: useWeekendContext no longer
fans out to season/meetings/per-weekend/OpenF1/live queries. Only supplementary
championship + news reads run, and only once the canonical context resolves.
- Fix the Prepare/analysis flow: /preview is a stable alias that renders the
preparation surface (PreSessionView) instead of redirecting back to the same
between-races screen.
- One primary navigation system per breakpoint: the mobile top-bar links are
hidden so the bottom bar is the sole primary nav, and Admin is moved out of
every Primary landmark into an operator-utilities toolbar.
- Add Vitest coverage for the contract mapping, every temporal state, loading/
error/limited surfaces, the no-fanout guarantee, the /preview CTA, and the nav
hierarchy; add hermetic Playwright journeys (seeded + injected canonical
payloads), 390/768/1440 overflow checks, and Weekend visual snapshots. Retire
the stale Command Center specs/snapshots.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-12 18:38:08 -04:00
|
|
|
import { resolveViewState } from '../lib/weekendContext'
|
|
|
|
|
import type {
|
|
|
|
|
WeekendBriefingItem,
|
|
|
|
|
WeekendChampionshipImpact,
|
|
|
|
|
WeekendContext,
|
|
|
|
|
WeekendViewState,
|
|
|
|
|
} from '../types'
|
2026-07-12 18:09:43 -04:00
|
|
|
import '../styles/weekend.css'
|
|
|
|
|
|
fix(#73): consume canonical Weekend Context contract and repair navigation
Address the independent review blockers on PR #80 after rebasing onto the
authoritative #72 Weekend Context API.
- Replace the invented frontend WeekendContext with the exact backend contract
(temporal_state, previous/focus/next meetings, previous_completed/active/next/
default_analysis sessions with availability). Every valid canonical payload now
maps to a designed state via a total resolveViewState; a well-formed response
can never fall through to the limited-data placeholder.
- Make the canonical read the single source of truth: useWeekendContext no longer
fans out to season/meetings/per-weekend/OpenF1/live queries. Only supplementary
championship + news reads run, and only once the canonical context resolves.
- Fix the Prepare/analysis flow: /preview is a stable alias that renders the
preparation surface (PreSessionView) instead of redirecting back to the same
between-races screen.
- One primary navigation system per breakpoint: the mobile top-bar links are
hidden so the bottom bar is the sole primary nav, and Admin is moved out of
every Primary landmark into an operator-utilities toolbar.
- Add Vitest coverage for the contract mapping, every temporal state, loading/
error/limited surfaces, the no-fanout guarantee, the /preview CTA, and the nav
hierarchy; add hermetic Playwright journeys (seeded + injected canonical
payloads), 390/768/1440 overflow checks, and Weekend visual snapshots. Retire
the stale Command Center specs/snapshots.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-12 18:38:08 -04:00
|
|
|
interface RenderArgs {
|
|
|
|
|
context: WeekendContext
|
|
|
|
|
now: Date
|
|
|
|
|
championship?: WeekendChampionshipImpact
|
|
|
|
|
briefing: WeekendBriefingItem[]
|
|
|
|
|
/** When true (the /preview alias), foreground the preparation surface. */
|
|
|
|
|
preview: boolean
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function renderState(view: WeekendViewState, args: RenderArgs) {
|
|
|
|
|
const { context, now, championship, briefing, preview } = args
|
|
|
|
|
// The /preview alias always resolves to the preparation surface as long as
|
|
|
|
|
// there is a next event to prepare for, regardless of the temporal state. This
|
|
|
|
|
// keeps saved /preview links and the "Prepare for …" CTA meaningful instead of
|
|
|
|
|
// redirecting straight back to the same between-races screen.
|
|
|
|
|
if (preview && context.next_meeting) {
|
|
|
|
|
return <PreSessionView context={context} now={now} />
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch (view) {
|
|
|
|
|
case 'no_season':
|
|
|
|
|
return <WeekendLimited season={context.season} />
|
|
|
|
|
case 'between_weekends':
|
2026-07-12 18:09:43 -04:00
|
|
|
case 'post_weekend':
|
|
|
|
|
case 'season_complete':
|
fix(#73): consume canonical Weekend Context contract and repair navigation
Address the independent review blockers on PR #80 after rebasing onto the
authoritative #72 Weekend Context API.
- Replace the invented frontend WeekendContext with the exact backend contract
(temporal_state, previous/focus/next meetings, previous_completed/active/next/
default_analysis sessions with availability). Every valid canonical payload now
maps to a designed state via a total resolveViewState; a well-formed response
can never fall through to the limited-data placeholder.
- Make the canonical read the single source of truth: useWeekendContext no longer
fans out to season/meetings/per-weekend/OpenF1/live queries. Only supplementary
championship + news reads run, and only once the canonical context resolves.
- Fix the Prepare/analysis flow: /preview is a stable alias that renders the
preparation surface (PreSessionView) instead of redirecting back to the same
between-races screen.
- One primary navigation system per breakpoint: the mobile top-bar links are
hidden so the bottom bar is the sole primary nav, and Admin is moved out of
every Primary landmark into an operator-utilities toolbar.
- Add Vitest coverage for the contract mapping, every temporal state, loading/
error/limited surfaces, the no-fanout guarantee, the /preview CTA, and the nav
hierarchy; add hermetic Playwright journeys (seeded + injected canonical
payloads), 390/768/1440 overflow checks, and Weekend visual snapshots. Retire
the stale Command Center specs/snapshots.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-12 18:38:08 -04:00
|
|
|
return (
|
|
|
|
|
<BetweenRacesView
|
|
|
|
|
context={context}
|
|
|
|
|
now={now}
|
|
|
|
|
view={view}
|
|
|
|
|
championship={championship}
|
|
|
|
|
briefing={briefing}
|
|
|
|
|
/>
|
|
|
|
|
)
|
2026-07-12 18:09:43 -04:00
|
|
|
case 'between_sessions':
|
|
|
|
|
case 'session_settling':
|
fix(#73): consume canonical Weekend Context contract and repair navigation
Address the independent review blockers on PR #80 after rebasing onto the
authoritative #72 Weekend Context API.
- Replace the invented frontend WeekendContext with the exact backend contract
(temporal_state, previous/focus/next meetings, previous_completed/active/next/
default_analysis sessions with availability). Every valid canonical payload now
maps to a designed state via a total resolveViewState; a well-formed response
can never fall through to the limited-data placeholder.
- Make the canonical read the single source of truth: useWeekendContext no longer
fans out to season/meetings/per-weekend/OpenF1/live queries. Only supplementary
championship + news reads run, and only once the canonical context resolves.
- Fix the Prepare/analysis flow: /preview is a stable alias that renders the
preparation surface (PreSessionView) instead of redirecting back to the same
between-races screen.
- One primary navigation system per breakpoint: the mobile top-bar links are
hidden so the bottom bar is the sole primary nav, and Admin is moved out of
every Primary landmark into an operator-utilities toolbar.
- Add Vitest coverage for the contract mapping, every temporal state, loading/
error/limited surfaces, the no-fanout guarantee, the /preview CTA, and the nav
hierarchy; add hermetic Playwright journeys (seeded + injected canonical
payloads), 390/768/1440 overflow checks, and Weekend visual snapshots. Retire
the stale Command Center specs/snapshots.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-12 18:38:08 -04:00
|
|
|
return <BetweenSessionsView context={context} now={now} view={view} briefing={briefing} />
|
2026-07-12 18:09:43 -04:00
|
|
|
case 'session_live':
|
|
|
|
|
return <LiveHandoffView context={context} />
|
|
|
|
|
case 'pre_session':
|
|
|
|
|
return <PreSessionView context={context} now={now} />
|
|
|
|
|
default:
|
|
|
|
|
return <WeekendLimited season={context.season} />
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-12 19:40:04 -04:00
|
|
|
export function WeekendPage({
|
|
|
|
|
preview = false,
|
|
|
|
|
focusMeetingKey,
|
|
|
|
|
focusSessionKey,
|
|
|
|
|
}: {
|
|
|
|
|
preview?: boolean
|
|
|
|
|
/** Restored from `/?meeting_key=` when returning from Race Hub analysis. */
|
|
|
|
|
focusMeetingKey?: number
|
|
|
|
|
/** Restored from `/?session_key=` when returning from Race Hub analysis. */
|
|
|
|
|
focusSessionKey?: number
|
|
|
|
|
}) {
|
2026-07-12 18:00:37 -04:00
|
|
|
const { context, loadState, error, championship, briefing, now, refetch, isFetching } =
|
|
|
|
|
useWeekendContext()
|
2026-07-12 19:40:04 -04:00
|
|
|
const hasFocus =
|
|
|
|
|
(focusMeetingKey != null && focusMeetingKey > 0) ||
|
|
|
|
|
(focusSessionKey != null && focusSessionKey > 0)
|
fix(#73): consume canonical Weekend Context contract and repair navigation
Address the independent review blockers on PR #80 after rebasing onto the
authoritative #72 Weekend Context API.
- Replace the invented frontend WeekendContext with the exact backend contract
(temporal_state, previous/focus/next meetings, previous_completed/active/next/
default_analysis sessions with availability). Every valid canonical payload now
maps to a designed state via a total resolveViewState; a well-formed response
can never fall through to the limited-data placeholder.
- Make the canonical read the single source of truth: useWeekendContext no longer
fans out to season/meetings/per-weekend/OpenF1/live queries. Only supplementary
championship + news reads run, and only once the canonical context resolves.
- Fix the Prepare/analysis flow: /preview is a stable alias that renders the
preparation surface (PreSessionView) instead of redirecting back to the same
between-races screen.
- One primary navigation system per breakpoint: the mobile top-bar links are
hidden so the bottom bar is the sole primary nav, and Admin is moved out of
every Primary landmark into an operator-utilities toolbar.
- Add Vitest coverage for the contract mapping, every temporal state, loading/
error/limited surfaces, the no-fanout guarantee, the /preview CTA, and the nav
hierarchy; add hermetic Playwright journeys (seeded + injected canonical
payloads), 390/768/1440 overflow checks, and Weekend visual snapshots. Retire
the stale Command Center specs/snapshots.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-12 18:38:08 -04:00
|
|
|
|
|
|
|
|
if (loadState === 'loading') {
|
|
|
|
|
return (
|
|
|
|
|
<main className="wk-page" data-testid="weekend-page" data-state="loading">
|
|
|
|
|
<WeekendLoading />
|
|
|
|
|
</main>
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (loadState === 'error' || context == null) {
|
|
|
|
|
return (
|
|
|
|
|
<main className="wk-page" data-testid="weekend-page" data-state="error">
|
2026-07-12 18:00:37 -04:00
|
|
|
<WeekendError error={error} onRetry={refetch} retrying={isFetching} />
|
fix(#73): consume canonical Weekend Context contract and repair navigation
Address the independent review blockers on PR #80 after rebasing onto the
authoritative #72 Weekend Context API.
- Replace the invented frontend WeekendContext with the exact backend contract
(temporal_state, previous/focus/next meetings, previous_completed/active/next/
default_analysis sessions with availability). Every valid canonical payload now
maps to a designed state via a total resolveViewState; a well-formed response
can never fall through to the limited-data placeholder.
- Make the canonical read the single source of truth: useWeekendContext no longer
fans out to season/meetings/per-weekend/OpenF1/live queries. Only supplementary
championship + news reads run, and only once the canonical context resolves.
- Fix the Prepare/analysis flow: /preview is a stable alias that renders the
preparation surface (PreSessionView) instead of redirecting back to the same
between-races screen.
- One primary navigation system per breakpoint: the mobile top-bar links are
hidden so the bottom bar is the sole primary nav, and Admin is moved out of
every Primary landmark into an operator-utilities toolbar.
- Add Vitest coverage for the contract mapping, every temporal state, loading/
error/limited surfaces, the no-fanout guarantee, the /preview CTA, and the nav
hierarchy; add hermetic Playwright journeys (seeded + injected canonical
payloads), 390/768/1440 overflow checks, and Weekend visual snapshots. Retire
the stale Command Center specs/snapshots.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-12 18:38:08 -04:00
|
|
|
</main>
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const view = resolveViewState(context)
|
2026-07-12 18:09:43 -04:00
|
|
|
|
|
|
|
|
return (
|
fix(#73): consume canonical Weekend Context contract and repair navigation
Address the independent review blockers on PR #80 after rebasing onto the
authoritative #72 Weekend Context API.
- Replace the invented frontend WeekendContext with the exact backend contract
(temporal_state, previous/focus/next meetings, previous_completed/active/next/
default_analysis sessions with availability). Every valid canonical payload now
maps to a designed state via a total resolveViewState; a well-formed response
can never fall through to the limited-data placeholder.
- Make the canonical read the single source of truth: useWeekendContext no longer
fans out to season/meetings/per-weekend/OpenF1/live queries. Only supplementary
championship + news reads run, and only once the canonical context resolves.
- Fix the Prepare/analysis flow: /preview is a stable alias that renders the
preparation surface (PreSessionView) instead of redirecting back to the same
between-races screen.
- One primary navigation system per breakpoint: the mobile top-bar links are
hidden so the bottom bar is the sole primary nav, and Admin is moved out of
every Primary landmark into an operator-utilities toolbar.
- Add Vitest coverage for the contract mapping, every temporal state, loading/
error/limited surfaces, the no-fanout guarantee, the /preview CTA, and the nav
hierarchy; add hermetic Playwright journeys (seeded + injected canonical
payloads), 390/768/1440 overflow checks, and Weekend visual snapshots. Retire
the stale Command Center specs/snapshots.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-12 18:38:08 -04:00
|
|
|
<main
|
|
|
|
|
className="wk-page"
|
|
|
|
|
data-testid="weekend-page"
|
|
|
|
|
data-state={view}
|
|
|
|
|
data-temporal-state={context.temporal_state}
|
|
|
|
|
data-preview={preview ? 'true' : undefined}
|
2026-07-12 19:40:04 -04:00
|
|
|
data-meeting-key={focusMeetingKey ?? undefined}
|
|
|
|
|
data-session-key={focusSessionKey ?? undefined}
|
fix(#73): consume canonical Weekend Context contract and repair navigation
Address the independent review blockers on PR #80 after rebasing onto the
authoritative #72 Weekend Context API.
- Replace the invented frontend WeekendContext with the exact backend contract
(temporal_state, previous/focus/next meetings, previous_completed/active/next/
default_analysis sessions with availability). Every valid canonical payload now
maps to a designed state via a total resolveViewState; a well-formed response
can never fall through to the limited-data placeholder.
- Make the canonical read the single source of truth: useWeekendContext no longer
fans out to season/meetings/per-weekend/OpenF1/live queries. Only supplementary
championship + news reads run, and only once the canonical context resolves.
- Fix the Prepare/analysis flow: /preview is a stable alias that renders the
preparation surface (PreSessionView) instead of redirecting back to the same
between-races screen.
- One primary navigation system per breakpoint: the mobile top-bar links are
hidden so the bottom bar is the sole primary nav, and Admin is moved out of
every Primary landmark into an operator-utilities toolbar.
- Add Vitest coverage for the contract mapping, every temporal state, loading/
error/limited surfaces, the no-fanout guarantee, the /preview CTA, and the nav
hierarchy; add hermetic Playwright journeys (seeded + injected canonical
payloads), 390/768/1440 overflow checks, and Weekend visual snapshots. Retire
the stale Command Center specs/snapshots.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-12 18:38:08 -04:00
|
|
|
>
|
2026-07-12 19:40:04 -04:00
|
|
|
{hasFocus && (
|
|
|
|
|
<WeekendFocusBanner meetingKey={focusMeetingKey} sessionKey={focusSessionKey} />
|
|
|
|
|
)}
|
fix(#73): consume canonical Weekend Context contract and repair navigation
Address the independent review blockers on PR #80 after rebasing onto the
authoritative #72 Weekend Context API.
- Replace the invented frontend WeekendContext with the exact backend contract
(temporal_state, previous/focus/next meetings, previous_completed/active/next/
default_analysis sessions with availability). Every valid canonical payload now
maps to a designed state via a total resolveViewState; a well-formed response
can never fall through to the limited-data placeholder.
- Make the canonical read the single source of truth: useWeekendContext no longer
fans out to season/meetings/per-weekend/OpenF1/live queries. Only supplementary
championship + news reads run, and only once the canonical context resolves.
- Fix the Prepare/analysis flow: /preview is a stable alias that renders the
preparation surface (PreSessionView) instead of redirecting back to the same
between-races screen.
- One primary navigation system per breakpoint: the mobile top-bar links are
hidden so the bottom bar is the sole primary nav, and Admin is moved out of
every Primary landmark into an operator-utilities toolbar.
- Add Vitest coverage for the contract mapping, every temporal state, loading/
error/limited surfaces, the no-fanout guarantee, the /preview CTA, and the nav
hierarchy; add hermetic Playwright journeys (seeded + injected canonical
payloads), 390/768/1440 overflow checks, and Weekend visual snapshots. Retire
the stale Command Center specs/snapshots.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-12 18:38:08 -04:00
|
|
|
{renderState(view, { context, now, championship, briefing, preview })}
|
2026-07-12 18:09:43 -04:00
|
|
|
</main>
|
|
|
|
|
)
|
|
|
|
|
}
|