feat: add message sending UI

This commit is contained in:
Jeremy Kahn 2022-08-17 09:28:22 -05:00
parent 96f2991209
commit 126456eced
2 changed files with 41 additions and 10 deletions

View File

@ -1,12 +1,17 @@
import { useState } from 'react'
import { useParams } from 'react-router-dom'
import Button from '@mui/material/Button'
import FormControl from '@mui/material/FormControl'
import Typography from '@mui/material/Typography'
import TextField from '@mui/material/TextField'
import { usePeerRoom, usePeerRoomAction, PeerActions } from 'hooks/usePeerRoom'
export function Room() {
const { roomId = '' } = useParams()
const [message, setMessage] = useState('')
const peerRoom = usePeerRoom({
appId: `${encodeURI(window.location.origin)}_${process.env.REACT_APP_NAME}`,
roomId,
@ -17,24 +22,50 @@ export function Room() {
PeerActions.MESSAGE
)
const handleMessageChange = (event: React.ChangeEvent<HTMLInputElement>) => {
const { value } = event.target
setMessage(value)
}
const handleMessageSubmit = (
event: React.SyntheticEvent<HTMLFormElement>
) => {
event.preventDefault()
sendMessage(message)
setMessage('')
}
receiveMessage(message => {
console.log(message)
})
return (
<div>
<div className="p-4">
<Typography>Room ID: {roomId}</Typography>
<Typography>
Open this page in another tab and open the console.
</Typography>
<Button
onClick={() => {
sendMessage('Hello!')
}}
variant="contained"
>
Say hi
</Button>
<form onSubmit={handleMessageSubmit} className="max-w-xl mt-8">
<FormControl fullWidth>
<TextField
label="Your message"
variant="outlined"
value={message}
onChange={handleMessageChange}
size="medium"
/>
</FormControl>
<Button
variant="contained"
type="submit"
disabled={message.length === 0}
sx={{
marginTop: 2,
}}
>
Send
</Button>
</form>
</div>
)
}

View File

@ -25,7 +25,7 @@ export class PeerRoom {
// Memoization isn't just a performance optimization here. It is necessary to
// prevent subsequent calls to getPeerRoom from causing a room collision due to
// the amount of time it takes for Trystero rooms to be torn down (which is an
// asynchronous operation).
// asynchronous operation that cannot be `await`-ed).
export const getPeerRoom = memoize((config: RoomConfig, roomId: string) => {
return new PeerRoom(config, roomId)
})