/** * TabataFit Player Screen * Loads a WorkoutProgram from Supabase and renders the Tabata player. */ import React from 'react' import { View, Text } from 'react-native' import { useLocalSearchParams } from 'expo-router' import { isWorkoutProgramId, parseWorkoutProgramId, fetchProgramById, workoutProgramToTabataSession, } from '@/src/shared/data/workoutPrograms' import { TabataPlayerScreen } from '@/src/features/player/TabataPlayerScreen' import type { TabataSession } from '@/src/shared/types/program' import type { WorkoutProgram } from '@/src/shared/types/workoutProgram' import { NAVY, TEXT } from '@/src/shared/constants/colors' export default function PlayerScreen() { const { id } = useLocalSearchParams<{ id: string }>() const sessionId = id ?? '' if (!isWorkoutProgramId(sessionId)) { return } return } function WorkoutProgramPlayerScreen({ compositeId }: { compositeId: string }) { const [state, setState] = React.useState< | { status: 'loading' } | { status: 'error' } | { status: 'ready'; session: TabataSession; program: WorkoutProgram } >({ status: 'loading' }) React.useEffect(() => { let cancelled = false async function load() { const parsed = parseWorkoutProgramId(compositeId) if (!parsed) { if (!cancelled) setState({ status: 'error' }) return } const program = await fetchProgramById(parsed.programId) if (cancelled) return if (!program) { setState({ status: 'error' }) return } setState({ status: 'ready', session: workoutProgramToTabataSession(program), program, }) } load() return () => { cancelled = true } }, [compositeId]) if (state.status === 'loading') return if (state.status === 'error') return return } function Message({ text }: { text: string }) { return ( {text} ) }