"use client"; import { motion, AnimatePresence } from "motion/react"; import { useState } from "react"; export type PeerStatus = "idle" | "working" | "dnd" | "offline"; export type MessageType = "ask_mesh" | "self_nominate" | "direct" | "broadcast"; export interface StreamPeer { id: string; name: string; status: PeerStatus; /** e.g. "macOS · payments-api" or "iOS · push-relay" */ machine: string; surface?: "terminal" | "phone" | "slack"; } export interface StreamMessage { /** stable unique key */ key: string; /** peer id or display name */ from: string; /** peer id, "tag:xxx", "*", or null (self-nominate) */ to: string | null; type: MessageType; /** plaintext for demo, undefined for live (broker never sees it) */ text?: string; /** truncated base64url — what the broker actually sees */ ciphertext: string; /** absolute time, optional — used by live dashboard */ createdAt?: Date; } const STATUS_DOT: Record = { idle: "bg-emerald-500", working: "bg-[var(--cm-clay)] animate-pulse", dnd: "bg-[#c46686]", offline: "bg-[var(--cm-fg-tertiary)]", }; const TYPE_CHIP: Record = { ask_mesh: { label: "broadcast", className: "border-[var(--cm-border)] bg-[var(--cm-bg)] text-[var(--cm-clay)]", }, broadcast: { label: "broadcast", className: "border-[var(--cm-border)] bg-[var(--cm-bg)] text-[var(--cm-clay)]", }, self_nominate: { label: "hand-raise", className: "border-emerald-500/40 bg-emerald-500/10 text-emerald-500", }, direct: { label: "direct", className: "border-[var(--cm-border)] bg-[var(--cm-bg)] text-[var(--cm-fg-secondary)]", }, }; const TYPE_ICON: Record = { ask_mesh: ( ), broadcast: ( ), self_nominate: ( ), direct: ( ), }; const surfaceGlyph = (s?: StreamPeer["surface"]) => { if (s === "phone") return ( ); if (s === "slack") return ( ); return ( ); }; const resolveName = (id: string, peers: StreamPeer[]) => peers.find((p) => p.id === id)?.name ?? id; export interface MeshStreamProps { peers: StreamPeer[]; messages: StreamMessage[]; /** text shown in stream header, right of # */ channelLabel?: string; /** override the "N peers online" hint */ peersHint?: string; /** override empty-state message */ emptyLabel?: string; /** footer content (stats / progress bar / timers) */ footer?: React.ReactNode; } export const MeshStream = ({ peers, messages, channelLabel = "live-stream", peersHint, emptyLabel = "Waiting for messages…", footer, }: MeshStreamProps) => { const [focusedPeer, setFocusedPeer] = useState(null); const [hoveredKey, setHoveredKey] = useState(null); const onlineCount = peers.filter((p) => p.status !== "offline").length; const filtered = focusedPeer ? messages.filter((m) => m.from === focusedPeer || m.to === focusedPeer) : messages; return (
{/* peers sidebar */} {/* message stream */}
# {channelLabel} {focusedPeer ? `filtered: ${resolveName(focusedPeer, peers)}` : "all peers · E2E encrypted"}
    {filtered.length === 0 && (
  1. {emptyLabel}
  2. )} {filtered.map((m) => ( setHoveredKey(m.key)} onMouseLeave={() => setHoveredKey(null)} className="group relative" >
    {resolveName(m.from, peers).slice(0, 2)}
    {resolveName(m.from, peers)} {m.to && ( <> {m.to.startsWith("tag:") || m.to === "*" ? m.to : resolveName(m.to, peers)} )} {TYPE_ICON[m.type]} {TYPE_CHIP[m.type].label} {m.createdAt && ( {m.createdAt.toLocaleTimeString()} )}
    {m.text && (

    {m.text}

    )} {hoveredKey === m.key && (
    broker sees only this
    {m.ciphertext} {m.ciphertext && !m.text && "…"}
    )}
    ))}
{footer && (
{footer}
)}
); };