import { MonitorState, MonitorTarget } from '@/types/config' import { Accordion, Card, Center, Text } from '@mantine/core' import MonitorDetail from './MonitorDetail' import { pageConfig } from '@/uptime.config' import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' function countDownCount(state: MonitorState, ids: string[]) { let downCount = 0 for (let id of ids) { if (state.incident[id] === undefined || state.incident[id].length === 0) { continue } if (state.incident[id].slice(-1)[0].end === null) { downCount++ } } return downCount } function getStatusTextColor(state: MonitorState, ids: string[]) { let downCount = countDownCount(state, ids) if (downCount === 0) { return '#059669' } else if (downCount === ids.length) { return '#df484a' } else { return '#f29030' } } export default function MonitorList({ monitors, state, }: { monitors: MonitorTarget[] state: MonitorState }) { const { t } = useTranslation('common') const group = pageConfig.group const groupedMonitor = group && Object.keys(group).length > 0 let content // Load expanded groups from localStorage const savedExpandedGroups = localStorage.getItem('expandedGroups') const expandedInitial = savedExpandedGroups ? JSON.parse(savedExpandedGroups) : Object.keys(group || {}) const [expandedGroups, setExpandedGroups] = useState(expandedInitial) useEffect(() => { localStorage.setItem('expandedGroups', JSON.stringify(expandedGroups)) }, [expandedGroups]) if (groupedMonitor) { // Grouped monitors content = ( setExpandedGroups(values)} > {Object.keys(group).map((groupName) => (
{groupName}
{group[groupName].length - countDownCount(state, group[groupName])}/ {group[groupName].length} {t('Operational')}
{monitors .filter((monitor) => group[groupName].includes(monitor.id)) .sort((a, b) => group[groupName].indexOf(a.id) - group[groupName].indexOf(b.id)) .map((monitor) => (
))}
))}
) } else { // Ungrouped monitors content = monitors.map((monitor) => (
)) } return (
{content}
) }