import { Box, Button, Chip, Container, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from '@mui/material' import { useState } from 'react' import { interval } from 'rxjs' import LivestreamDialog from '../components/livestream/LivestreamDialog' import LivestreamSpeedDial from '../components/livestream/LivestreamSpeedDial' import NoLivestreams from '../components/livestream/NoLivestreams' import LoadingBackdrop from '../components/LoadingBackdrop' import { useSubscription } from '../hooks/observable' import { useI18n } from '../hooks/useI18n' import { useRPC } from '../hooks/useRPC' import { LiveStreamProgress, LiveStreamStatus } from '../types' const LiveStreamMonitorView: React.FC = () => { const { i18n } = useI18n() const { client } = useRPC() const [progress, setProgress] = useState() const [openDialog, setOpenDialog] = useState(false) useSubscription(interval(1000), () => { client .progressLivestream() .then(r => setProgress(r.result)) }) const formatMicro = (microseconds: number) => { const ms = microseconds / 1_000_000 let s = ms / 1000 const hr = s / 3600 s %= 3600 const mt = s / 60 s %= 60 // huh? const ss = (Math.abs(s - 1)).toFixed(0).padStart(2, '0') const mts = mt.toFixed(0).padStart(2, '0') const hrs = hr.toFixed(0).padStart(2, '0') return `${hrs}:${mts}:${ss}` } const mapStatusToChip = (status: LiveStreamStatus): React.ReactNode => { switch (status) { case LiveStreamStatus.WAITING: return case LiveStreamStatus.IN_PROGRESS: return case LiveStreamStatus.COMPLETED: return case LiveStreamStatus.ERRORED: return default: return } } const stopAll = () => client.killAllLivestream() const stop = (url: string) => client.killLivestream(url) return ( <> setOpenDialog(s => !s)} onStopAll={stopAll} /> setOpenDialog(s => !s)} /> {!progress || Object.keys(progress).length === 0 ? : {i18n.t('livestreamURLInput')} Status Time to live Starts on Actions {progress && Object.keys(progress).map(k => ( {k} {mapStatusToChip(progress[k].status)} {progress[k].status === LiveStreamStatus.WAITING ? formatMicro(Number(progress[k].waitTime)) : "-" } {progress[k].status === LiveStreamStatus.WAITING ? new Date(progress[k].liveDate).toLocaleString() : "-" } ))}
} ) } export default LiveStreamMonitorView