2022-02-04 14:12:00 +11:00
|
|
|
import { WakuMessage } from "js-waku";
|
|
|
|
|
import { ChatContentTopic } from "./App";
|
|
|
|
|
import ChatList from "./ChatList";
|
|
|
|
|
import MessageInput from "./MessageInput";
|
|
|
|
|
import { useWaku } from "./WakuContext";
|
|
|
|
|
import { TitleBar } from "@livechat/ui-kit";
|
|
|
|
|
import { Message } from "./Message";
|
|
|
|
|
import { ChatMessage } from "./chat_message";
|
|
|
|
|
import { useEffect, useState } from "react";
|
2021-04-14 15:13:55 +10:00
|
|
|
|
|
|
|
|
interface Props {
|
2021-07-29 16:30:06 +10:00
|
|
|
messages: Message[];
|
2021-04-22 16:12:28 +10:00
|
|
|
commandHandler: (cmd: string) => void;
|
2021-04-23 14:43:39 +10:00
|
|
|
nick: string;
|
2021-04-14 15:13:55 +10:00
|
|
|
}
|
|
|
|
|
|
2021-04-22 17:03:33 +10:00
|
|
|
export default function Room(props: Props) {
|
2021-04-22 14:57:30 +10:00
|
|
|
const { waku } = useWaku();
|
2021-04-19 12:55:33 +10:00
|
|
|
|
2022-02-02 15:12:08 +11:00
|
|
|
const [storePeers, setStorePeers] = useState(0);
|
|
|
|
|
const [relayPeers, setRelayPeers] = useState(0);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (!waku) return;
|
|
|
|
|
|
2022-02-28 17:23:30 +11:00
|
|
|
// Update relay peer count on heartbeat
|
|
|
|
|
waku.relay.on("gossipsub:heartbeat", () => {
|
|
|
|
|
setRelayPeers(waku.relay.getPeers().size);
|
|
|
|
|
});
|
2022-02-02 15:12:08 +11:00
|
|
|
}, [waku]);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (!waku) return;
|
|
|
|
|
|
2022-02-28 17:23:30 +11:00
|
|
|
// Update store peer when new peer connected & identified
|
|
|
|
|
waku.libp2p.peerStore.on("change:protocols", async () => {
|
2022-02-02 15:12:08 +11:00
|
|
|
let counter = 0;
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
|
|
|
for await (const _peer of waku.store.peers) {
|
|
|
|
|
counter++;
|
|
|
|
|
}
|
|
|
|
|
setStorePeers(counter);
|
2022-02-28 17:23:30 +11:00
|
|
|
});
|
|
|
|
|
}, [waku]);
|
2021-07-15 14:37:30 +10:00
|
|
|
|
2021-04-22 17:03:33 +10:00
|
|
|
return (
|
2021-04-26 17:33:12 +10:00
|
|
|
<div
|
|
|
|
|
className="chat-container"
|
2022-02-04 14:12:00 +11:00
|
|
|
style={{ height: "98vh", display: "flex", flexDirection: "column" }}
|
2021-04-26 17:33:12 +10:00
|
|
|
>
|
2021-07-15 14:37:30 +10:00
|
|
|
<TitleBar
|
2022-01-06 17:39:08 +11:00
|
|
|
leftIcons={[`Peers: ${relayPeers} relay ${storePeers} store.`]}
|
2021-07-15 14:37:30 +10:00
|
|
|
title="Waku v2 chat app"
|
|
|
|
|
/>
|
2021-07-29 16:30:06 +10:00
|
|
|
<ChatList messages={props.messages} />
|
2021-04-29 08:13:09 +02:00
|
|
|
<MessageInput
|
|
|
|
|
sendMessage={
|
|
|
|
|
waku
|
2021-05-05 14:29:00 +10:00
|
|
|
? async (messageToSend) => {
|
2021-04-29 08:13:09 +02:00
|
|
|
return handleMessage(
|
|
|
|
|
messageToSend,
|
|
|
|
|
props.nick,
|
|
|
|
|
props.commandHandler,
|
|
|
|
|
waku.relay.send.bind(waku.relay)
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
: undefined
|
|
|
|
|
}
|
|
|
|
|
/>
|
2021-04-26 17:33:12 +10:00
|
|
|
</div>
|
2021-04-22 17:03:33 +10:00
|
|
|
);
|
2021-04-19 14:57:38 +10:00
|
|
|
}
|
2021-04-14 15:13:55 +10:00
|
|
|
|
2021-04-27 13:36:25 +10:00
|
|
|
async function handleMessage(
|
|
|
|
|
message: string,
|
|
|
|
|
nick: string,
|
|
|
|
|
commandHandler: (cmd: string) => void,
|
|
|
|
|
messageSender: (msg: WakuMessage) => Promise<void>
|
|
|
|
|
) {
|
2022-02-04 14:12:00 +11:00
|
|
|
if (message.startsWith("/")) {
|
2021-04-27 13:36:25 +10:00
|
|
|
commandHandler(message);
|
|
|
|
|
} else {
|
2021-05-28 16:31:08 +10:00
|
|
|
const timestamp = new Date();
|
|
|
|
|
const chatMessage = ChatMessage.fromUtf8String(timestamp, nick, message);
|
2021-07-28 11:22:29 +10:00
|
|
|
const wakuMsg = await WakuMessage.fromBytes(
|
|
|
|
|
chatMessage.encode(),
|
|
|
|
|
ChatContentTopic,
|
|
|
|
|
{ timestamp }
|
|
|
|
|
);
|
2021-04-27 13:36:25 +10:00
|
|
|
return messageSender(wakuMsg);
|
|
|
|
|
}
|
|
|
|
|
}
|