import { Maintenances, Monitor } from '@/types/config'
import { Alert, Card, Center, Container, List, ListItem, Text, Title } from '@mantine/core'
import { IconCircleCheck, IconAlertCircle, IconInfoCircle } from '@tabler/icons-react'
import { useEffect, useState } from 'react'
function useWindowVisibility() {
const [isVisible, setIsVisible] = useState(true)
useEffect(() => {
const handleVisibilityChange = () => {
console.log('visibility change', document.visibilityState)
setIsVisible(document.visibilityState === 'visible')
}
document.addEventListener('visibilitychange', handleVisibilityChange)
return () => {
document.removeEventListener('visibilitychange', handleVisibilityChange)
}
}, [])
return isVisible
}
export default function OverallStatus({
state,
maintenances,
monitors,
}: {
state: { overallUp: number; overallDown: number; lastUpdate: number }
maintenances: Maintenances[]
monitors: Monitor[]
}) {
let statusString = ''
let icon =
if (state.overallUp === 0 && state.overallDown === 0) {
statusString = 'No data yet'
} else if (state.overallUp === 0) {
statusString = 'All systems not operational'
} else if (state.overallDown === 0) {
statusString = 'All systems operational'
icon =
} else {
statusString = `Some systems not operational (${state.overallDown} out of ${
state.overallUp + state.overallDown
})`
}
const [openTime] = useState(Math.round(Date.now() / 1000))
const [currentTime, setCurrentTime] = useState(Math.round(Date.now() / 1000))
const isWindowVisible = useWindowVisibility()
useEffect(() => {
const interval = setInterval(() => {
if (!isWindowVisible) {
return
}
if (currentTime - state.lastUpdate > 300 && currentTime - openTime > 30) {
// trigger a re-fetch
window.location.reload()
}
setCurrentTime(Math.round(Date.now() / 1000))
}, 1000)
return () => clearInterval(interval)
})
const now = new Date()
let filteredMaintenances: (Omit & {
monitors: Monitor[] | undefined
})[] = (maintenances || [])
.filter((m) => (!m.start && !m.end) || (m.start && m.end && now >= m.start && now <= m.end))
.map((maintenance) => {
// enrich maintenace with monitor
return {
...maintenance,
monitors: maintenance.monitors?.map(
(monitorId) => monitors.find((mon) => monitorId === mon.id)!
),
}
})
return (
<>
{icon}
{statusString}
Last updated on:{' '}
{`${new Date(state.lastUpdate * 1000).toLocaleString()} (${
currentTime - state.lastUpdate
} sec ago)`}
{filteredMaintenances &&
filteredMaintenances.map((maintenance, idx) => (
}
title={maintenance.title}
color={maintenance.color || 'primary'}
mt="md"
withCloseButton={false}
>
{maintenance.start && (
<>
From: {maintenance.start.toLocaleString()}
>
)}
{maintenance.end && (
<>
To: {maintenance.end.toLocaleString()}
>
)}
{maintenance.body && {maintenance.body}}
{maintenance.monitors && maintenance.monitors.length > 0 && (
<>
Affected components:
{maintenance.monitors.map((comp, compIdx) => (
{comp.name}
))}
>
)}
))}
>
)
}