import { Alert, List, Text, useMantineTheme } from '@mantine/core' import { useMediaQuery } from '@mantine/hooks' import { IconAlertTriangle } from '@tabler/icons-react' import { MaintenanceConfig, MonitorTarget } from '@/types/config' import { pageConfig } from '@/uptime.config' import { useTranslation } from 'react-i18next' export default function MaintenanceAlert({ maintenance, style, upcoming = false, }: { maintenance: Omit & { monitors?: (MonitorTarget | undefined)[] } style?: React.CSSProperties upcoming?: boolean }) { const { t } = useTranslation('common') const theme = useMantineTheme() const isDesktop = useMediaQuery(`(min-width: ${theme.breakpoints.sm})`) return ( } title={ {(upcoming ? t('Upcoming') : '') + (maintenance.title || t('Scheduled Maintenance'))} } color={ upcoming ? pageConfig.maintenances?.upcomingColor ?? 'gray' : maintenance.color || 'yellow' } withCloseButton={false} style={{ margin: '16px auto 0 auto', ...style }} > {/* Date range in top right (desktop) or inline (mobile) */}
{upcoming ? t('Scheduled for') : t('From')}
{new Date(maintenance.start).toLocaleString()}
{upcoming ? t('Expected end') : t('To')}
{maintenance.end ? new Date(maintenance.end).toLocaleString() : t('Until further notice')}
{maintenance.body} {maintenance.monitors && maintenance.monitors.length > 0 && ( <> {t('Affected components')} {maintenance.monitors.map((comp, compIdx) => ( {comp?.name ?? t('MONITOR ID NOT FOUND')} ))} )}
) }