/* eslint-disable @next/next/no-css-tags */ import React, { useState, useEffect, useContext, ReactElement } from 'react'; import { Skeleton, Card, Statistic, Row, Col } from 'antd'; import { formatDistanceToNow, formatRelative } from 'date-fns'; import dynamic from 'next/dynamic'; import { ServerStatusContext } from '../../utils/server-status-context'; import { LogTable } from '../../components/admin/LogTable'; import { Offline } from '../../components/admin/Offline'; import { StreamHealthOverview } from '../../components/admin/StreamHealthOverview'; import { LOGS_WARN, fetchData, FETCH_INTERVAL } from '../../utils/apis'; import { formatIPAddress, isEmptyObject } from '../../utils/format'; import { NewsFeed } from '../../components/admin/NewsFeed'; import { AdminLayout } from '../../components/layouts/AdminLayout'; // Lazy loaded components const UserOutlined = dynamic(() => import('@ant-design/icons/UserOutlined'), { ssr: false, }); const ClockCircleOutlined = dynamic(() => import('@ant-design/icons/ClockCircleOutlined'), { ssr: false, }); function streamDetailsFormatter(streamDetails) { return ( ); } export default function Home() { const serverStatusData = useContext(ServerStatusContext); const { broadcaster, serverConfig: configData } = serverStatusData || {}; const { remoteAddr, streamDetails } = broadcaster || {}; const encoder = streamDetails?.encoder || 'Unknown encoder'; const [logsData, setLogs] = useState([]); const getLogs = async () => { try { const result = await fetchData(LOGS_WARN); setLogs(result); } catch (error) { console.log('==== error', error); } }; const getMoreStats = () => { getLogs(); }; useEffect(() => { getMoreStats(); let intervalId = null; intervalId = setInterval(getMoreStats, FETCH_INTERVAL); return () => { clearInterval(intervalId); }; }, []); if (isEmptyObject(configData) || isEmptyObject(serverStatusData)) { return ( <> ); } if (!broadcaster) { return ; } // map out settings const videoQualitySettings = serverStatusData?.currentBroadcast?.outputSettings?.map(setting => { const { audioPassthrough, videoPassthrough, audioBitrate, videoBitrate, framerate } = setting; const audioSetting = audioPassthrough ? `${streamDetails.audioCodec || 'Unknown'}, ${streamDetails.audioBitrate} kbps` : `${audioBitrate || 'Unknown'} kbps`; const videoSetting = videoPassthrough ? `${streamDetails.videoBitrate || 'Unknown'} kbps, ${streamDetails.framerate} fps ${ streamDetails.width } x ${streamDetails.height}` : `${videoBitrate || 'Unknown'} kbps, ${framerate} fps`; return (
); }); // inbound const { viewerCount, sessionPeakViewerCount } = serverStatusData; const streamAudioDetailString = `${streamDetails.audioCodec}, ${ streamDetails.audioBitrate || 'Unknown' } kbps`; const broadcastDate = new Date(broadcaster.time); return (
} /> } /> } />
{videoQualitySettings}

); } Home.getLayout = function getLayout(page: ReactElement) { return ; };