import { useState, useEffect } from 'react'; import { useNavigate, useLocation } from 'react-router-dom'; import { FaSave, FaArrowLeft, FaTrash, FaTimes } from 'react-icons/fa'; import type { Exercise, Equipment, MuscleGroup } from '../types/models'; import { ExerciseService, EquipmentService, MuscleGroupService } from '../services/api'; const NewExercisePage = () => { const navigate = useNavigate(); const location = useLocation(); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const [successMessage, setSuccessMessage] = useState(null); const [exerciseToEdit, setExerciseToEdit] = useState(null); const [isEditMode, setIsEditMode] = useState(false); // Available equipment and muscle groups from API const [availableEquipment, setAvailableEquipment] = useState([]); const [availableMuscleGroups, setAvailableMuscleGroups] = useState([]); // Selected items const [selectedEquipment, setSelectedEquipment] = useState([]); const [selectedMuscleGroups, setSelectedMuscleGroups] = useState([]); // Form state const [formData, setFormData] = useState({ name: '', description: '', equipment: [], muscleGroups: [], sets: [], }); // Fetch equipment and muscle groups from API useEffect(() => { const fetchData = async () => { setIsLoading(true); try { const [equipmentData, muscleGroupsData] = await Promise.all([ EquipmentService.getAll(), MuscleGroupService.getAll() ]); setAvailableEquipment(equipmentData); setAvailableMuscleGroups(muscleGroupsData); } catch (err) { console.error('Failed to fetch data:', err); setError('Failed to load equipment and muscle groups'); } finally { setIsLoading(false); } }; fetchData(); }, []); // Check if we're editing an existing exercise useEffect(() => { if (location.state && location.state.editExercise) { const exercise = location.state.editExercise as Exercise; setFormData(exercise); setSelectedEquipment(exercise.equipment || []); setSelectedMuscleGroups(exercise.muscleGroups || []); setExerciseToEdit(exercise); setIsEditMode(true); } }, [location]); const handleInputChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value, })); }; const handleEquipmentSelect = (e: React.ChangeEvent) => { const equipmentId = parseInt(e.target.value); const equipment = availableEquipment.find(eq => eq.id === equipmentId); if (equipment && !selectedEquipment.some(e => e.id === equipment.id)) { const updatedEquipment = [...selectedEquipment, equipment]; setSelectedEquipment(updatedEquipment); setFormData(prev => ({ ...prev, equipment: updatedEquipment })); } // Reset select to default e.target.value = ''; }; const removeEquipment = (equipmentId?: number) => { if (!equipmentId) return; const updatedEquipment = selectedEquipment.filter(e => e.id !== equipmentId); setSelectedEquipment(updatedEquipment); setFormData(prev => ({ ...prev, equipment: updatedEquipment })); }; const handleMuscleGroupSelect = (e: React.ChangeEvent) => { const muscleGroupId = parseInt(e.target.value); const muscleGroup = availableMuscleGroups.find(mg => mg.id === muscleGroupId); if (muscleGroup && !selectedMuscleGroups.some(mg => mg.id === muscleGroup.id)) { const updatedMuscleGroups = [...selectedMuscleGroups, muscleGroup]; setSelectedMuscleGroups(updatedMuscleGroups); setFormData(prev => ({ ...prev, muscleGroups: updatedMuscleGroups })); } // Reset select to default e.target.value = ''; }; const removeMuscleGroup = (muscleGroupId?: number) => { if (!muscleGroupId) return; const updatedMuscleGroups = selectedMuscleGroups.filter(mg => mg.id !== muscleGroupId); setSelectedMuscleGroups(updatedMuscleGroups); setFormData(prev => ({ ...prev, muscleGroups: updatedMuscleGroups })); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setIsLoading(true); setError(null); try { if (formData.muscleGroups.length === 0) { throw new Error('Please select at least one muscle group'); } if (isEditMode && exerciseToEdit?.id) { // Update existing exercise await ExerciseService.update(exerciseToEdit.id, formData); setSuccessMessage('Exercise updated successfully!'); } else { // Create new exercise await ExerciseService.create(formData); setSuccessMessage('Exercise created successfully!'); // Reset form if creating new if (!isEditMode) { setFormData({ name: '', description: '', equipment: [], muscleGroups: [], sets: [], }); setSelectedEquipment([]); setSelectedMuscleGroups([]); } } // Show success message briefly then redirect setTimeout(() => { navigate('/workouts'); }, 1500); } catch (err: unknown) { console.error('Failed to save exercise:', err); setError('Failed to save exercise. Please try again.'); } finally { setIsLoading(false); } }; const handleDelete = async () => { if (!exerciseToEdit?.id || !confirm('Are you sure you want to delete this exercise?')) { return; } setIsLoading(true); try { await ExerciseService.delete(exerciseToEdit.id); setSuccessMessage('Exercise deleted successfully!'); // Redirect after deletion setTimeout(() => { navigate('/workouts'); }, 1500); } catch (err) { console.error('Failed to delete exercise:', err); setError('Failed to delete exercise. It might be used in one or more routines.'); } finally { setIsLoading(false); } }; return (

{isEditMode ? 'Edit Exercise' : 'New Exercise'}

{error &&
{error}
} {successMessage &&
{successMessage}
}