import React, { useContext, useEffect, useState } from 'react' import { v4 as uuid } from 'uuid' import Box from '@mui/material/Box' import FormControl from '@mui/material/FormControl' import Stack from '@mui/material/Stack' import TextField from '@mui/material/TextField' import Fab from '@mui/material/Fab' import ArrowUpward from '@mui/icons-material/ArrowUpward' import { ShellContext } from 'ShellContext' import { usePeerRoom, usePeerRoomAction } from 'hooks/usePeerRoom' import { PeerActions } from 'models/network' import { UnsentMessage, ReceivedMessage } from 'models/chat' import { ChatTranscript } from 'components/ChatTranscript' export interface RoomProps { appId?: string getUuid?: typeof uuid roomId: string userId: string } export function Room({ appId = `${encodeURI(window.location.origin)}_${process.env.REACT_APP_NAME}`, getUuid = uuid, roomId, userId, }: RoomProps) { const shellContext = useContext(ShellContext) const [isMessageSending, setIsMessageSending] = useState(false) const [textMessage, setTextMessage] = useState('') const [messageLog, setMessageLog] = useState< Array >([]) const peerRoom = usePeerRoom( { appId, trackerUrls: process.env.REACT_APP_TRACKER_URL ? [process.env.REACT_APP_TRACKER_URL] : undefined, }, roomId ) useEffect(() => { peerRoom.onPeersChange((numberOfPeers: number) => { shellContext.setNumberOfPeers(numberOfPeers) }) }, [peerRoom, shellContext]) const [sendMessage, receiveMessage] = usePeerRoomAction( peerRoom, PeerActions.MESSAGE ) const handleMessageChange = (event: React.ChangeEvent) => { const { value } = event.target setTextMessage(value) } const canMessageBeSent = () => { return textMessage.trim().length > 0 && !isMessageSending } const performMessageSend = async () => { if (!canMessageBeSent()) return const unsentMessage: UnsentMessage = { authorId: userId, text: textMessage, timeSent: Date.now(), id: getUuid(), } setTextMessage('') setIsMessageSending(true) setMessageLog([...messageLog, unsentMessage]) await sendMessage(unsentMessage) setMessageLog([ ...messageLog, { ...unsentMessage, timeReceived: Date.now() }, ]) setIsMessageSending(false) } const handleMessageKeyPress = async ( event: React.KeyboardEvent ) => { const { key, shiftKey } = event if (key === 'Enter' && shiftKey === false) { event.preventDefault() await performMessageSend() } } const handleMessageSubmit = async ( event: React.SyntheticEvent ) => { event.preventDefault() await performMessageSend() } receiveMessage(message => { setMessageLog([...messageLog, { ...message, timeReceived: Date.now() }]) }) return (
) }