project-nomad/admin/inertia/hooks/useDiskAlert.ts
LuisMIguelFurlanettoSousa f9583ff3b8 feat(system): adicionar notificações de espaço em disco
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
2026-03-23 11:18:15 -03:00

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,
}
}