import { useState, useEffect, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { RefreshCw } from 'lucide-react'; import { kubernetesApi } from '@/api'; import { normalizeK8sEvent, formatEventRelative } from '../k8s-event-utils'; import type { NormalizedEvent } from '../k8s-event-utils'; import type { JsonData } from '@/types/common'; interface EventsTabProps { clusterCode?: string; } export function EventsTab({ clusterCode }: EventsTabProps) { const { t } = useTranslation(); const [events, setEvents] = useState([]); const [loading, setLoading] = useState(false); const fetchEvents = useCallback(async () => { if (!clusterCode) return; setLoading(true); try { const res = await kubernetesApi.getEvents(clusterCode); const arr = Array.isArray(res) ? res : (res?.list || []); const normalized = (arr as JsonData[]).map(normalizeK8sEvent); // Warning 优先,然后按 lastTime 降序 normalized.sort((a, b) => { if (a.type !== b.type) return a.type === 'Warning' ? -1 : 1; return new Date(b.lastTime || 0).getTime() - new Date(a.lastTime || 0).getTime(); }); setEvents(normalized.slice(0, 100)); } catch { setEvents([]); } finally { setLoading(false); } }, [clusterCode]); useEffect(() => { if (clusterCode) { fetchEvents(); } }, [clusterCode, fetchEvents]); if (loading) { return (
{t('common.loading')}
); } if (events.length === 0) { return (
{t('k8s.empty.events')}
{clusterCode && ( )}
); } return (
{events.map((event, index) => (
{event.type} {event.reason} {event.message} {event.count > 1 && ( ×{event.count} )} {event.object && event.object !== '-' && ( {event.object} )} {event.lastTime && ( {formatEventRelative(event.lastTime)} )}
))} {events.length === 100 && (
{t('k8s.event.totalCount', { count: 100 })}
)}
); }