"use client"; import { useEffect, useState, 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 { WeeklyPlanGrid } from "@/components/plans/WeeklyPlanGrid"; import { WeekPicker } from "@/components/plans/WeekPicker"; import { Button } from "@/components/ui/Button"; import { Spinner } from "@/components/ui/Spinner"; import { api } from "@/lib/api"; import type { GeneratedWeeklyPlan, WeeklyPreview } from "@/lib/types"; function getCurrentMonday(): string { const now = new Date(); const day = now.getDay(); const diff = day === 0 ? -6 : 1 - day; const monday = new Date(now); monday.setDate(now.getDate() + diff); const yyyy = monday.getFullYear(); const mm = String(monday.getMonth() + 1).padStart(2, "0"); const dd = String(monday.getDate()).padStart(2, "0"); return `${yyyy}-${mm}-${dd}`; } export default function DashboardPage() { const router = useRouter(); const [selectedMonday, setSelectedMonday] = useState(getCurrentMonday); const [plans, setPlans] = useState([]); const [preview, setPreview] = useState(null); const [loading, setLoading] = useState(true); const [generating, setGenerating] = useState(false); const [saving, setSaving] = useState(false); const [confirming, setConfirming] = useState(false); const [error, setError] = useState(""); const fetchPlans = useCallback(async () => { try { try { const prefs = await api.getPreferences(); const hasPrefs = prefs.available_equipment.length > 0 || prefs.preferred_workout_types.length > 0 || prefs.target_muscle_groups.length > 0; if (!hasPrefs) { router.replace("/onboarding"); return; } } catch { router.replace("/onboarding"); return; } const data = await api.getPlans(); setPlans(data); } catch (err) { console.error("Failed to fetch plans:", err); } finally { setLoading(false); } }, [router]); useEffect(() => { fetchPlans(); }, [fetchPlans]); // Clear preview when week changes useEffect(() => { setPreview(null); }, [selectedMonday]); const savedPlan = plans.find((p) => p.week_start_date === selectedMonday); const handleGenerate = async () => { setGenerating(true); setError(""); try { const data = await api.previewPlan(selectedMonday); setPreview(data); } catch (err) { const msg = err instanceof Error ? err.message : "Failed to generate preview"; setError(msg); console.error("Failed to generate preview:", err); } finally { setGenerating(false); } }; const handleConfirm = async () => { if (!savedPlan) return; setConfirming(true); setError(""); try { await api.confirmPlan(savedPlan.id); await fetchPlans(); } catch (err) { const msg = err instanceof Error ? err.message : "Failed to confirm plan"; setError(msg); } finally { setConfirming(false); } }; const handleSave = async () => { if (!preview) return; setSaving(true); setError(""); try { await api.savePlan(preview); setPreview(null); await fetchPlans(); } catch (err) { const msg = err instanceof Error ? err.message : "Failed to save plan"; setError(msg); console.error("Failed to save plan:", err); } finally { setSaving(false); } }; return (

Dashboard

{error && (
{error}
)} {preview?.warnings && preview.warnings.length > 0 && (
Heads up
    {preview.warnings.map((w, i) => (
  • {w}
  • ))}
)} {loading ? (
) : preview ? ( /* ===== Preview mode ===== */

Preview

) : savedPlan ? ( /* ===== Saved plan mode ===== */

This Week's Plan

{savedPlan.generated_workouts.some( (w) => !w.is_rest_day && w.status === "pending" ) && ( )}
) : ( /* ===== No plan ===== */

No plan for this week yet. Let's get started!

)}
); }