import { useState, useEffect } from 'react' import { experimentManagement, repetitionManagement, userManagement, type Experiment, type ExperimentRepetition, type User } from '../lib/supabase' import { RepetitionDataEntryInterface } from './RepetitionDataEntryInterface' export function DataEntry() { const [experiments, setExperiments] = useState([]) const [experimentRepetitions, setExperimentRepetitions] = useState>({}) const [selectedRepetition, setSelectedRepetition] = useState<{ experiment: Experiment; repetition: ExperimentRepetition } | null>(null) const [currentUser, setCurrentUser] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { loadData() }, []) const loadData = async () => { try { setLoading(true) setError(null) const [experimentsData, userData] = await Promise.all([ experimentManagement.getAllExperiments(), userManagement.getCurrentUser() ]) setExperiments(experimentsData) setCurrentUser(userData) // Load repetitions for each experiment const repetitionsMap: Record = {} for (const experiment of experimentsData) { try { const repetitions = await repetitionManagement.getExperimentRepetitions(experiment.id) repetitionsMap[experiment.id] = repetitions } catch (err) { console.error(`Failed to load repetitions for experiment ${experiment.id}:`, err) repetitionsMap[experiment.id] = [] } } setExperimentRepetitions(repetitionsMap) } catch (err: any) { setError(err.message || 'Failed to load data') console.error('Load data error:', err) } finally { setLoading(false) } } const handleRepetitionSelect = (experiment: Experiment, repetition: ExperimentRepetition) => { setSelectedRepetition({ experiment, repetition }) } const handleBackToList = () => { setSelectedRepetition(null) } const getAllRepetitionsWithExperiments = () => { const allRepetitions: Array<{ experiment: Experiment; repetition: ExperimentRepetition }> = [] experiments.forEach(experiment => { const repetitions = experimentRepetitions[experiment.id] || [] repetitions.forEach(repetition => { allRepetitions.push({ experiment, repetition }) }) }) return allRepetitions } const categorizeRepetitions = () => { const allRepetitions = getAllRepetitionsWithExperiments() const now = new Date() const past = allRepetitions.filter(({ repetition }) => repetition.completion_status || (repetition.scheduled_date && new Date(repetition.scheduled_date) < now) ) const inProgress = allRepetitions.filter(({ repetition }) => !repetition.completion_status && repetition.scheduled_date && new Date(repetition.scheduled_date) <= now && new Date(repetition.scheduled_date) > new Date(now.getTime() - 24 * 60 * 60 * 1000) ) const upcoming = allRepetitions.filter(({ repetition }) => !repetition.completion_status && repetition.scheduled_date && new Date(repetition.scheduled_date) > now ) return { past, inProgress, upcoming } } if (loading) { return (

Loading experiments...

) } if (error) { return (
{error}
) } if (selectedRepetition) { return ( ) } return (

Data Entry

Select a repetition to enter measurement data

{/* Repetitions organized by status - flat list */} {(() => { const { past: pastRepetitions, inProgress: inProgressRepetitions, upcoming: upcomingRepetitions } = categorizeRepetitions() return (
{/* Past/Completed Repetitions */}

Past/Completed ({pastRepetitions.length})

Completed or past scheduled repetitions

{pastRepetitions.map(({ experiment, repetition }) => ( ))} {pastRepetitions.length === 0 && (

No completed repetitions

)}
{/* In Progress Repetitions */}

In Progress ({inProgressRepetitions.length})

Currently scheduled or active repetitions

{inProgressRepetitions.map(({ experiment, repetition }) => ( ))} {inProgressRepetitions.length === 0 && (

No repetitions in progress

)}
{/* Upcoming Repetitions */}

Upcoming ({upcomingRepetitions.length})

Future scheduled repetitions

{upcomingRepetitions.map(({ experiment, repetition }) => ( ))} {upcomingRepetitions.length === 0 && (

No upcoming repetitions

)}
) })()} {experiments.length === 0 && (
No experiments available for data entry
)}
) } // RepetitionCard component for displaying individual repetitions interface RepetitionCardProps { experiment: Experiment repetition: ExperimentRepetition onSelect: (experiment: Experiment, repetition: ExperimentRepetition) => void status: 'past' | 'in-progress' | 'upcoming' } function RepetitionCard({ experiment, repetition, onSelect, status }: RepetitionCardProps) { const getStatusColor = () => { switch (status) { case 'past': return 'border-green-200 bg-green-50 hover:bg-green-100' case 'in-progress': return 'border-blue-200 bg-blue-50 hover:bg-blue-100' case 'upcoming': return 'border-yellow-200 bg-yellow-50 hover:bg-yellow-100' default: return 'border-gray-200 bg-gray-50 hover:bg-gray-100' } } const getStatusIcon = () => { switch (status) { case 'past': return '✓' case 'in-progress': return '▶' case 'upcoming': return '⏰' default: return '○' } } return ( ) }