import { useContext } from 'react' import { useWindowSize } from '@react-hook/window-size' import Zoom from '@mui/material/Zoom' import Box from '@mui/material/Box' import Divider from '@mui/material/Divider' import useTheme from '@mui/material/styles/useTheme' import { v4 as uuid } from 'uuid' import { rtcConfig } from 'config/rtcConfig' import { trackerUrls } from 'config/trackerUrls' import { RoomContext } from 'contexts/RoomContext' import { ShellContext } from 'contexts/ShellContext' import { MessageForm } from 'components/MessageForm' import { ChatTranscript } from 'components/ChatTranscript' import { encryptionService as encryptionServiceInstance } from 'services/Encryption' import { SettingsContext } from 'contexts/SettingsContext' import { useRoom } from './useRoom' import { RoomAudioControls } from './RoomAudioControls' import { RoomVideoControls } from './RoomVideoControls' import { RoomScreenShareControls } from './RoomScreenShareControls' import { RoomFileUploadControls } from './RoomFileUploadControls' import { RoomVideoDisplay } from './RoomVideoDisplay' import { RoomShowMessagesControls } from './RoomShowMessagesControls' import { TypingStatusBar } from './TypingStatusBar' export interface RoomProps { appId?: string getUuid?: typeof uuid password?: string roomId: string userId: string encryptionService?: typeof encryptionServiceInstance } export function Room({ appId = `${encodeURI(window.location.origin)}_${process.env.REACT_APP_NAME}`, getUuid = uuid, encryptionService = encryptionServiceInstance, roomId, password, userId, }: RoomProps) { const theme = useTheme() const settingsContext = useContext(SettingsContext) const { showActiveTypingStatus, publicKey } = settingsContext.getUserSettings() const { isMessageSending, handleInlineMediaUpload, handleMessageChange, messageLog, peerRoom, roomContextValue, sendMessage, showVideoDisplay, } = useRoom( { appId, trackerUrls, rtcConfig, password, trackerRedundancy: 4, }, { roomId, userId, getUuid, publicKey, encryptionService, } ) const handleMessageSubmit = async (message: string) => { await sendMessage(message) } const showMessages = roomContextValue.isShowingMessages const { showRoomControls } = useContext(ShellContext) const [windowWidth, windowHeight] = useWindowSize() const landscape = windowWidth > windowHeight return ( {showVideoDisplay && ( )} {showMessages && ( {showActiveTypingStatus ? : null} )} ) }