974 B38 lines
Blame
1"use client";
2
3import { useState, useEffect } from "react";
4
5function format(ms: number): string {
6 if (ms < 1000) return "<1s";
7 const s = Math.floor(ms / 1000);
8 if (s < 60) return `${s}s`;
9 const m = Math.floor(s / 60);
10 const rem = s % 60;
11 return rem > 0 ? `${m}m ${rem}s` : `${m}m`;
12}
13
14function parseDate(dateStr: string): number {
15 const normalized = dateStr.endsWith("Z") || dateStr.includes("+") || dateStr.includes("T")
16 ? dateStr
17 : dateStr + "Z";
18 return new Date(normalized).getTime();
19}
20
21export function ElapsedTime({ since }: { since: string }) {
22 const [elapsed, setElapsed] = useState<number | null>(null);
23
24 useEffect(() => {
25 const update = () => {
26 setElapsed(Math.max(0, Date.now() - parseDate(since)));
27 };
28 update();
29 const interval = setInterval(() => {
30 update();
31 }, 1000);
32 return () => clearInterval(interval);
33 }, [since]);
34
35 if (elapsed === null) return <>--</>;
36 return <>{format(elapsed)}</>;
37}
38