import { useWaste } from '../store' import type { PeerStatus } from '../store' function makeYawCard(id: string, alias: string): string { const nick = encodeURIComponent(alias.trim().slice(0, 40)) return nick ? `yaw:${id}?n=${nick}` : `yaw:${id}` } function connDot(status: PeerStatus | undefined): { color: string; label: string } { const ct = status?.candidateType const cs = status?.connState if (cs === 'failed' || cs === 'closed') return { color: '#e06060', label: 'failed' } if (cs === 'connecting' || cs === 'new') return { color: '#c8a020', label: 'connecting…' } if (ct === 'relay') return { color: '#c8a020', label: 'relayed (TURN)' } if (ct === 'srflx') return { color: '#60c060', label: 'NAT punched' } if (ct === 'host') return { color: '#60c060', label: 'direct (LAN)' } if (cs === 'connected') return { color: '#60c060', label: 'connected' } return { color: 'var(--muted)', label: 'unknown' } } function formatTs(ts: number | undefined): string { if (!ts) return '—' return new Date(ts).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' }) } export function Sidebar() { const { localPeer, masterId, masterAlias, networks, activeNetworkId, activeRoom, connectedPeers, peerStatus, setActiveRoom, setActiveNetwork, messages, send, } = useWaste() const rooms = ['general'] Object.keys(messages).forEach(r => { if (r.startsWith('dm:') && !rooms.includes(r)) rooms.push(r) }) const displayAlias = localPeer?.alias ?? masterAlias ?? '' const displayId = localPeer?.id ?? masterId ?? '' const card = displayId ? makeYawCard(displayId, displayAlias) : null function openDM(peerId: string) { setActiveRoom(`dm:${peerId}`) } function requestFiles(peerId: string) { send({ type: 'get_file_list', network_id: activeNetworkId ?? undefined, peer_id: peerId }) } return ( ) }