2021-04-29 08:13:09 +02:00
|
|
|
import { useState } from 'react';
|
2021-05-04 16:54:32 +10:00
|
|
|
import { ChatMessage } from './ChatMessage';
|
|
|
|
|
import { ChatMessage as WakuChatMessage } from 'waku/chat_message';
|
2021-04-22 14:57:30 +10:00
|
|
|
import { WakuMessage } from 'waku/waku_message';
|
|
|
|
|
import { ChatContentTopic } from './App';
|
2021-04-27 13:59:25 +10:00
|
|
|
import ChatList from './ChatList';
|
2021-04-19 13:33:23 +10:00
|
|
|
import MessageInput from './MessageInput';
|
2021-04-22 14:57:30 +10:00
|
|
|
import { useWaku } from './WakuContext';
|
2021-05-04 07:53:03 +10:00
|
|
|
import { TitleBar } from '@livechat/ui-kit';
|
2021-04-14 15:13:55 +10:00
|
|
|
|
|
|
|
|
interface Props {
|
2021-04-22 17:03:33 +10:00
|
|
|
lines: ChatMessage[];
|
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 15:57:43 +10:00
|
|
|
let [messageToSend, setMessageToSend] = useState<string>('');
|
2021-04-22 14:57:30 +10:00
|
|
|
const { waku } = useWaku();
|
2021-04-19 12:55:33 +10:00
|
|
|
|
2021-04-22 17:03:33 +10:00
|
|
|
return (
|
2021-04-26 17:33:12 +10:00
|
|
|
<div
|
|
|
|
|
className="chat-container"
|
2021-04-28 10:46:44 +10:00
|
|
|
style={{ height: '98vh', display: 'flex', flexDirection: 'column' }}
|
2021-04-26 17:33:12 +10:00
|
|
|
>
|
2021-04-29 08:13:09 +02:00
|
|
|
<TitleBar title="Waku v2 chat app" />
|
2021-05-04 07:53:03 +10:00
|
|
|
<ChatList messages={props.lines} />
|
2021-04-29 08:13:09 +02:00
|
|
|
<MessageInput
|
|
|
|
|
messageHandler={setMessageToSend}
|
|
|
|
|
sendMessage={
|
|
|
|
|
waku
|
|
|
|
|
? async () => {
|
|
|
|
|
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>
|
|
|
|
|
) {
|
|
|
|
|
if (message.startsWith('/')) {
|
|
|
|
|
commandHandler(message);
|
|
|
|
|
} else {
|
2021-05-04 16:54:32 +10:00
|
|
|
const chatMessage = new WakuChatMessage(new Date(), nick, message);
|
2021-04-27 13:36:25 +10:00
|
|
|
const wakuMsg = WakuMessage.fromBytes(
|
|
|
|
|
chatMessage.encode(),
|
|
|
|
|
ChatContentTopic
|
|
|
|
|
);
|
|
|
|
|
return messageSender(wakuMsg);
|
|
|
|
|
}
|
|
|
|
|
}
|