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>
|
|
|
|
|
);
|
|
|
|
|
}
|