94 lines
2.2 KiB
TypeScript
Raw Normal View History

2021-04-22 17:03:33 +10:00
import { Box, Grid, List, ListItem, ListItemText } from '@material-ui/core';
import React, { useState } from 'react';
2021-04-22 10:58:56 +10:00
import { ChatMessage } from 'waku-chat/chat_message';
import { WakuMessage } from 'waku/waku_message';
import { ChatContentTopic } from './App';
2021-04-19 13:33:23 +10:00
import MessageInput from './MessageInput';
import { useWaku } from './WakuContext';
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>('');
const { waku } = useWaku();
2021-04-19 12:55:33 +10:00
const messageHandler = (msg: string) => {
2021-04-22 15:57:43 +10:00
setMessageToSend(msg);
2021-04-22 17:03:33 +10:00
};
2021-04-19 12:55:33 +10:00
const sendMessage = async () => {
2021-04-22 16:12:28 +10:00
if (messageToSend.startsWith('/')) {
2021-04-22 17:03:33 +10:00
props.commandHandler(messageToSend);
2021-04-22 16:12:28 +10:00
} else {
2021-04-22 17:03:33 +10:00
const chatMessage = new ChatMessage(
new Date(),
2021-04-23 14:43:39 +10:00
props.nick,
2021-04-22 17:03:33 +10:00
messageToSend
);
const wakuMsg = WakuMessage.fromBytes(
chatMessage.encode(),
ChatContentTopic
);
2021-04-22 16:12:28 +10:00
await waku!.relay.send(wakuMsg);
}
2021-04-22 17:03:33 +10:00
};
2021-04-19 14:54:39 +10:00
2021-04-22 17:03:33 +10:00
return (
<Grid container spacing={2}>
<Grid item xs={12}>
<Box
height={800}
maxHeight={800}
style={{ flex: 1, maxHeight: '100%', overflow: 'scroll' }}
>
<Lines messages={props.lines} />
</Box>
</Grid>
2021-04-19 14:54:39 +10:00
2021-04-22 17:03:33 +10:00
<Grid item xs={12}>
<MessageInput
messageHandler={messageHandler}
sendMessage={sendMessage}
/>
2021-04-19 14:54:39 +10:00
</Grid>
2021-04-22 17:03:33 +10:00
</Grid>
);
2021-04-19 14:57:38 +10:00
}
2021-04-14 15:13:55 +10:00
2021-04-19 14:57:38 +10:00
interface LinesProps {
2021-04-22 17:03:33 +10:00
messages: ChatMessage[];
2021-04-19 14:57:38 +10:00
}
2021-04-19 14:54:39 +10:00
2021-04-19 14:57:38 +10:00
const Lines = (props: LinesProps) => {
const renderedLines = [];
2021-04-14 15:13:55 +10:00
2021-04-22 10:58:56 +10:00
for (const i in props.messages) {
2021-04-22 17:03:33 +10:00
renderedLines.push(
<ListItem>
<ListItemText
key={'chat-message-' + i}
primary={printMessage(props.messages[i])}
/>
</ListItem>
);
2021-04-14 15:13:55 +10:00
}
2021-04-19 14:57:38 +10:00
2021-04-22 17:03:33 +10:00
return <List dense={true}>{renderedLines}</List>;
2021-04-19 14:57:38 +10:00
};
2021-04-22 10:58:56 +10:00
// TODO: Make it a proper component
function printMessage(chatMsg: ChatMessage) {
const timestamp = chatMsg.timestamp.toLocaleString([], {
month: 'short',
day: 'numeric',
hour: 'numeric',
minute: '2-digit',
2021-04-22 17:03:33 +10:00
hour12: false,
2021-04-22 10:58:56 +10:00
});
return `<${timestamp}> ${chatMsg.nick}: ${chatMsg.message}`;
}