import React, { useState, useEffect } from 'react'; import { Dumbbell, Scale, Activity, Timer as TimerIcon, ArrowRight, ArrowUp, Plus, CheckCircle, Edit, Trash2 } from 'lucide-react'; import { ExerciseType, Language, SporadicSet } from '../../types'; import { t } from '../../services/i18n'; import FilledInput from '../FilledInput'; import ExerciseModal from '../ExerciseModal'; import { useTracker } from './useTracker'; interface SporadicViewProps { tracker: ReturnType; lang: Language; sporadicSets?: SporadicSet[]; } const SporadicView: React.FC = ({ tracker, lang, sporadicSets }) => { const { searchQuery, setSearchQuery, setShowSuggestions, showSuggestions, filteredExercises, setSelectedExercise, selectedExercise, weight, setWeight, reps, setReps, duration, setDuration, distance, setDistance, height, setHeight, handleLogSporadicSet, sporadicSuccess, setIsSporadicMode, isCreating, setIsCreating, handleCreateExercise, exercises, resetForm } = tracker; const [todaysSets, setTodaysSets] = useState([]); useEffect(() => { if (sporadicSets) { const startOfDay = new Date(); startOfDay.setHours(0, 0, 0, 0); const todayS = sporadicSets.filter(s => s.timestamp >= startOfDay.getTime()); setTodaysSets(todayS.sort((a, b) => b.timestamp - a.timestamp)); } }, [sporadicSets]); const renderSetMetrics = (set: SporadicSet) => { const metrics: string[] = []; if (set.weight) metrics.push(`${set.weight} ${t('weight_kg', lang)}`); if (set.reps) metrics.push(`${set.reps} ${t('reps', lang)}`); if (set.durationSeconds) metrics.push(`${set.durationSeconds} ${t('time_sec', lang)}`); if (set.distanceMeters) metrics.push(`${set.distanceMeters} ${t('dist_m', lang)}`); if (set.height) metrics.push(`${set.height} ${t('height_cm', lang)}`); return metrics.join(' / '); }; return (

{t('quick_log', lang)}

{/* Exercise Selection */}
) => { setSearchQuery(e.target.value); setShowSuggestions(true); }} onFocus={() => { setSearchQuery(''); setShowSuggestions(true); }} onBlur={() => setTimeout(() => setShowSuggestions(false), 100)} icon={} autoComplete="off" type="text" /> {showSuggestions && (
{filteredExercises.length > 0 ? ( filteredExercises.map(ex => ( )) ) : (
{t('no_exercises_found', lang)}
)}
)}
{selectedExercise && (
{/* Unilateral Exercise Toggle */} {selectedExercise.isUnilateral && (
tracker.handleToggleSameValues(e.target.checked)} className="w-5 h-5 rounded border-2 border-outline bg-surface-container-high checked:bg-primary checked:border-primary cursor-pointer" />
)} {/* Input Forms */} {selectedExercise.isUnilateral && !tracker.sameValuesBothSides ? ( /* Separate Left/Right Inputs */
{/* Left Side */}
L {t('left', lang)}
{(selectedExercise.type === ExerciseType.STRENGTH || selectedExercise.type === ExerciseType.BODYWEIGHT || selectedExercise.type === ExerciseType.STATIC) && ( tracker.setWeightLeft(e.target.value)} icon={} /> )} {(selectedExercise.type === ExerciseType.STRENGTH || selectedExercise.type === ExerciseType.BODYWEIGHT || selectedExercise.type === ExerciseType.PLYOMETRIC) && ( tracker.setRepsLeft(e.target.value)} icon={} type="number" /> )} {(selectedExercise.type === ExerciseType.CARDIO || selectedExercise.type === ExerciseType.STATIC) && ( tracker.setDurationLeft(e.target.value)} icon={} /> )} {(selectedExercise.type === ExerciseType.CARDIO || selectedExercise.type === ExerciseType.LONG_JUMP) && ( tracker.setDistanceLeft(e.target.value)} icon={} /> )} {(selectedExercise.type === ExerciseType.HIGH_JUMP) && ( tracker.setHeightLeft(e.target.value)} icon={} /> )}
{/* Right Side */}
R {t('right', lang)}
{(selectedExercise.type === ExerciseType.STRENGTH || selectedExercise.type === ExerciseType.BODYWEIGHT || selectedExercise.type === ExerciseType.STATIC) && ( tracker.setWeightRight(e.target.value)} icon={} /> )} {(selectedExercise.type === ExerciseType.STRENGTH || selectedExercise.type === ExerciseType.BODYWEIGHT || selectedExercise.type === ExerciseType.PLYOMETRIC) && ( tracker.setRepsRight(e.target.value)} icon={} type="number" /> )} {(selectedExercise.type === ExerciseType.CARDIO || selectedExercise.type === ExerciseType.STATIC) && ( tracker.setDurationRight(e.target.value)} icon={} /> )} {(selectedExercise.type === ExerciseType.CARDIO || selectedExercise.type === ExerciseType.LONG_JUMP) && ( tracker.setDistanceRight(e.target.value)} icon={} /> )} {(selectedExercise.type === ExerciseType.HIGH_JUMP) && ( tracker.setHeightRight(e.target.value)} icon={} /> )}
) : ( /* Single Input Form (for bilateral or unilateral with same values) */
{(selectedExercise.type === ExerciseType.STRENGTH || selectedExercise.type === ExerciseType.BODYWEIGHT || selectedExercise.type === ExerciseType.STATIC) && ( setWeight(e.target.value)} icon={} /> )} {(selectedExercise.type === ExerciseType.STRENGTH || selectedExercise.type === ExerciseType.BODYWEIGHT || selectedExercise.type === ExerciseType.PLYOMETRIC) && ( setReps(e.target.value)} icon={} type="number" /> )} {(selectedExercise.type === ExerciseType.CARDIO || selectedExercise.type === ExerciseType.STATIC) && ( setDuration(e.target.value)} icon={} /> )} {(selectedExercise.type === ExerciseType.CARDIO || selectedExercise.type === ExerciseType.LONG_JUMP) && ( setDistance(e.target.value)} icon={} /> )} {(selectedExercise.type === ExerciseType.HIGH_JUMP) && ( setHeight(e.target.value)} icon={} /> )}
)}
)} {/* History Section */} {todaysSets.length > 0 && (

{t('history_section', lang)}

{todaysSets.map(set => (

{set.exerciseName}

{renderSetMetrics(set)}

{/* Edit and Delete buttons can be added here in the future */}
))}
)}
{isCreating && ( setIsCreating(false)} onSave={handleCreateExercise} lang={lang} existingExercises={exercises} /> )}
); }; export default SporadicView;