import { useState } from 'react' import { Link, useSearchParams, useNavigate } from 'react-router-dom' import { useQuery } from '@tanstack/react-query' import { format } from 'date-fns' import api from '../utils/api' import { formatDuration, formatDistance, formatPace, formatHeartRate, formatDate, sportIcon, sportColor, } from '../utils/format' const SPORTS = ['all', 'running', 'cycling', 'hiking', 'walking'] export default function ActivitiesPage() { const [searchParams] = useSearchParams() const navigate = useNavigate() const [sport, setSport] = useState('all') const [page, setPage] = useState(1) const fromParam = searchParams.get('from') const toParam = searchParams.get('to') const { data: activities, isLoading } = useQuery({ queryKey: ['activities', sport, page, fromParam, toParam], queryFn: () => api.get('/activities/', { params: { sport_type: sport === 'all' ? undefined : sport, page, per_page: 20, from_date: fromParam ? new Date(fromParam).toISOString() : undefined, to_date: toParam ? new Date(toParam + 'T23:59:59').toISOString() : undefined, }, }).then(r => r.data), }) const { data: ytdStats } = useQuery({ queryKey: ['ytd-stats'], queryFn: () => api.get('/activities/stats/ytd').then(r => r.data), }) const clearDateFilter = () => navigate('/activities') return (

Activities

+ Import
{/* YTD stats */} {ytdStats && (
{ytdStats.running_km > 0 && ( πŸƒ {ytdStats.running_km.toFixed(0)} km this year )} {ytdStats.cycling_km > 0 && ( 🚴 {ytdStats.cycling_km.toFixed(0)} km this year )}
)} {/* Date filter chip */} {fromParam && (
Week of {format(new Date(fromParam), 'MMM d, yyyy')}
)} {/* Sport filter */}
{SPORTS.map(s => ( ))}
{/* Activity list */} {isLoading ? (
Loading…
) : (
{activities?.map(activity => ( {/* Sport indicator */}
{sportIcon(activity.sport_type)}
{/* Name + date */}

{activity.name}

{formatDate(activity.start_time)}

{/* Metrics */}

{formatDistance(activity.distance_m)}

distance

{formatDuration(activity.duration_s)}

time

{formatPace(activity.avg_speed_ms, activity.sport_type)}

pace

{formatHeartRate(activity.avg_heart_rate)}

avg HR

{activity.elevation_gain_m ? `↑ ${Math.round(activity.elevation_gain_m)}m` : '--'}

elev

β€Ί ))} {activities?.length === 0 && (

πŸƒ

No activities yet

Import your Garmin or Strava data to get started

)}
)} {/* Pagination */} {activities?.length === 20 && (
Page {page}
)}
) }