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 (
{activity.name}
{formatDate(activity.start_time)}
{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
π
No activities yet
Import your Garmin or Strava data to get started