Sasha 74b6bd11b4
fix: minor issues in the web-chat (#218)
* improve condition for message sending, fix clear input issue

* prevent display of empty messages
2023-03-02 00:56:20 +01:00

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;
}