import { Sparkles, WandSparkles } from "lucide-react"; import { useCallback, useEffect, useState } from "react"; import { platformApiClient } from "../api/client"; import type { AuditEventResponse, RunEndpointResponse } from "../api/types"; import { EmptyState, ErrorState, LoadingState } from "../components/StateViews"; import { cx } from "../utils/classes"; type ModuleState = { status: "loading" } | { status: "error"; reason: string } | { status: "ready"; data: T }; export function MaintenancePage() { const [endpoints, setEndpoints] = useState>({ status: "loading" }); const [events, setEvents] = useState>({ status: "loading" }); const refreshEndpoints = useCallback(async () => { setEndpoints({ status: "loading" }); try { const response = await platformApiClient.listRunEndpoints(); setEndpoints({ status: "ready", data: response.items }); } catch (error) { setEndpoints({ status: "error", reason: error instanceof Error ? error.message : "加载失败" }); } }, []); const refreshEvents = useCallback(async () => { setEvents({ status: "loading" }); try { const response = await platformApiClient.listAuditEvents(); setEvents({ status: "ready", data: response.items }); } catch (error) { setEvents({ status: "error", reason: error instanceof Error ? error.message : "加载失败" }); } }, []); useEffect(() => { void refreshEndpoints(); void refreshEvents(); }, [refreshEndpoints, refreshEvents]); return (

平台管理员

系统维护

运行节点

{endpoints.status === "loading" && } {endpoints.status === "error" && ( void refreshEndpoints()} compact /> )} {endpoints.status === "ready" && endpoints.data.length === 0 && ( void refreshEndpoints()} /> )} {endpoints.status === "ready" && endpoints.data.length > 0 && (
{endpoints.data.map((endpoint) => (
{endpoint.displayName} {endpoint.id}
{endpoint.status === "online" ? "在线" : endpoint.status === "offline" ? "离线" : endpoint.status} 任务 {endpoint.capacity.runningJobs}/{endpoint.capacity.maxJobs}(排队 {endpoint.capacity.queuedJobs}) 心跳 {new Date(endpoint.lastHeartbeatAt).toLocaleString()}
))}
)}

审计事件

{events.status === "loading" && } {events.status === "error" && ( void refreshEvents()} compact /> )} {events.status === "ready" && events.data.length === 0 && ( void refreshEvents()} /> )} {events.status === "ready" && events.data.length > 0 && (
{events.data.slice(0, 30).map((event) => (
{event.summary || `${event.action} ${event.resourceKind}`} {event.result}
事件 {event.id} 操作者 {event.actorId} 资源 {event.resourceKind}/{event.resourceId} {new Date(event.createdAt).toLocaleString()}
))}
)}
); }