Files
knur-app/app/running/page.tsx

57 lines
2.1 KiB
TypeScript
Raw Normal View History

2026-06-16 09:43:48 +02:00
import Link from "next/link";
import { Activity } from "lucide-react";
import { EmptyState } from "@/components/empty-state";
import { SyncButton } from "@/components/sync-button";
import { formatDateShort, formatDistance, formatDuration, formatPace } from "@/lib/format";
import { listRunningActivities } from "@/lib/models/running";
2026-06-18 11:02:31 +02:00
import { getCurrentUserId } from "@/lib/session";
2026-06-16 09:43:48 +02:00
export const dynamic = "force-dynamic";
export default async function RunningPage() {
2026-06-18 11:02:31 +02:00
const userId = await getCurrentUserId();
const activities = await listRunningActivities(userId);
2026-06-16 09:43:48 +02:00
return (
<div className="flex flex-col gap-6">
<div className="flex items-center justify-between">
<div>
<h1 className="text-2xl font-bold text-fg">Bieganie</h1>
<p className="mt-1 text-sm text-fg/60">Aktywności zsynchronizowane z Garmin Connect.</p>
</div>
<SyncButton />
</div>
{activities.length === 0 ? (
<EmptyState
icon={<Activity size={32} />}
title="Brak biegów"
description="Zsynchronizuj aktywności z Garmin Connect, aby zobaczyć tutaj swoje biegi."
/>
) : (
<ul className="flex flex-col gap-3">
{activities.map((activity) => (
<li key={activity._id.toString()}>
<Link
href={`/running/${activity._id.toString()}`}
className="flex items-center justify-between rounded-lg border border-muted/40 bg-surface p-4 transition-colors hover:border-accent/60"
>
<div>
<div className="font-semibold text-fg">{activity.name}</div>
<div className="text-sm text-fg/60">{formatDateShort(activity.startTime)}</div>
</div>
<div className="flex flex-col items-end text-sm text-fg/60">
<span>{formatDistance(activity.distanceM)}</span>
<span>
{formatDuration(activity.durationSec)} · {formatPace(activity.avgPaceSecPerKm)}
</span>
</div>
</Link>
</li>
))}
</ul>
)}
</div>
);
}