import React, { useCallback, useEffect, useRef, useState } from 'react'; import { useMedia } from 'react-use'; import { HMSRecordingState } from '@100mslive/hms-video-store'; import { HMSRoomState, selectHLSState, selectIsConnectedToRoom, selectPermissions, selectRecordingState, selectRoomState, useHMSActions, useHMSStore, useRecordingStreaming, } from '@100mslive/react-sdk'; import { AlertTriangleIcon, CrossIcon, PauseCircleIcon, RecordIcon } from '@100mslive/react-icons'; import { Box, Button, config as cssConfig, Flex, HorizontalDivider, Loading, Popover, Text, Tooltip } from '../../..'; import { Sheet } from '../../../Sheet'; // @ts-ignore import { ToastManager } from '../Toast/ToastManager'; import { useRoomLayoutConferencingScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen'; import { useRecordingHandler } from '../../common/hooks'; // @ts-ignore import { formatTime } from '../../common/utils'; export const getRecordingText = ( { isBrowserRecordingOn, isServerRecordingOn, isHLSRecordingOn, }: { isBrowserRecordingOn: boolean; isServerRecordingOn: boolean; isHLSRecordingOn: boolean }, delimiter = ', ', ) => { if (!isBrowserRecordingOn && !isServerRecordingOn && !isHLSRecordingOn) { return ''; } const title: string[] = []; if (isBrowserRecordingOn) { title.push('Browser'); } if (isServerRecordingOn) { title.push('Server'); } if (isHLSRecordingOn) { title.push('HLS'); } return title.join(delimiter); }; export const LiveStatus = () => { const { isHLSRunning, isRTMPRunning } = useRecordingStreaming(); const hlsState = useHMSStore(selectHLSState); const isMobile = useMedia(cssConfig.media.md); const intervalRef = useRef(null); const { screenType } = useRoomLayoutConferencingScreen(); const [liveTime, setLiveTime] = useState(0); const startTimer = useCallback(() => { intervalRef.current = setInterval(() => { const timeStamp = hlsState?.variants[0]?.[screenType === 'hls_live_streaming' ? 'startedAt' : 'initialisedAt']; if (hlsState?.running && timeStamp) { setLiveTime(Date.now() - timeStamp.getTime()); } }, 1000); }, [hlsState?.running, hlsState?.variants, screenType]); useEffect(() => { if (hlsState?.running) { startTimer(); } if (!hlsState?.running && intervalRef.current) { clearInterval(intervalRef.current); } return () => { if (intervalRef.current) { clearInterval(intervalRef.current); } }; }, [hlsState.running, isMobile, startTimer]); if (!isHLSRunning && !isRTMPRunning) { return null; } return ( LIVE {hlsState?.variants?.length > 0 && isHLSRunning ? formatTime(liveTime) : ''} ); }; export const RecordingStatus = () => { const { isBrowserRecordingOn, isServerRecordingOn, isHLSRecordingOn, isRecordingOn } = useRecordingStreaming(); const permissions = useHMSStore(selectPermissions); const isMobile = useMedia(cssConfig.media.md); if ( !isRecordingOn || // if only browser recording is enabled, stop recording is shown // so no need to show this as it duplicates [permissions?.browserRecording, !isServerRecordingOn, !isHLSRecordingOn, isBrowserRecordingOn].every( value => !!value, ) ) { // show recording icon in mobile without popover if (!(isMobile && isRecordingOn)) return null; } return ( ); }; export const RecordingPauseStatus = () => { const recording = useHMSStore(selectRecordingState); if (recording.hls && recording.hls.state === HMSRecordingState.PAUSED) { return ( ); } return null; }; const StartRecording = () => { const permissions = useHMSStore(selectPermissions); const [open, setOpen] = useState(false); const { startRecording, recordingStarted } = useRecordingHandler(); const { isBrowserRecordingOn, isStreamingOn, isHLSRunning } = useRecordingStreaming(); const hmsActions = useHMSActions(); if (!permissions?.browserRecording || isHLSRunning) { return null; } if (isBrowserRecordingOn) { return ( Are you sure you want to end the recording? ); } return ( ); }; /** * @description only start recording button will be shown. */ export const StreamActions = () => { const isConnected = useHMSStore(selectIsConnectedToRoom); const isMobile = useMedia(cssConfig.media.md); const roomState = useHMSStore(selectRoomState); return ( {!isMobile && ( {roomState !== HMSRoomState.Preview ? : null} )} {isConnected && !isMobile ? : null} ); }; export const StopRecordingInSheet = ({ onStopRecording, onClose, }: { onStopRecording: () => void; onClose: () => void; }) => { return ( Stop Recording Are you sure you want to stop recording? You can’t undo this action. ); };