fix: parse sidebar timestamps as UTC (append Z suffix)
Backend returns naive UTC timestamps without timezone indicator. JS Date() treats bare ISO strings as local time, causing the timer to compute negative elapsed time (future timestamps). Appending 'Z' forces UTC parsing. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -18,19 +18,21 @@ function formatDuration(totalSeconds: number): string {
|
|||||||
return m > 0 ? `${h}h ${m}m` : `${h}h`
|
return m > 0 ? `${h}h ${m}m` : `${h}h`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function parseUTCTimestamp(st: string): number {
|
||||||
|
// Backend returns naive UTC timestamps without 'Z' suffix.
|
||||||
|
// JS Date() treats bare strings as local time, so append Z to force UTC.
|
||||||
|
return new Date(st.endsWith('Z') ? st : st + 'Z').getTime()
|
||||||
|
}
|
||||||
|
|
||||||
function calcActiveSeconds(startTimes: string[]): number {
|
function calcActiveSeconds(startTimes: string[]): number {
|
||||||
const now = Date.now()
|
const now = Date.now()
|
||||||
return startTimes.reduce((sum, st) => {
|
return startTimes.reduce((sum, st) => {
|
||||||
const elapsed = Math.floor((now - new Date(st).getTime()) / 1000)
|
const elapsed = Math.floor((now - parseUTCTimestamp(st)) / 1000)
|
||||||
return sum + Math.max(0, elapsed)
|
return sum + Math.max(0, elapsed)
|
||||||
}, 0)
|
}, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
export function SidebarStatsBar({ resolved, active, completedMinutes, activeSessionStartTimes }: SidebarStatsBarProps) {
|
export function SidebarStatsBar({ resolved, active, completedMinutes, activeSessionStartTimes }: SidebarStatsBarProps) {
|
||||||
// Debug: remove after fixing
|
|
||||||
if (activeSessionStartTimes.length > 0) {
|
|
||||||
console.log('[SidebarStats] startTimes:', activeSessionStartTimes, 'calcSeconds:', calcActiveSeconds(activeSessionStartTimes), 'now:', Date.now(), 'parsed:', activeSessionStartTimes.map(st => new Date(st).getTime()))
|
|
||||||
}
|
|
||||||
const [liveSeconds, setLiveSeconds] = useState(() => calcActiveSeconds(activeSessionStartTimes))
|
const [liveSeconds, setLiveSeconds] = useState(() => calcActiveSeconds(activeSessionStartTimes))
|
||||||
|
|
||||||
// Tick every second to keep the timer in sync with the session timer
|
// Tick every second to keep the timer in sync with the session timer
|
||||||
|
|||||||
Reference in New Issue
Block a user