/** * @oxpulse/chat-widget — Presence overlay (#121). * * Tracks per-user presence state (online / lastSeenAt) and renders a * presence dot on avatar elements. Driven by onPresence SSE events * via the SDK subscribe() callback + initial getPresence() snapshot. * * Zero-third-party-dep — plain DOM, matching the widget's existing pattern. * * Lifecycle: * 1. On mount: call getPresence() for initial snapshot * 2. onPresence({ userId, lastSeenAt }) → update user's lastSeenAt * 3. Heartbeat: sendPresence(roomId) every 30s (configurable) * 4. destroy() — clears heartbeat interval + presence map * * Presence freshness: a user is "online" if their lastSeenAt is within * FRESHNESS_MS (default 120s — matches server SDK_PRESENCE_FRESHNESS_SECS). */ export interface PresenceOverlayOptions { /** BCP-47 tag or resolved Locale. */ lang?: string; /** The current user's ID — own presence is tracked but not shown on own avatar. */ selfUid: string; /** Optional AbortSignal — destroy() is called automatically on abort. */ signal?: AbortSignal; /** Optional: resolve userId → display name (from roster). Falls back to userId. */ resolveName?: (userId: string) => string | undefined; /** Heartbeat interval in seconds (default 30). */ heartbeatSecs?: number; /** Freshness window in seconds (default 120 — matches server). */ freshnessSecs?: number; } export declare class PresenceOverlay { #private; constructor(opts: PresenceOverlayOptions); /** * Start the heartbeat loop. Calls `sendHeartbeat` immediately, then every * `heartbeatSecs`. Fire-and-forget — errors in sendHeartbeat are swallowed. */ startHeartbeat(sendHeartbeat: () => void): void; /** Update a user's presence from an SSE event or initial snapshot. */ updatePresence(userId: string, lastSeenAt: string | number): void; /** Bulk-set presence from a getPresence() snapshot. */ setSnapshot(entries: Array<{ userId: string; lastSeenAt: string; }>): void; /** Register an avatar element for presence dot updates. */ registerAvatar(userId: string, el: HTMLElement): void; /** Unregister an avatar element (e.g. when a bubble is evicted). */ unregisterAvatar(userId: string): void; /** Check if a user is currently "online" (within freshness window). */ isOnline(userId: string): boolean; /** Get a user's last-seen timestamp (epoch ms), or undefined. */ getLastSeen(userId: string): number | undefined; /** Clear all presence data (e.g. on room switch). */ clearAll(): void; destroy(): void; } //# sourceMappingURL=presence-overlay.d.ts.map