mirror of
https://github.com/logos-messaging/examples.waku.org.git
synced 2026-01-05 06:13:11 +00:00
* improve condition for message sending, fix clear input issue * prevent display of empty messages
70 lines
2.1 KiB
TypeScript
70 lines
2.1 KiB
TypeScript
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<LightNode>();
|
|
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 (
|
|
<div
|
|
className="chat-container"
|
|
style={{ height: "98vh", display: "flex", flexDirection: "column" }}
|
|
>
|
|
<TitleBar
|
|
leftIcons={[peersMessage]}
|
|
rightIcons={[bootstrapPeersMessage, "View console for more details."]}
|
|
title="Waku v2 chat app"
|
|
/>
|
|
<ChatList messages={props.messages} />
|
|
<MessageInput hasLightPushPeers={!!lightPushPeers} sendMessage={onSend} />
|
|
</div>
|
|
);
|
|
}
|
|
|
|
function orZero(value: undefined | number): number {
|
|
return value || 0;
|
|
}
|