forked from Shiloh/old-remnantchat
* refactor: pass inline media upload data to useRoom * feat: render inline media * fix: don't rescind inline media file offers * refactor: send file offer metadata object * fix: enable re-seeding of inline media files * feat: show loading indicator for inline media * feat: rescind any evicted inline media * feat: display media rendering failure message * feat: prevent user from uploading file if message is sending
100 lines
2.4 KiB
TypeScript
100 lines
2.4 KiB
TypeScript
import { ChangeEventHandler, useContext, useRef } from 'react'
|
|
import Box from '@mui/material/Box'
|
|
import UploadFile from '@mui/icons-material/UploadFile'
|
|
import Cancel from '@mui/icons-material/Cancel'
|
|
import Fab from '@mui/material/Fab'
|
|
import Tooltip from '@mui/material/Tooltip'
|
|
|
|
import { RoomContext } from 'contexts/RoomContext'
|
|
import { PeerRoom } from 'services/PeerRoom/PeerRoom'
|
|
|
|
import { useRoomFileShare } from './useRoomFileShare'
|
|
|
|
export interface RoomFileUploadControlsProps {
|
|
onInlineMediaUpload: (files: File[]) => void
|
|
peerRoom: PeerRoom
|
|
}
|
|
|
|
export function RoomFileUploadControls({
|
|
peerRoom,
|
|
onInlineMediaUpload,
|
|
}: RoomFileUploadControlsProps) {
|
|
const roomContext = useContext(RoomContext)
|
|
const fileInputRef = useRef<HTMLInputElement>(null)
|
|
|
|
const { isMessageSending } = roomContext
|
|
|
|
const {
|
|
isFileSharingEnabled,
|
|
isSharingFile,
|
|
handleFileShareStart,
|
|
handleFileShareStop,
|
|
sharedFiles,
|
|
} = useRoomFileShare({
|
|
peerRoom,
|
|
onInlineMediaUpload,
|
|
})
|
|
|
|
const handleToggleScreenShareButtonClick = () => {
|
|
const { current: fileInput } = fileInputRef
|
|
|
|
if (isSharingFile) {
|
|
handleFileShareStop()
|
|
} else {
|
|
if (!fileInput) return
|
|
|
|
fileInput.click()
|
|
}
|
|
}
|
|
|
|
const handleFileSelect: ChangeEventHandler<HTMLInputElement> = e => {
|
|
const { files } = e.target
|
|
|
|
if (!files) return
|
|
|
|
handleFileShareStart(files)
|
|
}
|
|
|
|
const shareFileLabel =
|
|
(sharedFiles && sharedFiles.length === 1 && sharedFiles[0].name) || 'files'
|
|
|
|
const disableFileUpload = !isFileSharingEnabled || isMessageSending
|
|
|
|
return (
|
|
<Box
|
|
sx={{
|
|
alignItems: 'center',
|
|
display: 'flex',
|
|
flexDirection: 'column',
|
|
justifyContent: 'center',
|
|
px: 1,
|
|
}}
|
|
>
|
|
<input
|
|
multiple
|
|
ref={fileInputRef}
|
|
type="file"
|
|
id="file-upload"
|
|
className="hidden"
|
|
onChange={handleFileSelect}
|
|
/>
|
|
<Tooltip
|
|
title={
|
|
isSharingFile
|
|
? `Stop sharing ${shareFileLabel}`
|
|
: 'Share files with the room'
|
|
}
|
|
>
|
|
<Fab
|
|
color={isSharingFile ? 'error' : 'success'}
|
|
aria-label="share screen"
|
|
onClick={handleToggleScreenShareButtonClick}
|
|
disabled={disableFileUpload}
|
|
>
|
|
{isSharingFile ? <Cancel /> : <UploadFile />}
|
|
</Fab>
|
|
</Tooltip>
|
|
</Box>
|
|
)
|
|
}
|