import { useParams } from 'react-router-dom' import { useQuery } from '@tanstack/react-query' import { useState, useMemo } from 'react' import api from '../utils/api' import ActivityMap from '../components/activity/ActivityMap' import MetricTimeline from '../components/activity/MetricTimeline' import HRZoneBar from '../components/activity/HRZoneBar' import LapTable from '../components/activity/LapTable' import StatCard from '../components/ui/StatCard' import { formatDuration, formatDistance, formatPace, formatElevation, formatHeartRate, formatDateTime, sportIcon, } from '../utils/format' const METRICS = [ { key: 'heart_rate', label: 'Heart Rate', unit: 'bpm', color: '#f43f5e' }, { key: 'speed_ms', label: 'Pace / Speed', unit: '', color: '#3b82f6' }, { key: 'altitude_m', label: 'Elevation', unit: 'm', color: '#84cc16' }, { key: 'cadence', label: 'Cadence', unit: 'rpm', color: '#f97316' }, { key: 'power', label: 'Power', unit: 'W', color: '#a855f7' }, { key: 'temperature_c', label: 'Temperature', unit: '°C', color: '#06b6d4' }, ] export default function ActivityDetailPage() { const { id } = useParams() const [activeMetrics, setActiveMetrics] = useState(['heart_rate', 'speed_ms', 'altitude_m']) const [hoveredDistance, setHoveredDistance] = useState(null) const { data: activity, isLoading } = useQuery({ queryKey: ['activity', id], queryFn: () => api.get(`/activities/${id}`).then(r => r.data), }) const { data: dataPoints } = useQuery({ queryKey: ['activity-points', id], queryFn: () => api.get(`/activities/${id}/data-points?downsample=3`).then(r => r.data), enabled: !!activity, }) const { data: laps } = useQuery({ queryKey: ['activity-laps', id], queryFn: () => api.get(`/activities/${id}/laps`).then(r => r.data), enabled: !!activity, }) const toggleMetric = (key) => { setActiveMetrics(prev => prev.includes(key) ? prev.filter(k => k !== key) : [...prev, key] ) } if (isLoading) { return (
{formatDateTime(activity.start_time)}