import { useState, Fragment } from 'react' import { Link } from 'react-router-dom' import { useQuery, useQueryClient } from '@tanstack/react-query' import api from '../../utils/api' import { formatDuration, formatDistance } from '../../utils/format' const MEDALS = { 1: '🥇', 2: '🥈', 3: '🥉' } // Compact +M:SS gap label (fastest effort shows nothing) — mirrors RouteLeaderboard. function gapLabel(gapS) { if (gapS == null || gapS <= 0.5) return null return `+${formatDuration(gapS)}` } // Top-10 leaderboard for a single segment, styled to match RouteLeaderboard. function Leaderboard({ segmentId, activityId }) { const { data } = useQuery({ queryKey: ['segment', segmentId], queryFn: () => api.get(`/segments/${segmentId}`).then(r => r.data), }) if (!data) return

Loading…

if (!data.leaderboard?.length) return

No efforts yet — still matching.

const top = data.leaderboard.slice(0, 10) const fastest = top[0].duration_s return ( {top.map((e) => { const isCurrent = e.activity_id === activityId const gap = gapLabel(e.duration_s - fastest) return ( ) })}
# Activity Time Δ
{e.rank === 1 ? '🏆' : e.rank} {e.activity_name} {formatDuration(e.duration_s)} {gap == null ? '--' : gap}
) } export default function SegmentsPanel({ segments, activityId }) { const qc = useQueryClient() const [open, setOpen] = useState(null) const remove = async (id) => { if (!confirm('Delete this segment?')) return await api.delete(`/segments/${id}`) qc.invalidateQueries() } return (
{segments.map(seg => { const isPodium = seg.rank && seg.rank <= 3 const delta = seg.best_s != null ? seg.duration_s - seg.best_s : null const isOpen = open === seg.segment_id return ( {isOpen && ( )} ) })}
Segment This run Best Place
{formatDuration(seg.duration_s)} {seg.best_s != null ? formatDuration(seg.best_s) : '--'} {isPodium ? {MEDALS[seg.rank]} : delta != null ? +{formatDuration(delta)} : --}
) }