import { useState } from 'react' import { Link } from 'react-router-dom' import { useQuery } from '@tanstack/react-query' 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 [sport, setSport] = useState('all') const [page, setPage] = useState(1) const { data: activities, isLoading } = useQuery({ queryKey: ['activities', sport, page], queryFn: () => api.get('/activities/', { params: { sport_type: sport === 'all' ? undefined : sport, page, per_page: 20, }, }).then(r => r.data), }) return (

Activities

+ Import
{/* 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}
)}
) }