"use client"; import { Trash2, Check, Pencil, CornerDownLeft } from "lucide-react"; import { useState, useCallback } from "react"; export type InputField = "sets" | "reps" | "weight" | "duration" | "distance" | "calories" | "notes"; export interface SetRowProps { setNumber: number; inputFields?: InputField[]; weightUnit?: string; initialReps?: number; initialWeight?: number; initialRpe?: number; initialNotes?: string; initialDuration?: number; initialDistance?: number; initialCalories?: number; initialLocked?: boolean; autoFocus?: boolean; onUpdate: (data: { reps?: number; weight?: number; rpe?: number; notes?: string; durationSeconds?: number; distance?: number; calories?: number; }) => void; onConfirm?: () => void; onNextSet?: (currentValues: { weight?: string; reps?: string; rpe?: string; notes?: string; duration?: string; distance?: string; calories?: string; }) => void; onDelete: () => void; } export default function SetRow({ setNumber, inputFields = ["sets", "reps", "weight"], weightUnit = "lbs", initialReps, initialWeight, initialRpe, initialNotes, initialDuration, initialDistance, initialCalories, initialLocked = false, autoFocus = false, onUpdate, onConfirm, onNextSet, onDelete, }: SetRowProps) { const [reps, setReps] = useState(initialReps?.toString() || ""); const [weight, setWeight] = useState(initialWeight?.toString() || ""); const [rpe, setRpe] = useState(initialRpe?.toString() || ""); const [notes, setNotes] = useState(initialNotes || ""); const [duration, setDuration] = useState(initialDuration?.toString() || ""); const [distance, setDistance] = useState(initialDistance?.toString() || ""); const [calories, setCalories] = useState(initialCalories?.toString() || ""); const [showNotes, setShowNotes] = useState(!!initialNotes); const [locked, setLocked] = useState(initialLocked); const showReps = inputFields.includes("reps"); const showWeight = inputFields.includes("weight"); const showDuration = inputFields.includes("duration"); const showDistance = inputFields.includes("distance"); const showCalories = inputFields.includes("calories"); const showNotesField = inputFields.includes("notes"); const emitUpdate = useCallback( (overrides: { reps?: string; weight?: string; rpe?: string; notes?: string; duration?: string; distance?: string; calories?: string; }) => { const r = overrides.reps ?? reps; const w = overrides.weight ?? weight; const p = overrides.rpe ?? rpe; const n = overrides.notes ?? notes; const dur = overrides.duration ?? duration; const dist = overrides.distance ?? distance; const cal = overrides.calories ?? calories; onUpdate({ reps: r ? parseInt(r) : undefined, weight: w ? parseFloat(w) : undefined, rpe: p ? parseInt(p) : undefined, notes: n || undefined, durationSeconds: dur ? parseInt(dur) : undefined, distance: dist ? parseFloat(dist) : undefined, calories: cal ? parseInt(cal) : undefined, }); }, [reps, weight, rpe, notes, duration, distance, calories, onUpdate] ); const handleConfirm = () => { emitUpdate({}); setLocked(true); onConfirm?.(); }; const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Enter") { e.preventDefault(); handleConfirm(); } }; const handleUnlock = () => { setLocked(false); }; const handleNextSet = () => { emitUpdate({}); setLocked(true); onNextSet?.({ weight, reps, rpe, notes, duration, distance, calories }); }; // Build a summary string for the locked view const buildSummary = () => { const parts: string[] = []; if (showWeight && weight) parts.push(`${weight} ${weightUnit}`); if (showReps && reps) parts.push(`${reps} reps`); if (showDuration && duration) parts.push(`${duration}s`); if (showDistance && distance) parts.push(`${distance} mi`); if (showCalories && calories) parts.push(`${calories} cal`); if (rpe) parts.push(`RPE ${rpe}`); if (showNotesField && notes) parts.push(notes); return parts.length > 0 ? parts.join(" ยท ") : "No data"; }; // ---------- LOCKED VIEW ---------- if (locked) { return (
{buildSummary()}
{!showNotesField && notes && ({notes}
)}