"use client"; import { useState, useEffect, useCallback } from "react"; import { useRouter } from "next/navigation"; import { AuthGuard } from "@/components/auth/AuthGuard"; import { Navbar } from "@/components/layout/Navbar"; import { BottomNav } from "@/components/layout/BottomNav"; import { Button } from "@/components/ui/Button"; import { Spinner } from "@/components/ui/Spinner"; import { api } from "@/lib/api"; import { EquipmentStep } from "@/components/onboarding/EquipmentStep"; import { GoalsStep } from "@/components/onboarding/GoalsStep"; import { WorkoutTypesStep } from "@/components/onboarding/WorkoutTypesStep"; import { ScheduleStep } from "@/components/onboarding/ScheduleStep"; import { DurationStep } from "@/components/onboarding/DurationStep"; import { MusclesStep } from "@/components/onboarding/MusclesStep"; import { InjuryStep } from "@/components/onboarding/InjuryStep"; import { ExcludedExercisesStep } from "@/components/onboarding/ExcludedExercisesStep"; import type { InjuryType } from "@/lib/types"; interface PreferencesData { equipment_ids: number[]; muscle_ids: number[]; workout_type_ids: number[]; fitness_level: number; primary_goal: string; secondary_goal: string; days_per_week: number; preferred_workout_duration: number; preferred_days: number[]; injury_types: InjuryType[]; excluded_exercise_ids: number[]; } export default function PreferencesPage() { const router = useRouter(); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [error, setError] = useState(""); const [preferences, setPreferences] = useState({ equipment_ids: [], muscle_ids: [], workout_type_ids: [], fitness_level: 1, primary_goal: "general_fitness", secondary_goal: "", days_per_week: 4, preferred_workout_duration: 45, preferred_days: [], injury_types: [], excluded_exercise_ids: [], }); useEffect(() => { async function fetchExisting() { try { const existing = await api.getPreferences(); setPreferences({ equipment_ids: existing.available_equipment.map((e) => e.id), muscle_ids: existing.target_muscle_groups.map((m) => m.id), workout_type_ids: existing.preferred_workout_types.map((w) => w.id), fitness_level: existing.fitness_level || 1, primary_goal: existing.primary_goal || "general_fitness", secondary_goal: existing.secondary_goal || "", days_per_week: existing.days_per_week || 4, preferred_workout_duration: existing.preferred_workout_duration || 45, preferred_days: existing.preferred_days || [], injury_types: existing.injury_types || [], excluded_exercise_ids: existing.excluded_exercises || [], }); } catch { // No existing preferences - use defaults } finally { setLoading(false); } } fetchExisting(); }, []); const updatePreferences = useCallback( (updates: Partial) => { setPreferences((prev) => ({ ...prev, ...updates })); }, [] ); const handleSave = async () => { setSaving(true); setError(""); try { await api.updatePreferences({ ...preferences }); router.push("/dashboard"); } catch (err) { console.error("Failed to save preferences:", err); setError("Failed to save preferences. Please try again."); } finally { setSaving(false); } }; return (

Preferences

{loading ? (
) : (
{/* 1. Equipment */}
updatePreferences({ equipment_ids: ids })} />

{/* 2. Goals */}
updatePreferences(data)} />

{/* 3. Workout Types */}
updatePreferences({ workout_type_ids: ids }) } />

{/* 4. Schedule */}
updatePreferences(data)} />

{/* 5. Duration */}
updatePreferences({ preferred_workout_duration: min }) } />

{/* 6. Target Muscles */}
updatePreferences({ muscle_ids: ids })} />

{/* 7. Injuries */}
updatePreferences({ injury_types: injuries }) } />

{/* 8. Excluded Exercises */}
updatePreferences({ excluded_exercise_ids: ids }) } />
)} {/* Sticky save bar */} {!loading && (
{error && ( {error} )}
)}
); }