592c86f8d4
Extends GET /api/v1/users/me/nutrition-diary with a `range` query param (7/30/90) that switches it into trend mode -- daily calorie/macro totals bucketed from the same cooking-history rows the single-day diary already reads, with zero-filled days so the chart has a continuous x-axis. New NutritionTrend component reuses the existing hand-rolled TimeSeriesChart (previously admin-only, now imported from user-facing code too) for the calorie line, plus simple average-macro stat tiles below it. Nutrition page now has Diary/Trend tabs instead of just the diary. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
37 lines
1.3 KiB
TypeScript
37 lines
1.3 KiB
TypeScript
import type { Metadata } from "next";
|
|
import { headers } from "next/headers";
|
|
import { auth } from "@/lib/auth/server";
|
|
import { NutritionDiary } from "@/components/nutrition/nutrition-diary";
|
|
import { NutritionTrend } from "@/components/nutrition/nutrition-trend";
|
|
import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs";
|
|
import { getMessages } from "@/lib/i18n/server";
|
|
|
|
export const metadata: Metadata = {};
|
|
|
|
export default async function NutritionDiaryPage() {
|
|
const session = await auth.api.getSession({ headers: await headers() });
|
|
if (!session) return null;
|
|
const m = getMessages((session.user as { locale?: string }).locale);
|
|
|
|
return (
|
|
<div className="space-y-8">
|
|
<div>
|
|
<h1 className="text-2xl font-bold tracking-tight">{m.nutritionDiary.title}</h1>
|
|
<p className="text-muted-foreground mt-1">{m.nutritionDiary.subtitle}</p>
|
|
</div>
|
|
<Tabs defaultValue="diary" className="gap-6">
|
|
<TabsList>
|
|
<TabsTrigger value="diary">{m.nutritionDiary.tabDiary}</TabsTrigger>
|
|
<TabsTrigger value="trend">{m.nutritionDiary.tabTrend}</TabsTrigger>
|
|
</TabsList>
|
|
<TabsContent value="diary">
|
|
<NutritionDiary />
|
|
</TabsContent>
|
|
<TabsContent value="trend">
|
|
<NutritionTrend />
|
|
</TabsContent>
|
|
</Tabs>
|
|
</div>
|
|
);
|
|
}
|