import React, { useState } from 'react'; import { useMedia } from 'react-use'; import { HMSAudioTrack, HMSVideoTrack, selectLocalPeerID, selectPeerByID, selectPermissions, selectTrackByID, selectVideoTrackByPeerID, useHMSStore, useRemoteAVToggle, } from '@100mslive/react-sdk'; import { CrossIcon, VerticalMenuIcon } from '@100mslive/react-icons'; import { Box, Flex } from '../../../Layout'; import { Sheet } from '../../../Sheet'; import { Text } from '../../../Text'; import { config as cssConfig, useTheme } from '../../../Theme'; import { StyledMenuTile } from '../../../TileMenu'; import { ChangeNameModal } from '../MoreSettings/ChangeNameModal'; import { getVideoTileLabel } from '../peerTileUtils'; import { RoleChangeModal } from '../RoleChangeModal'; import { TileMenuContent } from './TileMenuContent'; import { useDropdownList } from '../hooks/useDropdownList'; import { getDragClassName } from './utils'; /** * Taking peerID as peer won't necesarilly have tracks */ const TileMenu = ({ audioTrackID, videoTrackID, peerID, isScreenshare = false, canMinimise, enableSpotlightingPeer = true, }: { audioTrackID: string; videoTrackID: string; peerID: string; isScreenshare?: boolean; canMinimise?: boolean; enableSpotlightingPeer?: boolean; }) => { const [open, setOpen] = useState(false); const { theme } = useTheme(); const localPeerID = useHMSStore(selectLocalPeerID); const isLocal = localPeerID === peerID; const { removeOthers } = useHMSStore(selectPermissions) || {}; const { setVolume, toggleAudio, toggleVideo } = useRemoteAVToggle(audioTrackID, videoTrackID); const showSpotlight = enableSpotlightingPeer; const isPrimaryVideoTrack = useHMSStore(selectVideoTrackByPeerID(peerID))?.id === videoTrackID; const showPinAction = !!(audioTrackID || (videoTrackID && isPrimaryVideoTrack)); const track = useHMSStore(selectTrackByID(videoTrackID)) as HMSVideoTrack | null; const audioTrack = useHMSStore(selectTrackByID(audioTrackID)) as HMSAudioTrack | null; const hideSimulcastLayers = !track?.layerDefinitions?.length || track.degraded || !track.enabled; const isMobile = useMedia(cssConfig.media.md); const peer = useHMSStore(selectPeerByID(peerID)); const [showNameChangeModal, setShowNameChangeModal] = useState(false); const [showRoleChangeModal, setShowRoleChangeModal] = useState(false); useDropdownList({ open, name: 'TileMenu' }); const dragClassName = getDragClassName(); if (!peer || (!(removeOthers || toggleAudio || toggleVideo || setVolume || showPinAction) && hideSimulcastLayers)) { return null; } const openNameChangeModal = () => setShowNameChangeModal(true); const openRoleChangeModal = () => setShowRoleChangeModal(true); const props: React.ComponentPropsWithoutRef = { isLocal, isScreenshare, audioTrackID, videoTrackID, peerID, showSpotlight, showPinAction, canMinimise, openNameChangeModal, openRoleChangeModal, }; return ( <> e.stopPropagation()} className={dragClassName} > {isMobile ? ( {getVideoTileLabel({ peerName: peer?.name, isLocal, audioTrack, videoTrack: track })} {peer?.roleName ? ( {peer.roleName} ) : null} setOpen(false)} /> ) : ( )} {showNameChangeModal && } {showRoleChangeModal && } ); }; export { isSameTile } from './TileMenuContent'; export default TileMenu;