"use client"; import { useState } from "react"; import { Exercise } from "@prisma/client"; import { Loader2 } from "lucide-react"; const EXERCISE_TYPES = [ "barbell", "dumbbell", "machine", "cable", "bodyweight", "cardio", "kettlebell", "other", ]; const MUSCLE_GROUPS = [ "chest", "back", "shoulders", "biceps", "triceps", "forearms", "quads", "hamstrings", "glutes", "calves", "core", "cardio", ]; const INPUT_FIELD_OPTIONS = [ { value: "sets", label: "Sets" }, { value: "reps", label: "Reps" }, { value: "weight", label: "Weight" }, { value: "duration", label: "Duration" }, { value: "distance", label: "Distance" }, { value: "calories", label: "Calories" }, ]; interface AddExerciseFormProps { onExerciseAdded: (exercise: Exercise) => void; } export default function AddExerciseForm({ onExerciseAdded, }: AddExerciseFormProps) { const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [formData, setFormData] = useState({ name: "", type: "barbell", muscleGroups: [] as string[], inputFields: ["sets", "reps", "weight"] as string[], description: "", }); const handleMuscleGroupToggle = (group: string) => { setFormData((prev) => { const groups = prev.muscleGroups.includes(group) ? prev.muscleGroups.filter((g) => g !== group) : [...prev.muscleGroups, group]; return { ...prev, muscleGroups: groups }; }); }; const handleInputFieldToggle = (field: string) => { setFormData((prev) => { const fields = prev.inputFields.includes(field) ? prev.inputFields.filter((f) => f !== field) : [...prev.inputFields, field]; return { ...prev, inputFields: fields }; }); }; // Auto-set sensible input fields when type changes const handleTypeChange = (type: string) => { let defaultFields = ["sets", "reps", "weight"]; if (type === "cardio") { defaultFields = ["sets", "duration", "calories"]; } else if (type === "bodyweight") { defaultFields = ["sets", "reps"]; } setFormData((prev) => ({ ...prev, type, inputFields: defaultFields, })); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(null); setLoading(true); try { const response = await fetch("/api/exercises", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ name: formData.name, type: formData.type, muscleGroups: formData.muscleGroups, inputFields: formData.inputFields, description: formData.description || undefined, }), }); if (!response.ok) { const data = await response.json(); throw new Error(data.error || "Failed to add exercise"); } const exercise = await response.json(); onExerciseAdded(exercise); setFormData({ name: "", type: "barbell", muscleGroups: [], inputFields: ["sets", "reps", "weight"], description: "", }); } catch (err) { setError(err instanceof Error ? err.message : "An error occurred"); } finally { setLoading(false); } }; return (
{error && (
{error}
)} {/* Name */}
setFormData((prev) => ({ ...prev, name: e.target.value })) } className="w-full px-4 py-3 bg-zinc-800 border border-zinc-700 rounded-lg text-white placeholder:text-zinc-500 focus:outline-none focus:ring-2 focus:ring-white/20" placeholder="e.g., Barbell Bench Press" />
{/* Equipment */}
{EXERCISE_TYPES.map((type) => ( ))}
{/* Input Fields */}

What data do you log for this exercise?

{INPUT_FIELD_OPTIONS.map((field) => ( ))}
{/* Muscle Groups */}
{MUSCLE_GROUPS.map((group) => ( ))}
{/* Description */}