remnantchat/src/components/Room/RoomFileUploadControls.tsx
Jeremy Kahn 5d3d019cd6
feat: [closes #33] Render inline media (#73)
* 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
2022-11-28 21:18:41 -06:00

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>
)
}