2023-02-28 00:36:17 +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-04-22 01:04:39 +02:00
|
|
|
import { useWaku, useContentPair, useLightPush } from "@waku/react";
|
2022-06-17 10:48:15 +10:00
|
|
|
import { ChatMessage } from "./chat_message";
|
2023-04-22 01:04:39 +02:00
|
|
|
import { useNodePeers, usePeers } from "./hooks";
|
2023-08-03 13:23:17 +05:30
|
|
|
import type { RoomProps } from "./types";
|
2022-06-17 10:48:15 +10:00
|
|
|
|
2023-08-03 13:23:17 +05:30
|
|
|
export default function Room(props: RoomProps) {
|
2023-02-28 00:36:17 +01:00
|
|
|
const { node } = useWaku<LightNode>();
|
|
|
|
|
const { encoder } = useContentPair();
|
|
|
|
|
const { push: onPush } = useLightPush({ node, encoder });
|
2022-06-17 10:48:15 +10:00
|
|
|
|
2023-08-01 17:30:46 +05:30
|
|
|
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
|
|
|
|
2023-02-28 00:36:17 +01:00
|
|
|
const onSend = async (text: string) => {
|
2023-03-02 00:56:20 +01:00
|
|
|
if (!onPush || !text) {
|
2023-02-28 00:36:17 +01:00
|
|
|
return;
|
|
|
|
|
}
|
2023-01-30 20:41:25 +05:30
|
|
|
|
2023-02-28 00:36:17 +01:00
|
|
|
if (text.startsWith("/")) {
|
|
|
|
|
props.commandHandler(text);
|
|
|
|
|
} else {
|
|
|
|
|
const timestamp = new Date();
|
|
|
|
|
const chatMessage = ChatMessage.fromUtf8String(
|
|
|
|
|
timestamp,
|
|
|
|
|
props.nick,
|
|
|
|
|
text
|
2023-01-30 20:41:25 +05:30
|
|
|
);
|
2023-02-28 00:36:17 +01:00
|
|
|
const payload = chatMessage.encode();
|
2022-09-02 14:08:44 +10:00
|
|
|
|
2023-02-28 00:36:17 +01:00
|
|
|
await onPush({ payload, timestamp });
|
|
|
|
|
}
|
|
|
|
|
};
|
2022-09-02 14:08:44 +10:00
|
|
|
|
2023-08-02 17:41:54 +05:30
|
|
|
const allConnectedLength = orZero(allConnected?.length);
|
2023-02-28 00:36:17 +01:00
|
|
|
const lightPushPeersLength = orZero(lightPushPeers?.length);
|
|
|
|
|
const filterPeersLength = orZero(filterPeers?.length);
|
|
|
|
|
const storePeersLength = orZero(storePeers?.length);
|
2022-06-17 10:48:15 +10:00
|
|
|
|
|
|
|
|
return (
|
2023-08-02 17:59:37 +05:30
|
|
|
<div className="h-screen flex flex-col">
|
|
|
|
|
<div className="flex justify-between items-center bg-gray-800 text-white p-4">
|
2023-08-02 18:21:35 +05:30
|
|
|
<div>
|
|
|
|
|
<div>Peers Connected: {allConnectedLength}</div>
|
|
|
|
|
<div className="mt-2">Store: {storePeersLength}</div>
|
|
|
|
|
<div>Filter: {filterPeersLength}</div>
|
|
|
|
|
<div>Light Push: {lightPushPeersLength}</div>
|
|
|
|
|
</div>
|
2023-08-02 18:03:58 +05:30
|
|
|
<div>Waku v2 Web Chat</div>
|
2023-08-02 18:21:35 +05:30
|
|
|
<div>
|
|
|
|
|
<div className="mt-2">
|
|
|
|
|
Peers Discovered:{" "}
|
|
|
|
|
{discoveredBootstrapPeers.size + discoveredPeerExchangePeers.size}
|
|
|
|
|
</div>
|
|
|
|
|
<div>
|
|
|
|
|
Bootstrap: {discoveredBootstrapPeers.size} Peer Exchange:{" "}
|
|
|
|
|
{discoveredPeerExchangePeers.size}
|
|
|
|
|
</div>
|
|
|
|
|
<div className="mt-2">
|
|
|
|
|
Peers Connected:{" "}
|
|
|
|
|
{connectedBootstrapPeers.size + connectedPeerExchangePeers.size}
|
|
|
|
|
</div>
|
|
|
|
|
<div>
|
|
|
|
|
Bootstrap: {connectedBootstrapPeers.size} Peer Exchange:{" "}
|
|
|
|
|
{connectedPeerExchangePeers.size}
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2023-08-02 17:59:37 +05:30
|
|
|
</div>
|
2022-06-17 10:48:15 +10:00
|
|
|
<ChatList messages={props.messages} />
|
2023-02-28 00:36:17 +01:00
|
|
|
<MessageInput hasLightPushPeers={!!lightPushPeers} sendMessage={onSend} />
|
2022-06-17 10:48:15 +10:00
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-28 00:36:17 +01:00
|
|
|
function orZero(value: undefined | number): number {
|
|
|
|
|
return value || 0;
|
2022-06-17 10:48:15 +10:00
|
|
|
}
|