diff --git a/components/OverallStatus.tsx b/components/OverallStatus.tsx index 31fcd22..72252d6 100644 --- a/components/OverallStatus.tsx +++ b/components/OverallStatus.tsx @@ -1,5 +1,25 @@ import { Center, Title } from '@mantine/core' import { IconCircleCheck, IconAlertCircle } 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, @@ -16,11 +36,28 @@ export default function OverallStatus({ statusString = 'All systems operational' icon = } else { - statusString = `Some systems not operational (${state.overallDown} out of ${ - state.overallUp + state.overallDown - })` + 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) + }) + return ( <>
{icon}
@@ -29,9 +66,7 @@ export default function OverallStatus({ Last updated on:{' '} - {`${new Date(state.lastUpdate * 1000).toLocaleString()} (${ - Math.round(Date.now() / 1000) - state.lastUpdate - } sec ago)`} + {`${new Date(state.lastUpdate * 1000).toLocaleString()} (${currentTime - state.lastUpdate} sec ago)`} )