From 1dc02feecaa5f89225519f1c2c75a0eee35dc361 Mon Sep 17 00:00:00 2001 From: Bennet Gallein Date: Mon, 21 Apr 2025 14:54:44 +0200 Subject: [PATCH] fix: remove accordeons again --- components/MaintenanceAlert.tsx | 66 ++++++++++++++++++ components/OverallStatus.tsx | 114 +++++++++----------------------- 2 files changed, 98 insertions(+), 82 deletions(-) create mode 100644 components/MaintenanceAlert.tsx diff --git a/components/MaintenanceAlert.tsx b/components/MaintenanceAlert.tsx new file mode 100644 index 0000000..1beaf95 --- /dev/null +++ b/components/MaintenanceAlert.tsx @@ -0,0 +1,66 @@ +import { Alert, List, Text } from '@mantine/core' +import { IconAlertTriangle } from '@tabler/icons-react' +import { Maintenances, Monitor } from '@/types/config' +import { pageConfig } from '@/uptime.config' + +export default function MaintenanceAlert({ + maintenance, + groupedMonitor, +}: { + maintenance: Omit & { monitors: Monitor[] | undefined } + groupedMonitor: boolean +}) { + return ( + } + title={maintenance.title} + color={maintenance.color || 'primary'} + mt="md" + ml="md" + mr="md" + withCloseButton={false} + style={{ maxWidth: groupedMonitor ? '897px' : '865px', position: 'relative' }} + > + {/* Date range in top right */} + {(maintenance.start || maintenance.end) && ( +
+ {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} + ))} + + + )} +
+ ) +} diff --git a/components/OverallStatus.tsx b/components/OverallStatus.tsx index 0a2a5cf..d30174e 100644 --- a/components/OverallStatus.tsx +++ b/components/OverallStatus.tsx @@ -1,24 +1,17 @@ import { Maintenances, Monitor } from '@/types/config' -import { Alert, Center, Container, List, Text, Title } from '@mantine/core' -import { IconCircleCheck, IconAlertCircle, IconAlertTriangle } from '@tabler/icons-react' +import { Center, Container, Title } from '@mantine/core' +import { IconCircleCheck, IconAlertCircle } from '@tabler/icons-react' import { useEffect, useState } from 'react' +import MaintenanceAlert from './MaintenanceAlert' +import { pageConfig } from '@/uptime.config' function useWindowVisibility() { const [isVisible, setIsVisible] = useState(true) - useEffect(() => { - const handleVisibilityChange = () => { - console.log('visibility change', document.visibilityState) - setIsVisible(document.visibilityState === 'visible') - } - + const handleVisibilityChange = () => setIsVisible(document.visibilityState === 'visible') document.addEventListener('visibilitychange', handleVisibilityChange) - - return () => { - document.removeEventListener('visibilitychange', handleVisibilityChange) - } + return () => document.removeEventListener('visibilitychange', handleVisibilityChange) }, []) - return isVisible } @@ -31,6 +24,9 @@ export default function OverallStatus({ maintenances: Maintenances[] monitors: Monitor[] }) { + let group = pageConfig.group + let groupedMonitor = (group && Object.keys(group).length > 0) || false + let statusString = '' let icon = if (state.overallUp === 0 && state.overallDown === 0) { @@ -52,16 +48,12 @@ export default function OverallStatus({ useEffect(() => { const interval = setInterval(() => { - if (!isWindowVisible) { - return - } + 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) }) @@ -70,71 +62,29 @@ export default function OverallStatus({ 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)! - ), - } - }) + .map((maintenance) => ({ + ...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" - ml="md" - mr="md" - withCloseButton={false} - style={{ maxWidth: '865px', margin: '0 auto' }} - > - - {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} - ))} - - - )} -
- ))} -
- + +
{icon}
+ + {statusString} + + + Last updated on:{' '} + {`${new Date(state.lastUpdate * 1000).toLocaleString()} (${ + currentTime - state.lastUpdate + } sec ago)`} + + + {filteredMaintenances.map((maintenance, idx) => ( + + ))} +
) }