import type { LightNode } from "@waku/interfaces"; import ChatList from "./ChatList"; import MessageInput from "./MessageInput"; import { useWaku, useContentPair, useLightPush, usePeers } from "@waku/react"; import { TitleBar } from "@livechat/ui-kit"; import { Message } from "./Message"; import { ChatMessage } from "./chat_message"; import { useNodePeers } from "./hooks"; interface Props { messages: Message[]; commandHandler: (cmd: string) => void; nick: string; } export default function Room(props: Props) { const { node } = useWaku(); const { encoder } = useContentPair(); const { push: onPush } = useLightPush({ node, encoder }); const { bootstrapPeers, peerExchangePeers } = useNodePeers(node); const { storePeers, filterPeers, lightPushPeers } = usePeers({ node }); const onSend = async (text: string) => { if (!onPush || !text) { return; } if (text.startsWith("/")) { props.commandHandler(text); } else { const timestamp = new Date(); const chatMessage = ChatMessage.fromUtf8String( timestamp, props.nick, text ); const payload = chatMessage.encode(); await onPush({ payload, timestamp }); } }; const lightPushPeersLength = orZero(lightPushPeers?.length); const filterPeersLength = orZero(filterPeers?.length); const storePeersLength = orZero(storePeers?.length); const peersMessage = `Peers: ${lightPushPeersLength} light push, ${filterPeersLength} filter, ${storePeersLength} store.`; const bootstrapPeersMessage = `Bootstrap (DNS Discovery): ${bootstrapPeers.size}, Peer exchange: ${peerExchangePeers.size}. `; return (
); } function orZero(value: undefined | number): number { return value || 0; }