"use client"; import { useEffect, useState, useCallback, useRef } from "react"; import { getBroadcastClient } from "@/lib/broadcast-client"; import type { InAppMessage } from "@bytelyst/broadcast-client"; export function BroadcastBanner() { const [messages, setMessages] = useState([]); const intervalRef = useRef | null>(null); const fetchMessages = useCallback(async () => { try { const { messages: list } = await getBroadcastClient().listMessages(); setMessages(list.filter((m) => m.status !== "dismissed")); } catch { // non-critical } }, []); useEffect(() => { fetchMessages(); intervalRef.current = setInterval(fetchMessages, 5 * 60_000); return () => { if (intervalRef.current) clearInterval(intervalRef.current); }; }, [fetchMessages]); async function dismiss(id: string) { try { await getBroadcastClient().markDismissed(id); } catch { // best-effort } setMessages((prev) => prev.filter((m) => m.id !== id)); } async function handleClick(msg: InAppMessage) { try { await getBroadcastClient().trackClick(msg.id); } catch { // best-effort } if (msg.ctaUrl) window.open(msg.ctaUrl, "_blank", "noopener"); } if (messages.length === 0) return null; return (
{messages.map((msg) => (
{msg.title} {msg.body && {msg.body}} {msg.ctaUrl && ( )}
{msg.dismissible !== false && ( )}
))}
); }