@@ -14,8 +14,8 @@ import type { ManifestLine, MetricLine, PluginLink } from "@/lib/plugin-types"
1414import { groupLinesByType } from "@/lib/group-lines-by-type"
1515import { clamp01 , formatCountNumber , formatFixedPrecisionNumber } from "@/lib/utils"
1616import { calculateDeficit , calculatePaceStatus , type PaceStatus } from "@/lib/pace-status"
17- import { buildPaceDetailText , formatCompactDuration , formatDeficitText , formatRunsOutText , getPaceStatusText } from "@/lib/pace-tooltip"
18- import { formatResetTooltipText } from "@/lib/reset-tooltip"
17+ import { buildPaceDetailText , formatDeficitText , formatRunsOutText , getPaceStatusText } from "@/lib/pace-tooltip"
18+ import { formatResetAbsoluteLabel , formatResetRelativeLabel , formatResetTooltipText } from "@/lib/reset-tooltip"
1919
2020interface ProviderCardProps {
2121 name : string
@@ -40,61 +40,6 @@ const PACE_VISUALS: Record<PaceStatus, { dotClass: string }> = {
4040 behind : { dotClass : "bg-red-500" } ,
4141}
4242
43-
44- const RESET_SOON_THRESHOLD_MS = 5 * 60 * 1000
45-
46- function formatResetIn ( nowMs : number , resetsAtIso : string ) : string | null {
47- const resetsAtMs = Date . parse ( resetsAtIso )
48- if ( ! Number . isFinite ( resetsAtMs ) ) return null
49- const deltaMs = resetsAtMs - nowMs
50- if ( deltaMs < RESET_SOON_THRESHOLD_MS ) return "Resets soon"
51- const durationText = formatCompactDuration ( deltaMs ) !
52- return `Resets in ${ durationText } `
53- }
54-
55- const RESET_TIME_FORMATTER = new Intl . DateTimeFormat ( undefined , {
56- hour : "numeric" ,
57- minute : "2-digit" ,
58- } )
59-
60- const RESET_MONTH_FORMATTER = new Intl . DateTimeFormat ( undefined , {
61- month : "short" ,
62- } )
63-
64- function getLocalDayIndex ( timestampMs : number ) : number {
65- const date = new Date ( timestampMs )
66- return Math . floor ( Date . UTC ( date . getFullYear ( ) , date . getMonth ( ) , date . getDate ( ) ) / 86_400_000 )
67- }
68-
69- function getEnglishOrdinalSuffix ( day : number ) : string {
70- const mod100 = day % 100
71- if ( mod100 >= 11 && mod100 <= 13 ) return "th"
72- const mod10 = day % 10
73- if ( mod10 === 1 ) return "st"
74- if ( mod10 === 2 ) return "nd"
75- if ( mod10 === 3 ) return "rd"
76- return "th"
77- }
78-
79- function formatMonthDayWithOrdinal ( timestampMs : number ) : string {
80- const date = new Date ( timestampMs )
81- const monthText = RESET_MONTH_FORMATTER . format ( date )
82- const day = date . getDate ( )
83- return `${ monthText } ${ day } ${ getEnglishOrdinalSuffix ( day ) } `
84- }
85-
86- function formatResetAt ( nowMs : number , resetsAtIso : string ) : string | null {
87- const resetsAtMs = Date . parse ( resetsAtIso )
88- if ( ! Number . isFinite ( resetsAtMs ) ) return null
89- if ( resetsAtMs - nowMs <= 0 ) return "Resets soon"
90- const dayDiff = getLocalDayIndex ( resetsAtMs ) - getLocalDayIndex ( nowMs )
91- const timeText = RESET_TIME_FORMATTER . format ( resetsAtMs )
92- if ( dayDiff <= 0 ) return `Resets today at ${ timeText } `
93- if ( dayDiff === 1 ) return `Resets tomorrow at ${ timeText } `
94- const dateText = formatMonthDayWithOrdinal ( resetsAtMs )
95- return `Resets ${ dateText } at ${ timeText } `
96- }
97-
9843/** Colored dot indicator showing pace status */
9944function PaceIndicator ( {
10045 status,
@@ -421,10 +366,16 @@ function MetricLineRenderer({
421366
422367 const resetLabel = line . resetsAt
423368 ? resetTimerDisplayMode === "absolute"
424- ? formatResetAt ( now , line . resetsAt )
425- : formatResetIn ( now , line . resetsAt )
369+ ? formatResetAbsoluteLabel ( now , line . resetsAt )
370+ : formatResetRelativeLabel ( now , line . resetsAt )
371+ : null
372+ const resetTooltipText = line . resetsAt
373+ ? formatResetTooltipText ( {
374+ nowMs : now ,
375+ resetsAtIso : line . resetsAt ,
376+ visibleMode : resetTimerDisplayMode ,
377+ } )
426378 : null
427- const resetTooltipText = line . resetsAt ? formatResetTooltipText ( line . resetsAt ) : null
428379
429380 const secondaryText =
430381 resetLabel ??
0 commit comments