import { useState, useEffect, useCallback, useMemo } from 'react'; import { useParams, useNavigate, Link } from 'react-router-dom'; import { Card, CardContent } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import { RefreshCw, ChevronRight, Bell, AlertTriangle, Info } from 'lucide-react'; import { kubernetesApi } from '@/services/api'; export default function EventsPage() { const { clusterCode } = useParams<{ clusterCode: string }>(); const navigate = useNavigate(); const [loading, setLoading] = useState(false); const [events, setEvents] = useState([]); const [clusters, setClusters] = useState([]); const [namespaces, setNamespaces] = useState([]); const [selectedNs, setSelectedNs] = useState('all'); const [filterType, setFilterType] = useState('all'); const [activeCluster, setActiveCluster] = useState(clusterCode || ''); useEffect(() => { kubernetesApi.getClusters().then((res: any) => { const list = res?.list || []; setClusters(list); if (!activeCluster && list.length > 0) { const code = list[0].code || String(list[0].id); setActiveCluster(code); navigate(`/kubernetes/${code}/events`, { replace: true }); } }).catch(() => {}); }, []); useEffect(() => { if (!activeCluster) return; kubernetesApi.getNamespaces(activeCluster).then((res: any) => { setNamespaces(Array.isArray(res) ? res : (res?.list || res?.data || [])); }).catch(() => {}); }, [activeCluster]); const loadEvents = useCallback(async () => { if (!activeCluster) return; setLoading(true); try { const ns = selectedNs === 'all' ? undefined : selectedNs; const ft = filterType === 'all' ? undefined : filterType; const res: any = await kubernetesApi.getEvents(activeCluster, ns, ft); setEvents(Array.isArray(res) ? res : (res?.list || [])); } catch { setEvents([]); } finally { setLoading(false); } }, [activeCluster, selectedNs, filterType]); useEffect(() => { loadEvents(); }, [loadEvents]); const warningCount = useMemo(() => events.filter(e => e.type === 'Warning').length, [events]); const normalCount = useMemo(() => events.filter(e => e.type === 'Normal').length, [events]); return (
集群 {activeCluster && <>{activeCluster}} 事件

集群事件

总数

{events.length}

Warning

{warningCount}

Normal

{normalCount}

类型 原因 对象 消息 次数 最后时间 {events.length === 0 ? ( 暂无事件{loading ? ⏳ : ''} ) : events.map((e, i) => ( {e.type === 'Warning' ? ( Warning ) : ( Normal )} {e.reason || '-'} {e.object || '-'} {e.message || '-'} {e.count || 1} {e.last_time?.replace('T', ' ').substring(0, 19) || '-'} ))}
); }