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

View File

@ -25,7 +25,7 @@ export class PeerRoom {
// Memoization isn't just a performance optimization here. It is necessary to // Memoization isn't just a performance optimization here. It is necessary to
// prevent subsequent calls to getPeerRoom from causing a room collision due 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 // 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) => { export const getPeerRoom = memoize((config: RoomConfig, roomId: string) => {
return new PeerRoom(config, roomId) return new PeerRoom(config, roomId)
}) })