'use client'; import { useRef, useState } from 'react'; import { useReport } from '@/hooks/useReport'; import ReportHeader from '@/components/report/ReportHeader'; import SummaryCards from '@/components/report/SummaryCards'; import TimeSeriesChart from '@/components/charts/TimeSeriesChart'; import NetworkChart from '@/components/charts/NetworkChart'; import NodeTable from '@/components/report/NodeTable'; import NasTable from '@/components/report/NasTable'; import NetworkTable from '@/components/report/NetworkTable'; import AlertPanel from '@/components/report/AlertPanel'; import NetworkAlertPanel from '@/components/report/NetworkAlertPanel'; import ErrorBoundary from '@/components/ErrorBoundary'; function getDefaultRange() { const end = new Date(); const start = new Date(end.getTime() - 7 * 24 * 60 * 60 * 1000); return { start: start.toISOString().slice(0, 10), end: end.toISOString().slice(0, 10), }; } export default function Home() { const defaultRange = getDefaultRange(); const [startDate, setStartDate] = useState(defaultRange.start); const [endDate, setEndDate] = useState(defaultRange.end); const [appliedStart, setAppliedStart] = useState(defaultRange.start); const [appliedEnd, setAppliedEnd] = useState(defaultRange.end); const { data, isLoading, error } = useReport(appliedStart, appliedEnd); const reportRef = useRef(null); const isDirty = startDate !== appliedStart || endDate !== appliedEnd; const applyRange = () => { setAppliedStart(startDate); setAppliedEnd(endDate); }; const handleExportPdf = async () => { if (!reportRef.current) return; const html2canvas = (await import('html2canvas')).default; const { default: jsPDF } = await import('jspdf'); const canvas = await html2canvas(reportRef.current, { scale: 2, useCORS: true }); const imgData = canvas.toDataURL('image/png'); const pdf = new jsPDF('p', 'mm', 'a4'); const pdfWidth = pdf.internal.pageSize.getWidth(); const pdfHeight = (canvas.height * pdfWidth) / canvas.width; let heightLeft = pdfHeight; let position = 0; pdf.addImage(imgData, 'PNG', 0, position, pdfWidth, pdfHeight); heightLeft -= pdf.internal.pageSize.getHeight(); while (heightLeft > 0) { position -= pdf.internal.pageSize.getHeight(); pdf.addPage(); pdf.addImage(imgData, 'PNG', 0, position, pdfWidth, pdfHeight); heightLeft -= pdf.internal.pageSize.getHeight(); } pdf.save(`infra-report-${startDate}_${endDate}.pdf`); }; const setPresetRange = (days: number) => { const end = new Date(); const start = new Date(end.getTime() - days * 24 * 60 * 60 * 1000); setStartDate(start.toISOString().slice(0, 10)); setEndDate(end.toISOString().slice(0, 10)); }; if (isLoading) { return (
데이터 로딩 중...
); } if (error || !data) { return (
데이터 로딩 실패: {String(error)}
); } return (
setStartDate(e.target.value)} className="px-3 py-1.5 text-sm border rounded bg-white" /> ~ setEndDate(e.target.value)} className="px-3 py-1.5 text-sm border rounded bg-white" />
{[1, 3, 7, 14, 30].map((d) => ( ))}
{data.metrics.nas && data.metrics.nas.length > 0 && (
)}

노드별 상세

{data.metrics.nas && data.metrics.nas.length > 0 && (

NAS 사용률 상세

)}

Ingress Network 상세

Istio Network 상세

); }