mirror of
https://github.com/Crosstalk-Solutions/project-nomad.git
synced 2026-03-28 03:29:25 +01:00
Adiciona monitoramento de disco com alertas globais quando o uso ultrapassa thresholds configuráveis (85% warning, 95% critical). - Novo endpoint GET /api/system/disk-status - getDiskStatus() no SystemService com thresholds via KVStore - Hook useDiskAlert com polling de 45s e dismiss via localStorage - DiskAlertBanner no AppLayout visível em todas as páginas - Banner reaparece se o nível de alerta piorar Closes #485
54 lines
1.3 KiB
TypeScript
54 lines
1.3 KiB
TypeScript
import { useQuery } from '@tanstack/react-query'
|
|
import { useState, useMemo } from 'react'
|
|
import api from '~/lib/api'
|
|
|
|
type DiskAlertLevel = 'none' | 'warning' | 'critical'
|
|
|
|
interface DiskStatusResponse {
|
|
level: DiskAlertLevel
|
|
threshold: number
|
|
highestUsage: number
|
|
diskName: string
|
|
}
|
|
|
|
const DISMISSED_KEY = 'nomad:disk-alert-dismissed-level'
|
|
|
|
export function useDiskAlert() {
|
|
const [dismissedLevel, setDismissedLevel] = useState<DiskAlertLevel | null>(() => {
|
|
try {
|
|
return localStorage.getItem(DISMISSED_KEY) as DiskAlertLevel | null
|
|
} catch {
|
|
return null
|
|
}
|
|
})
|
|
|
|
const { data: diskStatus } = useQuery<DiskStatusResponse | undefined>({
|
|
queryKey: ['disk-status'],
|
|
queryFn: async () => await api.getDiskStatus(),
|
|
refetchInterval: 45000,
|
|
})
|
|
|
|
const shouldShow = useMemo(() => {
|
|
if (!diskStatus || diskStatus.level === 'none') return false
|
|
if (!dismissedLevel) return true
|
|
// Exibe novamente se o nível piorou
|
|
if (dismissedLevel === 'warning' && diskStatus.level === 'critical') return true
|
|
return false
|
|
}, [diskStatus, dismissedLevel])
|
|
|
|
const dismiss = () => {
|
|
if (diskStatus) {
|
|
setDismissedLevel(diskStatus.level)
|
|
try {
|
|
localStorage.setItem(DISMISSED_KEY, diskStatus.level)
|
|
} catch {}
|
|
}
|
|
}
|
|
|
|
return {
|
|
diskStatus,
|
|
shouldShow,
|
|
dismiss,
|
|
}
|
|
}
|