diff --git a/web/components/stream-health-overview.tsx b/web/components/stream-health-overview.tsx new file mode 100644 index 000000000..55ad5435d --- /dev/null +++ b/web/components/stream-health-overview.tsx @@ -0,0 +1,65 @@ +import { CheckCircleOutlined, ExclamationCircleOutlined } from '@ant-design/icons'; +import { Alert, Button, Col, Row, Statistic } from 'antd'; +import Link from 'next/link'; +import React, { useContext } from 'react'; +import { ServerStatusContext } from '../utils/server-status-context'; + +export default function StreamHealthOverview() { + const serverStatusData = useContext(ServerStatusContext); + const { health } = serverStatusData; + + if (!health) { + return null; + } + + const { healthy, healthPercentage, message } = health; + console.log(healthPercentage); + let color = '#3f8600'; + let icon: 'success' | 'info' | 'warning' | 'error' = 'info'; + if (healthPercentage < 80) { + color = '#cf000f'; + icon = 'error'; + } else if (healthPercentage < 30) { + color = '#f0ad4e'; + icon = 'error'; + } + + return ( +
+ + + : } + /> + + + + + + + + + + + } + /> + + +
+ ); +} diff --git a/web/pages/index.tsx b/web/pages/index.tsx index 18b53a5ef..36014bf14 100644 --- a/web/pages/index.tsx +++ b/web/pages/index.tsx @@ -5,6 +5,7 @@ import { formatDistanceToNow, formatRelative } from 'date-fns'; import { ServerStatusContext } from '../utils/server-status-context'; import LogTable from '../components/log-table'; import Offline from '../components/offline-notice'; +import StreamHealthOverview from '../components/stream-health-overview'; import { LOGS_WARN, fetchData, FETCH_INTERVAL } from '../utils/apis'; import { formatIPAddress, isEmptyObject } from '../utils/format'; @@ -132,6 +133,7 @@ export default function Home() { /> + @@ -165,6 +167,7 @@ export default function Home() { /> + diff --git a/web/types/config-section.ts b/web/types/config-section.ts index 65df5b9bb..7d6efe349 100644 --- a/web/types/config-section.ts +++ b/web/types/config-section.ts @@ -125,6 +125,12 @@ export interface NotificationsConfig { twitter: TwitterNotification; } +export interface Health { + healthy: boolean; + healthyPercentage: number; + message: string; +} + export interface ConfigDetails { externalActions: ExternalAction[]; ffmpegPath: string; diff --git a/web/utils/server-status-context.tsx b/web/utils/server-status-context.tsx index 3ae66f36f..77d554c07 100644 --- a/web/utils/server-status-context.tsx +++ b/web/utils/server-status-context.tsx @@ -89,6 +89,11 @@ const initialServerStatusState = { versionNumber: '0.0.0', streamTitle: '', chatDisabled: false, + health: { + healthy: true, + healthPercentage: 100, + message: '', + }, }; export const ServerStatusContext = React.createContext({