import React, { useEffect } from 'react'; import { useMedia } from 'react-use'; import { match } from 'ts-pattern'; import { selectAppData, selectVideoTrackByPeerID, useHMSStore } from '@100mslive/react-sdk'; import { Polls } from '../components/Polls/Polls'; import { RoomDetailsPane } from '../components/RoomDetails/RoomDetailsPane'; import { LayoutMode } from '../components/Settings/LayoutSettings'; import { SidePaneTabs } from '../components/SidePaneTabs'; import { TileCustomisationProps } from '../components/VideoLayouts/GridLayout'; import VideoTile from '../components/VideoTile'; import { VBPicker } from '../components/VirtualBackground/VBPicker'; import { Flex } from '../../Layout'; import { config as cssConfig, styled } from '../../Theme'; // @ts-ignore: No implicit Any import { useSidepaneReset } from '../components/AppData/useSidepane'; // @ts-ignore: No implicit Any import { useUISettings } from '../components/AppData/useUISettings'; import { useRoomLayoutConferencingScreen, useRoomLayoutPreviewScreen, } from '../provider/roomLayoutProvider/hooks/useRoomLayoutScreen'; import { useLandscapeHLSStream, useMobileHLSStream } from '../common/hooks'; import { translateAcross } from '../../utils'; import { APP_DATA, SIDE_PANE_OPTIONS, UI_SETTINGS } from '../common/constants'; const Wrapper = styled('div', { w: '$100', h: '100%', p: '$10', flex: '1 1 0', background: '$surface_dim', r: '$1', position: 'relative', '@lg': { w: '100%', h: '100%', ml: 0, right: 0, position: 'fixed', bottom: 0, borderRadius: 0, zIndex: 10, }, '@md': { p: '$6 $8', animation: `${translateAcross({ yFrom: '100%' })} 150ms cubic-bezier(0.22, 1, 0.36, 1)`, }, variants: { landscapeStream: { true: { '@lg': { position: 'unset', minHeight: '100%', }, }, }, mobileStream: { true: { '@md': { position: 'unset', }, }, }, overlayChat: { true: { '@lg': { maxHeight: '300px', background: 'linear-gradient(180deg, rgba(0, 0, 0, 0.00) 35.94%, rgba(0, 0, 0, 0.64) 100%)', position: 'fixed', zIndex: 12, bottom: 0, }, }, }, roomDescription: { true: { overflowY: 'auto', }, }, hideControls: { true: {}, }, virtualBackground: { true: { maxHeight: '100%', background: '$surface_dim', }, }, }, compoundVariants: [ { landscapeStream: true, overlayChat: true, css: { position: 'unset', height: '100%', maxHeight: 'unset', '@md': { pb: 0, }, }, }, { mobileStream: true, overlayChat: true, css: { position: 'unset', height: '100%', maxHeight: 'unset', }, }, { hideControls: false, overlayChat: true, css: { pb: '$17', }, }, ], }); const SidePane = ({ tileProps, hideControls = false, }: { tileProps?: TileCustomisationProps; hideControls?: boolean; }) => { const isMobile = useMedia(cssConfig.media.md); const sidepane = useHMSStore(selectAppData(APP_DATA.sidePane)); const activeScreensharePeerId = useHMSStore(selectAppData(APP_DATA.activeScreensharePeerId)); const trackId = useHMSStore(selectVideoTrackByPeerID(activeScreensharePeerId))?.id; const { elements } = useRoomLayoutConferencingScreen(); const { elements: preview_elements } = useRoomLayoutPreviewScreen(); const layoutMode = useUISettings(UI_SETTINGS.layoutMode); const isLandscapeHLSStream = useLandscapeHLSStream(); const isMobileHLSStream = useMobileHLSStream(); const backgroundMedia = preview_elements?.virtual_background?.background_media?.length ? preview_elements?.virtual_background?.background_media : elements?.virtual_background?.background_media || []; const tileLayout = { hideParticipantNameOnTile: tileProps?.hide_participant_name_on_tile, roundedVideoTile: tileProps?.rounded_video_tile, hideAudioMuteOnTile: tileProps?.hide_audio_mute_on_tile, hideMetadataOnTile: tileProps?.hide_metadata_on_tile, objectFit: tileProps?.video_object_fit, }; const mwebStreamingChat = isMobile && sidepane === SIDE_PANE_OPTIONS.CHAT && elements?.chat?.is_overlay; const commonProps = { landscapeStream: isLandscapeHLSStream, mobileStream: isMobileHLSStream, hideControls, overlayChat: !!elements?.chat?.is_overlay, roomDescription: sidepane === SIDE_PANE_OPTIONS.ROOM_DETAILS, virtualBackground: sidepane === SIDE_PANE_OPTIONS.VB, }; const SidepaneComponent = match(sidepane) .with(SIDE_PANE_OPTIONS.POLLS, () => ( )) .with(SIDE_PANE_OPTIONS.VB, () => ( )) .with(SIDE_PANE_OPTIONS.CHAT, SIDE_PANE_OPTIONS.PARTICIPANTS, () => ( )) .with(SIDE_PANE_OPTIONS.ROOM_DETAILS, () => ( )) .otherwise(() => { return null; }); const resetSidePane = useSidepaneReset(); useEffect(() => { return () => { resetSidePane(); }; }, [resetSidePane]); if (!SidepaneComponent && !trackId) { return null; } return ( '340px') .with({ isMobileHLSStream: true }, () => '100%') .otherwise(() => '$100'), h: '100%', flexShrink: 0, gap: '$4', position: 'relative', '&:empty': { display: 'none' }, '@md': { position: 'absolute', zIndex: 12, }, }} > {trackId && layoutMode === LayoutMode.GALLERY && ( )} {SidepaneComponent} ); }; export default SidePane;