{workout.name}
{exercises.length} övningar
import { useState } from 'react' import { Icon } from '../components/Icons' import ExercisePicker from '../components/ExercisePicker' import { useDraftWorkout } from '../hooks/useDraftWorkout' import './WorkoutEditPage.css' export default function WorkoutEditPage({ workout, onBack, onSave }) { const { exercises, setExercises, clearDraft, hasDraft, restoreDraft } = useDraftWorkout(workout.id, workout.exercises || []) const [pickerOpen, setPickerOpen] = useState(false) const [swapIndex, setSwapIndex] = useState(null) // null = adding, number = swapping const [saving, setSaving] = useState(false) const [error, setError] = useState(null) const [syncStatus, setSyncStatus] = useState('idle') // idle | saving | saved | error const [draftPromptShown, setDraftPromptShown] = useState(false) // Show draft recovery prompt on first render const handleRecoverDraft = () => { if (hasDraft && !draftPromptShown) { setDraftPromptShown(true) // Prompt is shown via conditional rendering below } } const handleOpenPicker = (index = null) => { setSwapIndex(index) setPickerOpen(true) } const handleSelectExercise = (exercise) => { if (swapIndex !== null) { // Swap setExercises(prev => prev.map((ex, i) => { if (i === swapIndex) { return { ...ex, exercise_id: exercise.id, name: exercise.name, muscle_group: exercise.muscle_group, // Keep existing sets/reps } } return ex })) } else { // Add setExercises(prev => [...prev, { exercise_id: exercise.id, name: exercise.name, muscle_group: exercise.muscle_group, sets: 3, reps_min: 8, reps_max: 12 }]) } setPickerOpen(false) } const handleRemove = (index) => { setExercises(prev => prev.filter((_, i) => i !== index)) } const handleUpdate = (index, field, value) => { setExercises(prev => prev.map((ex, i) => { if (i === index) { return { ...ex, [field]: value } } return ex })) // Clear error state on user edit if (error) setError(null) } const handleSave = async () => { setSaving(true) setSyncStatus('saving') setError(null) try { // Format for API const payload = { exercises: exercises.map(ex => ({ exercise_id: ex.exercise_id || ex.id, // Handle both structures sets: parseInt(ex.sets) || 3, reps_min: parseInt(ex.reps_min) || 8, reps_max: parseInt(ex.reps_max) || 12 })) } await onSave(workout.id, payload) // Success: clear draft and show confirmation clearDraft() setSyncStatus('saved') // Reset status after 2 seconds setTimeout(() => setSyncStatus('idle'), 2000) } catch (err) { console.error('Failed to save workout:', err) setError(err.message || 'Sparning misslyckades. Försök igen.') setSyncStatus('error') // Keep draft on error so user doesn't lose work } finally { setSaving(false) } } const handleRetry = () => { handleSave() } const handleDiscardDraft = () => { clearDraft() setDraftPromptShown(true) // Reset exercises to original setExercises(workout.exercises || []) } // Show draft recovery prompt if we have a draft and haven't shown it yet const showDraftPrompt = hasDraft && !draftPromptShown if (showDraftPrompt) { handleRecoverDraft() } return (
Vi hittade ett utkast från din senaste redigering. Vill du fortsätta eller börja om?
{exercises.length} övningar