"use client"; import { useEffect } from "react"; const INTERVAL_MS = 20_000; /** Держит lastSeenAt свежим, пока вкладка открыта и видима — "онлайн" на клиенте вычисляется как lastSeenAt моложе ~30с. */ export function PresenceHeartbeat() { useEffect(() => { function ping() { if (document.visibilityState === "visible") { fetch("/api/presence/heartbeat", { method: "POST" }).catch(() => {}); } } ping(); const interval = setInterval(ping, INTERVAL_MS); document.addEventListener("visibilitychange", ping); return () => { clearInterval(interval); document.removeEventListener("visibilitychange", ping); }; }, []); return null; }