UNPKG

@100mslive/roomkit-react

Version:

![Banner](https://github.com/100mslive/web-sdks/blob/06c65259912db6ccd8617f2ecb6fef51429251ec/prebuilt-banner.png)

113 lines (101 loc) 3.56 kB
import { useMemo } from 'react'; import { ConferencingScreen, DefaultConferencingScreen_Elements, DefaultPreviewScreen_Elements, HLSLiveStreamingScreen_Elements, LeaveScreen, PreviewScreen, Screens, } from '@100mslive/types-prebuilt'; import { selectHLSState, selectPeerCount, selectRoomStartTime, useHMSStore, useRecordingStreaming, } from '@100mslive/react-sdk'; import { useRoomLayout } from '..'; // @ts-ignore import { getFormattedCount } from '../../../common/utils'; export type useRoomLayoutScreenProps = { screen: keyof Screens; }; type useRoomLayoutScreenReturnType<T extends useRoomLayoutScreenProps> = T['screen'] extends 'conferencing' ? ConferencingScreen : T['screen'] extends 'leave' ? LeaveScreen : T['screen'] extends 'preview' ? PreviewScreen : undefined; function useRoomLayoutScreen<T extends useRoomLayoutScreenProps>({ screen, }: T): useRoomLayoutScreenReturnType<T> | undefined { const roomLayout = useRoomLayout(); const screenProps = roomLayout?.screens?.[screen] as useRoomLayoutScreenReturnType<T> | undefined; return screenProps; } type PreviewKeys = Omit<PreviewScreen, 'skip_preview_screen'>; export function useRoomLayoutPreviewScreen() { const screenProps = useRoomLayoutScreen({ screen: 'preview' }); const isPreviewScreenEnabled = !!screenProps && !screenProps?.skip_preview_screen; let elements: DefaultPreviewScreen_Elements | undefined; let screenType: keyof PreviewKeys | undefined; if (isPreviewScreenEnabled) { screenType = Object.keys(screenProps).filter(key => key !== 'skip_preview_screen')[0] as keyof PreviewKeys; elements = screenProps[screenType]?.elements; } return { isPreviewScreenEnabled, elements, screenType, }; } export type ConferencingScreenElements = DefaultConferencingScreen_Elements & HLSLiveStreamingScreen_Elements; export function useRoomLayoutConferencingScreen() { const screenProps = useRoomLayoutScreen({ screen: 'conferencing' }) || {}; const screenType = Object.keys(screenProps)[0] as keyof ConferencingScreen; const elements = screenProps[screenType]?.elements as ConferencingScreenElements; // @ts-ignore const hideSections: string[] = screenProps[screenType]?.hideSections || []; return { hideSections, elements, screenType, }; } export function useRoomLayoutLeaveScreen() { const screenProps = useRoomLayoutScreen({ screen: 'leave' }); const isLeaveScreenEnabled = !!screenProps; return { isLeaveScreenEnabled, feedback: screenProps?.default?.elements?.feedback, }; } export function useRoomLayoutHeader() { const { elements } = useRoomLayoutConferencingScreen(); // return elements.header; const { isRecordingOn } = useRecordingStreaming(); const peerCount = useHMSStore(selectPeerCount); const sessionStartedAt = useHMSStore(selectRoomStartTime); const hlsState = useHMSStore(selectHLSState); // People watching, start timestamp, recording status const details = useMemo(() => { const details = []; if (hlsState?.variants[0]?.['startedAt']) { details.push(`${getFormattedCount(peerCount)} watching`); details.push(hlsState.variants[0]['startedAt']); } else if (sessionStartedAt) { details.push(sessionStartedAt); } if (isRecordingOn) { details.push('Recording'); } return details; }, [hlsState?.variants, isRecordingOn, peerCount, sessionStartedAt]); return { title: elements.header?.title || '', description: elements.header?.description || '', details, }; }