fix: prevent large transcripts from affecting input performance
This commit is contained in:
parent
5b69f48229
commit
cebb8dc93a
77
src/components/MessageForm/MessageForm.tsx
Normal file
77
src/components/MessageForm/MessageForm.tsx
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
import { KeyboardEvent, SyntheticEvent, useState } from 'react'
|
||||||
|
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'
|
||||||
|
|
||||||
|
interface MessageFormProps {
|
||||||
|
onMessageSubmit: (message: string) => void
|
||||||
|
isMessageSending: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export const MessageForm = ({
|
||||||
|
onMessageSubmit,
|
||||||
|
isMessageSending,
|
||||||
|
}: MessageFormProps) => {
|
||||||
|
const [textMessage, setTextMessage] = useState('')
|
||||||
|
|
||||||
|
const canMessageBeSent = () => {
|
||||||
|
return textMessage.trim().length > 0 && !isMessageSending
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleMessageChange = (event: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
|
const { value } = event.target
|
||||||
|
setTextMessage(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
const submitMessage = () => {
|
||||||
|
onMessageSubmit(textMessage)
|
||||||
|
setTextMessage('')
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleMessageKeyPress = (event: KeyboardEvent<HTMLInputElement>) => {
|
||||||
|
const { key, shiftKey } = event
|
||||||
|
|
||||||
|
if (key === 'Enter' && shiftKey === false) {
|
||||||
|
event.preventDefault()
|
||||||
|
submitMessage()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleMessageSubmit = (event: SyntheticEvent<HTMLFormElement>) => {
|
||||||
|
event.preventDefault()
|
||||||
|
submitMessage()
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<form onSubmit={handleMessageSubmit} className="p-4">
|
||||||
|
<Stack direction="row" spacing={2}>
|
||||||
|
<FormControl fullWidth>
|
||||||
|
<TextField
|
||||||
|
variant="outlined"
|
||||||
|
value={textMessage}
|
||||||
|
onChange={handleMessageChange}
|
||||||
|
onKeyPress={handleMessageKeyPress}
|
||||||
|
size="medium"
|
||||||
|
placeholder="Your message"
|
||||||
|
multiline
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
<Fab
|
||||||
|
sx={{
|
||||||
|
flexShrink: 0,
|
||||||
|
// The !important is needed to override a Stack style
|
||||||
|
marginTop: 'auto!important',
|
||||||
|
}}
|
||||||
|
aria-label="Send"
|
||||||
|
type="submit"
|
||||||
|
disabled={!canMessageBeSent()}
|
||||||
|
color="primary"
|
||||||
|
>
|
||||||
|
<ArrowUpward />
|
||||||
|
</Fab>
|
||||||
|
</Stack>
|
||||||
|
</form>
|
||||||
|
)
|
||||||
|
}
|
1
src/components/MessageForm/index.ts
Normal file
1
src/components/MessageForm/index.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export * from './MessageForm'
|
@ -1,17 +1,13 @@
|
|||||||
import React, { useContext, useEffect, useState } from 'react'
|
import { useContext, useEffect, useState } from 'react'
|
||||||
import { v4 as uuid } from 'uuid'
|
import { v4 as uuid } from 'uuid'
|
||||||
import Box from '@mui/material/Box'
|
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 Divider from '@mui/material/Divider'
|
import Divider from '@mui/material/Divider'
|
||||||
import ArrowUpward from '@mui/icons-material/ArrowUpward'
|
|
||||||
|
|
||||||
import { ShellContext } from 'contexts/ShellContext'
|
import { ShellContext } from 'contexts/ShellContext'
|
||||||
import { usePeerRoom, usePeerRoomAction } from 'hooks/usePeerRoom'
|
import { usePeerRoom, usePeerRoomAction } from 'hooks/usePeerRoom'
|
||||||
import { PeerActions } from 'models/network'
|
import { PeerActions } from 'models/network'
|
||||||
import { UnsentMessage, ReceivedMessage } from 'models/chat'
|
import { UnsentMessage, ReceivedMessage } from 'models/chat'
|
||||||
|
import { MessageForm } from 'components/MessageForm'
|
||||||
import { ChatTranscript } from 'components/ChatTranscript'
|
import { ChatTranscript } from 'components/ChatTranscript'
|
||||||
|
|
||||||
export interface RoomProps {
|
export interface RoomProps {
|
||||||
@ -30,7 +26,6 @@ export function Room({
|
|||||||
const [numberOfPeers, setNumberOfPeers] = useState(1) // Includes this peer
|
const [numberOfPeers, setNumberOfPeers] = useState(1) // Includes this peer
|
||||||
const shellContext = useContext(ShellContext)
|
const shellContext = useContext(ShellContext)
|
||||||
const [isMessageSending, setIsMessageSending] = useState(false)
|
const [isMessageSending, setIsMessageSending] = useState(false)
|
||||||
const [textMessage, setTextMessage] = useState('')
|
|
||||||
const [messageLog, setMessageLog] = useState<
|
const [messageLog, setMessageLog] = useState<
|
||||||
Array<ReceivedMessage | UnsentMessage>
|
Array<ReceivedMessage | UnsentMessage>
|
||||||
>([])
|
>([])
|
||||||
@ -100,26 +95,16 @@ export function Room({
|
|||||||
PeerActions.MESSAGE
|
PeerActions.MESSAGE
|
||||||
)
|
)
|
||||||
|
|
||||||
const handleMessageChange = (event: React.ChangeEvent<HTMLInputElement>) => {
|
const performMessageSend = async (message: string) => {
|
||||||
const { value } = event.target
|
if (isMessageSending) return
|
||||||
setTextMessage(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
const canMessageBeSent = () => {
|
|
||||||
return textMessage.trim().length > 0 && !isMessageSending
|
|
||||||
}
|
|
||||||
|
|
||||||
const performMessageSend = async () => {
|
|
||||||
if (!canMessageBeSent()) return
|
|
||||||
|
|
||||||
const unsentMessage: UnsentMessage = {
|
const unsentMessage: UnsentMessage = {
|
||||||
authorId: userId,
|
authorId: userId,
|
||||||
text: textMessage,
|
text: message,
|
||||||
timeSent: Date.now(),
|
timeSent: Date.now(),
|
||||||
id: getUuid(),
|
id: getUuid(),
|
||||||
}
|
}
|
||||||
|
|
||||||
setTextMessage('')
|
|
||||||
setIsMessageSending(true)
|
setIsMessageSending(true)
|
||||||
setMessageLog([...messageLog, unsentMessage])
|
setMessageLog([...messageLog, unsentMessage])
|
||||||
await sendMessage(unsentMessage)
|
await sendMessage(unsentMessage)
|
||||||
@ -131,28 +116,14 @@ export function Room({
|
|||||||
setIsMessageSending(false)
|
setIsMessageSending(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleMessageKeyPress = async (
|
|
||||||
event: React.KeyboardEvent<HTMLInputElement>
|
|
||||||
) => {
|
|
||||||
const { key, shiftKey } = event
|
|
||||||
|
|
||||||
if (key === 'Enter' && shiftKey === false) {
|
|
||||||
event.preventDefault()
|
|
||||||
await performMessageSend()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleMessageSubmit = async (
|
|
||||||
event: React.SyntheticEvent<HTMLFormElement>
|
|
||||||
) => {
|
|
||||||
event.preventDefault()
|
|
||||||
await performMessageSend()
|
|
||||||
}
|
|
||||||
|
|
||||||
receiveMessage(message => {
|
receiveMessage(message => {
|
||||||
setMessageLog([...messageLog, { ...message, timeReceived: Date.now() }])
|
setMessageLog([...messageLog, { ...message, timeReceived: Date.now() }])
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const handleMessageSubmit = async (message: string) => {
|
||||||
|
await performMessageSend(message)
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box
|
<Box
|
||||||
className="Room"
|
className="Room"
|
||||||
@ -168,34 +139,10 @@ export function Room({
|
|||||||
className="grow overflow-auto px-4"
|
className="grow overflow-auto px-4"
|
||||||
/>
|
/>
|
||||||
<Divider />
|
<Divider />
|
||||||
<form onSubmit={handleMessageSubmit} className="p-4">
|
<MessageForm
|
||||||
<Stack direction="row" spacing={2}>
|
onMessageSubmit={handleMessageSubmit}
|
||||||
<FormControl fullWidth>
|
isMessageSending={isMessageSending}
|
||||||
<TextField
|
|
||||||
variant="outlined"
|
|
||||||
value={textMessage}
|
|
||||||
onChange={handleMessageChange}
|
|
||||||
onKeyPress={handleMessageKeyPress}
|
|
||||||
size="medium"
|
|
||||||
placeholder="Your message"
|
|
||||||
multiline
|
|
||||||
/>
|
/>
|
||||||
</FormControl>
|
|
||||||
<Fab
|
|
||||||
sx={{
|
|
||||||
flexShrink: 0,
|
|
||||||
// The !important is needed to override a Stack style
|
|
||||||
marginTop: 'auto!important',
|
|
||||||
}}
|
|
||||||
aria-label="Send"
|
|
||||||
type="submit"
|
|
||||||
disabled={!canMessageBeSent()}
|
|
||||||
color="primary"
|
|
||||||
>
|
|
||||||
<ArrowUpward />
|
|
||||||
</Fab>
|
|
||||||
</Stack>
|
|
||||||
</form>
|
|
||||||
</Box>
|
</Box>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user