import { useCallback } from 'react'; import { app as $appContent } from '../../content'; import { BREAKPOINTS, CONCURRENT_VIEWS } from '../../constants'; import { clsm } from '../../utils'; import { convertConcurrentViews } from '../../utils'; import { Hourglass, Visibility } from '../../assets/icons'; import { useResponsiveDevice } from '../../contexts/ResponsiveDevice'; import { useStreams } from '../../contexts/Streams'; import HealthIndicator from './HealthIndicator'; import StreamStatus from './StatusItem/StreamStatus'; import StatusItem from './StatusItem/StatusItem'; import useCurrentPage from '../../hooks/useCurrentPage'; import useElapsedTime from '../../hooks/useElapsedTime'; import { isFireFox } from '../../pages/Channel/Player/useProfileViewPlayerAnimation/utils'; const $content = $appContent.status_bar; const NO_DATA_VALUE = '------'; const NO_ELAPSED_TIME_VALUE = '--:--:--'; const StatusBar = () => { const { updateActiveStreamSession, streamSessions, hasStreamSessions, activeStreamSession } = useStreams(); const { currentBreakpoint } = useResponsiveDevice(); const isCurrentScreenXxs = currentBreakpoint === BREAKPOINTS.xxs; const latestStreamSessionData = hasStreamSessions ? streamSessions[0] : {}; const activeStreamSessionData = activeStreamSession ? activeStreamSession : {}; const currentPage = useCurrentPage(); const isStreamHealthPage = currentPage === 'stream_health'; const streamSessionData = isStreamHealthPage ? activeStreamSessionData : latestStreamSessionData; const { isHealthy, isLive, metrics, startTime, hasErrorEvent } = streamSessionData; // Elapsed Stream Time let elapsedTime = useElapsedTime(startTime); const isMac = navigator.userAgent.includes('Mac'); // Concurrent Stream Views const concurrentViewsMetric = metrics?.find( (metric) => metric.label === CONCURRENT_VIEWS ); let concurrentViewsValue = NO_DATA_VALUE; if (concurrentViewsMetric?.data?.length && isLive) { concurrentViewsValue = convertConcurrentViews( Math.round( concurrentViewsMetric.data[concurrentViewsMetric.data.length - 1] ) ); } else if ( typeof concurrentViewsMetric?.statistics?.average === 'number' && !isLive ) { concurrentViewsValue = convertConcurrentViews( Math.round(concurrentViewsMetric.statistics.average) ); } // Stream Health/Stability let health = NO_DATA_VALUE; // unknown stream health if (isHealthy === true) health = $content.stable; if (isHealthy === false) health = $content.poor; // Streams offline states if (!isStreamHealthPage && !isLive) { elapsedTime = NO_ELAPSED_TIME_VALUE; concurrentViewsValue = NO_DATA_VALUE; health = NO_DATA_VALUE; } else if (isStreamHealthPage && !isLive) { elapsedTime = $content.offline; } // Tooltip text let concurrentViewsTooltipText = ''; if (isLive) concurrentViewsTooltipText = $content.concurrent_views; else if (isStreamHealthPage && !isLive) { concurrentViewsTooltipText = $content.concurrent_views_offline; } const handleHealthClick = useCallback(() => { updateActiveStreamSession(streamSessions[0]); window.open('/health', '_blank'); }, [streamSessions, updateActiveStreamSession]); return (