import type { ReactNode } from 'react'; import { useEffect, useRef, useState } from 'react'; import { Tag, Title } from 'animal-island-ui'; import type { InstanceContext, InstanceModule } from '../app-shell.js'; import { canonicalHttpOrigin } from '../fleet/fleet-page.js'; import { displayStatus } from '../ui/locale.js'; export type CapabilityState = 'supported' | 'degraded' | 'unsupported' | 'unknown'; export interface InstanceCapability { readonly state: CapabilityState; readonly explanation?: string; } export type InstanceCapabilityMap = Readonly>>; export interface CapabilityDataSource { load(instanceId: string, signal: AbortSignal): Promise; } export interface InstanceDetailProps { readonly instanceId: string; readonly module: InstanceModule; readonly instance?: InstanceContext; readonly capabilities?: InstanceCapabilityMap; readonly capabilityDataSource?: CapabilityDataSource; readonly moduleContent?: ReactNode; } export const INSTANCE_MODULE_LABELS: Readonly> = { overview: '实例仪表盘', sim: 'SIM 卡', cellular: '蜂窝网络', 'device-network': '设备网络', messages: '短信管理', calls: '通话', esim: 'eSIM', vowifi: 'WiFi 通话', notifications: '通知', automation: '自动化', ota: 'OTA', configuration: '设备设置', 'device-backup': '设备备份', }; const MODULE_NAV: readonly InstanceModule[] = [ 'overview', 'sim', 'cellular', 'device-network', 'messages', 'calls', 'esim', 'vowifi', 'notifications', 'automation', 'ota', 'configuration', 'device-backup', ] as const satisfies readonly InstanceModule[]; const SHORT_LABELS: Readonly>> = { overview: '仪表盘', cellular: '蜂窝', 'device-network': '设备网络', messages: '短信', notifications: '通知', configuration: '设置', 'device-backup': '备份', }; const AUTH_LABELS = { authenticated: '已认证', 'auth-required': '需要认证' } as const; const FRESHNESS_LABELS = { fresh: '数据最新', stale: '数据可能过期', expired: '数据已过期', } as const; const DEFAULT_EXPLANATIONS: Readonly, string>> = { degraded: '此模块可用,但功能受限。', unsupported: '此实例不支持该模块。', unknown: '能力状态未知。', }; function canRender(capability: InstanceCapability | undefined): boolean { if (!capability) return true; return capability.state === 'supported' || capability.state === 'degraded'; } /** * Every tab is backed by a live device probe, so an unknown capability no longer hides a module; * the module itself reports the sections a device cannot serve. */ function canOpen(_module: InstanceModule, capability: InstanceCapability | undefined): boolean { return capability ? canRender(capability) : true; } function explanation(capability: InstanceCapability | undefined): string | null { if (!capability) return null; if (capability.state === 'supported') return null; return capability.explanation?.trim() || DEFAULT_EXPLANATIONS[capability.state]; } /** * Owner-fenced instance context and capability navigation for every instance route. * Capability discovery is injected: this framework deliberately assumes no API or operation IDs. */ export function InstanceDetail({ instanceId, module, instance, capabilities, capabilityDataSource, moduleContent, }: InstanceDetailProps) { const ownsRoute = instance?.id === instanceId; const [loadedCapabilities, setLoadedCapabilities] = useState(); const [loading, setLoading] = useState(false); const [loadError, setLoadError] = useState(null); const requestRef = useRef(0); useEffect(() => { const request = ++requestRef.current; setLoadedCapabilities(undefined); setLoadError(null); if (!ownsRoute || capabilities || !capabilityDataSource) { setLoading(false); return; } const controller = new AbortController(); setLoading(true); void capabilityDataSource.load(instanceId, controller.signal).then( (result) => { if (!controller.signal.aborted && requestRef.current === request) { setLoadedCapabilities(result); setLoading(false); } }, (error: unknown) => { void error; if (!controller.signal.aborted && requestRef.current === request) { setLoadError('能力探测失败。'); setLoading(false); } }, ); return () => controller.abort(); }, [capabilities, capabilityDataSource, instanceId, ownsRoute]); if (!ownsRoute) { return (

{INSTANCE_MODULE_LABELS[module]}

此路由缺少实例上下文。

); } const map = capabilities ?? loadedCapabilities ?? {}; const origin = canonicalHttpOrigin(instance.origin); const activeCapability = map[module]; return (
返回实例总览

{instance.name}

{instance.id}
{instance.status !== 'unknown' ? ( {displayStatus(instance.status)} ) : null} {instance.authentication !== 'unknown' ? ( {AUTH_LABELS[instance.authentication]} ) : null} {instance.freshness !== 'unknown' ? ( {FRESHNESS_LABELS[instance.freshness]} ) : null}
{instance.status !== 'unknown' ? (
状态
{displayStatus(instance.status)}
) : null}
{origin ? 源站已由控制平面托管 : null} 编辑实例

{INSTANCE_MODULE_LABELS[module]}

{loading ?

正在加载能力…

: null} {loadError ?

能力不可用:{loadError}

: null} {!loading && canOpen(module, activeCapability) ? ( <> {activeCapability?.state === 'degraded' ? (

{explanation(activeCapability)}

) : null} {moduleContent ??

查看{INSTANCE_MODULE_LABELS[module]}数据和可用操作。

} ) : null} {!loading && !canOpen(module, activeCapability) ? (

{explanation(activeCapability)}

) : null}
); }