102 lines
3.0 KiB
TypeScript
Raw Normal View History

2023-02-23 19:13:27 +01:00
import type { LightNode } from "@waku/interfaces";
2022-06-17 10:48:15 +10:00
import ChatList from "./ChatList";
import MessageInput from "./MessageInput";
2023-02-23 19:13:27 +01:00
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 { useEffect, useState } from "react";
interface Props {
messages: Message[];
commandHandler: (cmd: string) => void;
nick: string;
}
export default function Room(props: Props) {
2023-02-23 11:45:31 +01:00
const { node } = useWaku<LightNode>();
const { encoder } = useContentPair();
2023-02-23 19:13:27 +01:00
const { push: onPush } = useLightPush({ node, encoder });
const onSend = async (text: string) => {
if (!onPush) {
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 });
}
};
2022-06-17 10:48:15 +10:00
const [storePeers, setStorePeers] = useState(0);
const [filterPeers, setFilterPeers] = useState(0);
const [lightPushPeers, setLightPushPeers] = useState(0);
2022-06-17 10:48:15 +10:00
const [bootstrapPeers, setBootstrapPeers] = useState(new Set<string>());
const [peerExchangePeers, setPeerExchangePeers] = useState(new Set<string>());
2022-06-17 10:48:15 +10:00
useEffect(() => {
2023-02-23 11:45:31 +01:00
if (!node) return;
2022-06-17 10:48:15 +10:00
// Update store peer when new peer connected & identified
2023-02-23 11:45:31 +01:00
node.libp2p.peerStore.addEventListener("change:protocols", async (evt) => {
const { peerId } = evt.detail;
2023-02-23 11:45:31 +01:00
const tags = (await node.libp2p.peerStore.getTags(peerId)).map(
(t) => t.name
);
if (tags.includes("peer-exchange")) {
setPeerExchangePeers((peers) => new Set(peers).add(peerId.toString()));
} else {
setBootstrapPeers((peers) => new Set(peers).add(peerId.toString()));
}
2023-02-23 11:45:31 +01:00
const storePeers = await node.store.peers();
setStorePeers(storePeers.length);
2023-02-23 11:45:31 +01:00
const filterPeers = await node.filter.peers();
setFilterPeers(filterPeers.length);
2023-02-23 11:45:31 +01:00
const lightPushPeers = await node.lightPush.peers();
setLightPushPeers(lightPushPeers.length);
2022-06-17 10:48:15 +10:00
});
2023-02-23 11:45:31 +01:00
}, [node]);
2022-06-17 10:48:15 +10:00
useEffect(() => {
console.log("Bootstrap Peers:");
console.table(bootstrapPeers);
console.log("Peer Exchange Peers:");
console.table(peerExchangePeers);
}, [bootstrapPeers, peerExchangePeers]);
2022-06-17 10:48:15 +10:00
return (
<div
className="chat-container"
style={{ height: "98vh", display: "flex", flexDirection: "column" }}
>
<TitleBar
leftIcons={[
`Peers: ${lightPushPeers} light push, ${filterPeers} filter, ${storePeers} store.`,
]}
rightIcons={[
`Bootstrap (DNS Discovery): ${bootstrapPeers.size}, Peer exchange: ${peerExchangePeers.size}. `,
"View console for more details.",
]}
2022-06-17 10:48:15 +10:00
title="Waku v2 chat app"
/>
<ChatList messages={props.messages} />
2023-02-23 19:13:27 +01:00
<MessageInput sendMessage={onSend} />
2022-06-17 10:48:15 +10:00
</div>
);
}