import React, { useEffect, useMemo, useState } from "react"; import { Alert, Card, Descriptions, Empty, Skeleton, Space, Tag, Typography, } from "antd"; import { useStore } from "../store"; import { JVMProbeCapabilities } from "../../wailsjs/go/app/App"; import { buildRpcConnectionConfig } from "../utils/connectionRpcConfig"; import { resolveJVMModeMeta } from "../utils/jvmRuntimePresentation"; import type { JVMCapability, TabData } from "../types"; import JVMModeBadge from "./jvm/JVMModeBadge"; import { getJVMWorkspaceCardStyle, JVMWorkspaceHero, JVMWorkspaceShell, } from "./jvm/JVMWorkspaceLayout"; const { Text } = Typography; const DESCRIPTION_STYLES = { label: { width: 120 } } as const; type JVMOverviewProps = { tab: TabData; }; const JVMOverview: React.FC = ({ tab }) => { const connection = useStore((state) => state.connections.find((item) => item.id === tab.connectionId), ); const theme = useStore((state) => state.theme); const darkMode = theme === "dark"; const providerMode = tab.providerMode || connection?.config.jvm?.preferredMode || "jmx"; const readOnly = connection?.config.jvm?.readOnly !== false; const allowedModes = connection?.config.jvm?.allowedModes || []; const [capabilities, setCapabilities] = useState([]); const [capabilityLoading, setCapabilityLoading] = useState(true); const [capabilityError, setCapabilityError] = useState(""); const endpointSummary = useMemo(() => { if (!connection?.config.jvm?.endpoint) { return ""; } const endpoint = connection.config.jvm.endpoint; if (!endpoint.enabled && !endpoint.baseUrl) { return ""; } return endpoint.baseUrl || "已启用"; }, [connection]); const agentSummary = useMemo(() => { if (!connection?.config.jvm?.agent) { return ""; } const agent = connection.config.jvm.agent; if (!agent.enabled && !agent.baseUrl) { return ""; } return agent.baseUrl || "已启用"; }, [connection]); const allowedModeSummary = useMemo(() => { const items = allowedModes.length > 0 ? allowedModes : ["jmx"]; return items.map((item) => resolveJVMModeMeta(item).label).join("、"); }, [allowedModes]); useEffect(() => { if (!connection) { setCapabilities([]); setCapabilityError("连接不存在或已被删除"); setCapabilityLoading(false); return; } let cancelled = false; const loadCapabilities = async () => { setCapabilityLoading(true); setCapabilityError(""); try { const result = await JVMProbeCapabilities( buildRpcConnectionConfig(connection.config, { database: "" }) as any, ); if (cancelled) { return; } if (result?.success === false) { setCapabilities([]); setCapabilityError( String(result?.message || "读取 JVM 模式能力失败"), ); return; } setCapabilities( Array.isArray(result?.data) ? (result.data as JVMCapability[]) : [], ); } catch (error: any) { if (!cancelled) { setCapabilities([]); setCapabilityError(error?.message || "读取 JVM 模式能力失败"); } } finally { if (!cancelled) { setCapabilityLoading(false); } } }; void loadCapabilities(); return () => { cancelled = true; }; }, [connection]); if (!connection) { return ( ); } const jmxHost = connection.config.jvm?.jmx?.host || connection.config.host; const jmxPort = connection.config.jvm?.jmx?.port || connection.config.port; const cardStyle = getJVMWorkspaceCardStyle(darkMode); return ( {connection.name} {" "} · {connection.config.host}:{connection.config.port} } badges={ <> {readOnly ? "只读连接" : "可写连接"} {connection.config.jvm?.environment || "dev"} } /> {resolveJVMModeMeta(providerMode).label} {allowedModeSummary} {`${jmxHost}:${jmxPort}`} {endpointSummary || "未配置"} {agentSummary || "未配置"} {"通过侧边栏展开模式节点后懒加载"} {capabilityLoading ? ( ) : capabilityError ? ( {capabilityError} } /> ) : capabilities.length === 0 ? ( ) : ( {capabilities.map((capability) => (
{capability.canBrowse ? "可浏览" : "不可浏览"} {capability.canWrite ? "可写" : "只读"} {capability.canPreview ? "支持预览" : "不支持预览"} {capability.reason ? ( {capability.reason} ) : null}
))}
)}
); }; export default JVMOverview;