2022-09-08 21:35:50 -05:00
|
|
|
import { useContext, useEffect, useState } from 'react'
|
2022-08-19 09:42:14 -05:00
|
|
|
import { v4 as uuid } from 'uuid'
|
2022-08-27 21:48:22 -05:00
|
|
|
import Box from '@mui/material/Box'
|
2022-09-05 12:12:54 -05:00
|
|
|
import Divider from '@mui/material/Divider'
|
2022-08-09 22:14:59 -05:00
|
|
|
|
2022-09-05 12:17:10 -05:00
|
|
|
import { ShellContext } from 'contexts/ShellContext'
|
2022-08-18 09:14:13 -05:00
|
|
|
import { usePeerRoom, usePeerRoomAction } from 'hooks/usePeerRoom'
|
|
|
|
import { PeerActions } from 'models/network'
|
|
|
|
import { UnsentMessage, ReceivedMessage } from 'models/chat'
|
2022-09-08 21:35:50 -05:00
|
|
|
import { MessageForm } from 'components/MessageForm'
|
2022-08-20 22:23:43 -05:00
|
|
|
import { ChatTranscript } from 'components/ChatTranscript'
|
2022-08-13 12:11:59 -05:00
|
|
|
|
2022-08-18 21:10:16 -05:00
|
|
|
export interface RoomProps {
|
|
|
|
appId?: string
|
2022-08-19 09:42:14 -05:00
|
|
|
getUuid?: typeof uuid
|
2022-08-23 21:15:58 -05:00
|
|
|
roomId: string
|
2022-08-20 14:20:51 -05:00
|
|
|
userId: string
|
2022-08-18 21:10:16 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
export function Room({
|
|
|
|
appId = `${encodeURI(window.location.origin)}_${process.env.REACT_APP_NAME}`,
|
2022-08-19 09:42:14 -05:00
|
|
|
getUuid = uuid,
|
2022-08-23 21:15:58 -05:00
|
|
|
roomId,
|
|
|
|
userId,
|
2022-08-18 21:10:16 -05:00
|
|
|
}: RoomProps) {
|
2022-08-31 09:55:57 -05:00
|
|
|
const [numberOfPeers, setNumberOfPeers] = useState(1) // Includes this peer
|
2022-08-29 22:05:56 -05:00
|
|
|
const shellContext = useContext(ShellContext)
|
2022-08-22 21:57:45 -05:00
|
|
|
const [isMessageSending, setIsMessageSending] = useState(false)
|
2022-08-20 22:23:43 -05:00
|
|
|
const [messageLog, setMessageLog] = useState<
|
|
|
|
Array<ReceivedMessage | UnsentMessage>
|
|
|
|
>([])
|
2022-08-17 09:28:22 -05:00
|
|
|
|
2022-08-20 17:14:50 -05:00
|
|
|
const peerRoom = usePeerRoom(
|
|
|
|
{
|
|
|
|
appId,
|
2022-08-29 19:21:14 -05:00
|
|
|
trackerUrls: process.env.REACT_APP_TRACKER_URL
|
|
|
|
? [process.env.REACT_APP_TRACKER_URL]
|
|
|
|
: undefined,
|
2022-08-30 09:38:14 -05:00
|
|
|
rtcConfig: {
|
|
|
|
iceServers: [
|
|
|
|
{
|
|
|
|
urls: 'stun:openrelay.metered.ca:80',
|
|
|
|
},
|
|
|
|
{
|
|
|
|
urls: 'turn:openrelay.metered.ca:80',
|
|
|
|
username: 'openrelayproject',
|
|
|
|
credential: 'openrelayproject',
|
|
|
|
},
|
|
|
|
{
|
|
|
|
urls: 'turn:openrelay.metered.ca:443',
|
|
|
|
username: 'openrelayproject',
|
|
|
|
credential: 'openrelayproject',
|
|
|
|
},
|
|
|
|
{
|
|
|
|
urls: 'turn:openrelay.metered.ca:443?transport=tcp',
|
|
|
|
username: 'openrelayproject',
|
|
|
|
credential: 'openrelayproject',
|
|
|
|
},
|
|
|
|
],
|
|
|
|
},
|
2022-08-20 17:14:50 -05:00
|
|
|
},
|
|
|
|
roomId
|
|
|
|
)
|
2022-08-13 12:11:59 -05:00
|
|
|
|
2022-08-29 22:05:56 -05:00
|
|
|
useEffect(() => {
|
2022-09-01 21:28:45 -05:00
|
|
|
shellContext.setDoShowPeers(true)
|
|
|
|
|
2022-08-31 09:55:57 -05:00
|
|
|
peerRoom.onPeerJoin(() => {
|
2022-08-31 10:09:49 -05:00
|
|
|
shellContext.showAlert(`Someone has joined the room`, {
|
2022-08-31 09:55:57 -05:00
|
|
|
severity: 'success',
|
|
|
|
})
|
|
|
|
|
|
|
|
const newNumberOfPeers = numberOfPeers + 1
|
|
|
|
setNumberOfPeers(newNumberOfPeers)
|
|
|
|
shellContext.setNumberOfPeers(newNumberOfPeers)
|
|
|
|
})
|
|
|
|
|
|
|
|
peerRoom.onPeerLeave(() => {
|
2022-08-31 10:09:49 -05:00
|
|
|
shellContext.showAlert(`Someone has left the room`, {
|
2022-08-31 09:55:57 -05:00
|
|
|
severity: 'warning',
|
|
|
|
})
|
|
|
|
|
|
|
|
const newNumberOfPeers = numberOfPeers - 1
|
|
|
|
setNumberOfPeers(newNumberOfPeers)
|
|
|
|
shellContext.setNumberOfPeers(newNumberOfPeers)
|
2022-08-29 22:05:56 -05:00
|
|
|
})
|
2022-09-01 21:28:45 -05:00
|
|
|
|
|
|
|
return () => {
|
|
|
|
shellContext.setDoShowPeers(false)
|
|
|
|
}
|
2022-08-31 09:55:57 -05:00
|
|
|
}, [numberOfPeers, peerRoom, shellContext])
|
2022-08-29 22:05:56 -05:00
|
|
|
|
2022-08-18 09:14:13 -05:00
|
|
|
const [sendMessage, receiveMessage] = usePeerRoomAction<UnsentMessage>(
|
2022-08-16 09:40:01 -05:00
|
|
|
peerRoom,
|
|
|
|
PeerActions.MESSAGE
|
2022-08-14 21:26:50 -05:00
|
|
|
)
|
|
|
|
|
2022-09-08 21:35:50 -05:00
|
|
|
const performMessageSend = async (message: string) => {
|
|
|
|
if (isMessageSending) return
|
2022-08-20 22:23:43 -05:00
|
|
|
|
|
|
|
const unsentMessage: UnsentMessage = {
|
2022-08-20 14:20:51 -05:00
|
|
|
authorId: userId,
|
2022-09-08 21:35:50 -05:00
|
|
|
text: message,
|
2022-08-20 14:20:51 -05:00
|
|
|
timeSent: Date.now(),
|
|
|
|
id: getUuid(),
|
2022-08-20 22:23:43 -05:00
|
|
|
}
|
|
|
|
|
2022-08-22 21:57:45 -05:00
|
|
|
setIsMessageSending(true)
|
2022-08-20 22:23:43 -05:00
|
|
|
setMessageLog([...messageLog, unsentMessage])
|
2022-08-22 21:57:45 -05:00
|
|
|
await sendMessage(unsentMessage)
|
|
|
|
|
|
|
|
setMessageLog([
|
|
|
|
...messageLog,
|
|
|
|
{ ...unsentMessage, timeReceived: Date.now() },
|
|
|
|
])
|
|
|
|
setIsMessageSending(false)
|
2022-08-17 09:28:22 -05:00
|
|
|
}
|
|
|
|
|
2022-08-14 21:26:50 -05:00
|
|
|
receiveMessage(message => {
|
2022-08-20 22:23:43 -05:00
|
|
|
setMessageLog([...messageLog, { ...message, timeReceived: Date.now() }])
|
2022-08-14 21:26:50 -05:00
|
|
|
})
|
|
|
|
|
2022-09-08 21:35:50 -05:00
|
|
|
const handleMessageSubmit = async (message: string) => {
|
|
|
|
await performMessageSend(message)
|
|
|
|
}
|
|
|
|
|
2022-08-14 21:26:50 -05:00
|
|
|
return (
|
2022-08-31 19:26:38 -05:00
|
|
|
<Box
|
|
|
|
className="Room"
|
|
|
|
sx={{
|
|
|
|
height: '100%',
|
|
|
|
display: 'flex',
|
|
|
|
flexDirection: 'column',
|
|
|
|
}}
|
|
|
|
>
|
2022-08-26 09:39:01 -05:00
|
|
|
<ChatTranscript
|
|
|
|
messageLog={messageLog}
|
|
|
|
userId={userId}
|
2022-09-05 12:12:54 -05:00
|
|
|
className="grow overflow-auto px-4"
|
2022-08-26 09:39:01 -05:00
|
|
|
/>
|
2022-09-05 12:12:54 -05:00
|
|
|
<Divider />
|
2022-09-08 21:35:50 -05:00
|
|
|
<MessageForm
|
|
|
|
onMessageSubmit={handleMessageSubmit}
|
|
|
|
isMessageSending={isMessageSending}
|
|
|
|
/>
|
2022-08-27 21:48:22 -05:00
|
|
|
</Box>
|
2022-08-14 21:26:50 -05:00
|
|
|
)
|
2022-08-09 22:14:59 -05:00
|
|
|
}
|