import { useSyncExternalStore } from "react"; const listeners = new Set<() => void>(); let lastTick = Date.now(); let intervalId: ReturnType | null = null; function ensureClock() { if (intervalId != null || typeof window === "undefined") return; intervalId = setInterval(() => { lastTick = Date.now(); for (const fn of listeners) fn(); }, 30_000); } function subscribe(fn: () => void) { ensureClock(); listeners.add(fn); return () => { listeners.delete(fn); if (listeners.size === 0 && intervalId != null) { clearInterval(intervalId); intervalId = null; } }; } function snapshot() { return lastTick; } function serverSnapshot() { return 0; } /** Returns a timestamp that ticks once every 30 seconds — safe for "is expired" * badges and relative-time labels without making the render impure. */ export function useNow(): number { return useSyncExternalStore(subscribe, snapshot, serverSnapshot); }