94 lines
2.6 KiB
TypeScript
Raw Normal View History

import type { LightNode } from "@waku/interfaces";
2022-06-17 10:48:15 +10:00
import ChatList from "./ChatList";
import MessageInput from "./MessageInput";
import { useWaku, useContentPair, useLightPush } from "@waku/react";
2022-06-17 10:48:15 +10:00
import { TitleBar } from "@livechat/ui-kit";
import { Message } from "./Message";
import { ChatMessage } from "./chat_message";
import { useNodePeers, usePeers } from "./hooks";
2022-06-17 10:48:15 +10:00
interface Props {
messages: Message[];
commandHandler: (cmd: string) => void;
nick: string;
}
export default function Room(props: Props) {
const { node } = useWaku<LightNode>();
const { encoder } = useContentPair();
const { push: onPush } = useLightPush({ node, encoder });
2022-06-17 10:48:15 +10:00
const {
connectedBootstrapPeers,
connectedPeerExchangePeers,
discoveredBootstrapPeers,
discoveredPeerExchangePeers,
} = useNodePeers(node);
2023-08-02 17:41:54 +05:30
const { allConnected, storePeers, filterPeers, lightPushPeers } = usePeers({
node,
});
2022-06-17 10:48:15 +10:00
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 });
}
};
2023-08-02 17:41:54 +05:30
const allConnectedLength = orZero(allConnected?.length);
const lightPushPeersLength = orZero(lightPushPeers?.length);
const filterPeersLength = orZero(filterPeers?.length);
const storePeersLength = orZero(storePeers?.length);
2022-06-17 10:48:15 +10:00
2023-08-02 17:41:54 +05:30
const peersMessage = `Peers Connected: ${allConnectedLength}
Store: ${storePeersLength}
Filter: ${filterPeersLength}
Light Push: ${lightPushPeersLength}
`;
const protocolsPeersMessage = `Peers Discovered: ${
discoveredBootstrapPeers.size + discoveredPeerExchangePeers.size
}
Bootstrap: ${discoveredBootstrapPeers.size}
Peer Exchange: ${discoveredPeerExchangePeers.size};
Peers Connected: ${
connectedBootstrapPeers.size + connectedPeerExchangePeers.size
}
Bootstrap: ${connectedBootstrapPeers.size}
Peer Exchange: ${connectedPeerExchangePeers.size}
`;
2022-06-17 10:48:15 +10:00
return (
<div
className="chat-container"
style={{ height: "98vh", display: "flex", flexDirection: "column" }}
>
<TitleBar
leftIcons={[peersMessage]}
2023-08-02 17:41:54 +05:30
rightIcons={[protocolsPeersMessage]}
2022-06-17 10:48:15 +10:00
title="Waku v2 chat app"
/>
<ChatList messages={props.messages} />
<MessageInput hasLightPushPeers={!!lightPushPeers} sendMessage={onSend} />
2022-06-17 10:48:15 +10:00
</div>
);
}
function orZero(value: undefined | number): number {
return value || 0;
2022-06-17 10:48:15 +10:00
}