Files
proof-of-work/workout-planner/app/main/workouts/new/page.tsx
T
2026-02-28 09:27:26 -06:00

94 lines
2.8 KiB
TypeScript

import { redirect } from "next/navigation";
import Link from "next/link";
import { ChevronLeft } from "lucide-react";
import { getCurrentUser } from "@/lib/auth";
import { getExercises } from "@/lib/db/exercises";
import { getWorkoutById } from "@/lib/db/workouts";
import WorkoutForm, { EditWorkoutData } from "@/components/workouts/WorkoutForm";
export const metadata = {
title: "Log Workout",
description: "Log a new workout",
};
export default async function NewWorkoutPage({
searchParams,
}: {
searchParams: { edit?: string };
}) {
const user = await getCurrentUser();
if (!user) {
redirect("/auth/login");
}
const exercises = await getExercises(user.id);
// If ?edit=WORKOUT_ID, fetch existing workout for editing
let editWorkout: EditWorkoutData | undefined;
if (searchParams.edit) {
const workout = await getWorkoutById(searchParams.edit);
if (workout && workout.userId === user.id) {
// Group sets by exercise
const grouped: Record<string, EditWorkoutData["exercises"][number]> = {};
for (const set of workout.setLogs) {
const exId = set.exercise.id;
if (!grouped[exId]) {
grouped[exId] = {
exercise: set.exercise,
sets: [],
};
}
grouped[exId].sets.push({
setNumber: set.setNumber,
reps: set.reps ?? undefined,
weight: set.weight ?? undefined,
rpe: set.rpe ?? undefined,
notes: set.notes ?? undefined,
});
}
editWorkout = {
id: workout.id,
name: workout.name || "",
date: workout.date.toISOString(),
durationMinutes: workout.durationMinutes,
difficulty: workout.difficulty,
caloriesBurned: (workout as any).caloriesBurned ?? null,
notes: workout.notes,
exercises: Object.values(grouped),
};
}
}
const isEditing = !!editWorkout;
return (
<div className="min-h-screen bg-[#0A0A0A] pb-24 md:pb-8">
{/* Header */}
<div className="border-b border-zinc-800 sticky top-0 z-40 bg-[#0A0A0A]">
<div className="max-w-2xl mx-auto px-4 py-4 flex items-center gap-4">
<Link
href={isEditing ? `/main/workouts/${editWorkout!.id}` : "/main/workouts"}
className="p-2 hover:bg-zinc-900 rounded-lg -ml-2 text-zinc-400 hover:text-white"
aria-label="Back"
>
<ChevronLeft className="w-6 h-6" />
</Link>
<h1 className="text-2xl font-display text-white tracking-wider">
{isEditing ? "Edit Workout" : "Log Workout"}
</h1>
</div>
</div>
{/* Form */}
<div className="max-w-2xl mx-auto px-4 py-6 pb-12">
<WorkoutForm
exercises={exercises}
recentlyUsedExercises={[]}
editWorkout={editWorkout}
/>
</div>
</div>
);
}