From b03ae55786154fee8498952c85c658c69d275ebd Mon Sep 17 00:00:00 2001 From: iris Date: Sun, 16 Aug 2026 19:00:41 +0200 Subject: [PATCH] swarm-ui: use native Intl.RelativeTimeFormat for fmtAgo, not hand-rolled Answers mara's question on PR#3342 (lightweight dep for fmtAgo?): no dep needed, Intl.RelativeTimeFormat is built into the runtime and its narrow style produces the same '5m ago' shape, verified with a real call rather than assumed from the spec. --- frontend/packages/swarm-ui/src/util.ts | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/frontend/packages/swarm-ui/src/util.ts b/frontend/packages/swarm-ui/src/util.ts index 6aec3416..577b8b88 100644 --- a/frontend/packages/swarm-ui/src/util.ts +++ b/frontend/packages/swarm-ui/src/util.ts @@ -1,15 +1,19 @@ // Small pure render helpers shared across swarm-ui pages. Not folded -// into `@hive/shared` — these are swarm-ui's own formatting choices -// (compact, one unit deep), not a cross-package contract, and the -// dashboard package already has its own near-identical `fmtAgo` in -// `util.js` for the same reason: two small vanilla-vs-Preact call -// sites don't justify a shared abstraction over a five-line function. +// into `@hive/shared` — swarm-ui's formatting choices aren't a +// cross-package contract, and there's nothing here worth sharing. + +// Relative age, coarsened to one unit ("5m ago"). Built on the native +// `Intl.RelativeTimeFormat` (no dependency needed — mara asked whether +// a lightweight package was warranted; the runtime already ships this) +// with `style: 'narrow'`, which produces the same "5s/5m/5h/5d ago" +// shape the dashboard package's hand-rolled equivalent does, verified +// against a real `Intl` call rather than assumed from the spec. +const RTF = new Intl.RelativeTimeFormat('en', { numeric: 'always', style: 'narrow' }); -// Relative age in whole seconds, coarsened to one unit ("5m ago"). export function fmtAgo(ageSeconds: number): string { const age = Math.max(0, Math.floor(ageSeconds)); - if (age < 60) return age + 's ago'; - if (age < 3600) return Math.floor(age / 60) + 'm ago'; - if (age < 86400) return Math.floor(age / 3600) + 'h ago'; - return Math.floor(age / 86400) + 'd ago'; + if (age < 60) return RTF.format(-age, 'second'); + if (age < 3600) return RTF.format(-Math.floor(age / 60), 'minute'); + if (age < 86400) return RTF.format(-Math.floor(age / 3600), 'hour'); + return RTF.format(-Math.floor(age / 86400), 'day'); }