hololake-system-architecture/product-source/guanghu-knowledge-base/src/components/DomainConnectionSheet.tsx

71 lines
4.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { Cloud, Laptop, ShieldCheck, X } from 'lucide-react';
import { projectDomainConnectionSteps, projectDomainTrustSource, type DomainAccessProjection } from '../domain-connection';
import { canEnterSelectedDomainRuntime, projectDomainRuntimeBoundary, type DomainEntryTarget, type DomainNodeType } from '../domain-entry-state';
import { publicDomainDirectory, type DomainRouteId } from '../public-domain-directory';
interface Props {
access: DomainAccessProjection;
target: DomainEntryTarget | null;
open: boolean;
onClose: () => void;
onSelectTarget: (routeId: DomainRouteId) => void;
onSelectNodeType: (nodeType: DomainNodeType) => void;
onEnterRuntime: () => void;
onOpenCodeChannel: () => void;
}
export function DomainConnectionSheet({ access, target, open, onClose, onSelectTarget, onSelectNodeType, onEnterRuntime, onOpenCodeChannel }: Props) {
if (!open) return null;
const steps = projectDomainConnectionSteps(access);
const canEnter = canEnterSelectedDomainRuntime(target, access);
return (
<div className="storage-sheet-backdrop" role="presentation" onMouseDown={event => {
if (event.target === event.currentTarget) onClose();
}}>
<section className="storage-sheet domain-connection-sheet" role="dialog" aria-modal="true" aria-labelledby="domain-connection-title">
<header className="storage-sheet-header">
<div>
<small>{target?.domain.stableDomainId ?? 'SELECT-DOMAIN'}</small>
<h2 id="domain-connection-title">{target ? `接入${target.domain.displayName}` : '选择要接入的域'}</h2>
</div>
<button className="icon-button" onClick={onClose} aria-label="关闭域接入状态"><X aria-hidden="true" /></button>
</header>
<p className="domain-connection-lead">线</p>
<div className="domain-target-picker" aria-label="选择目标域">
{publicDomainDirectory.map(domain => <button key={domain.routeId} type="button" data-selected={target?.domain.routeId === domain.routeId} onClick={() => onSelectTarget(domain.routeId)}><span>{domain.directoryNumber}</span>{domain.displayName}</button>)}
</div>
{!target ? <p className="domain-connection-boundary">{projectDomainRuntimeBoundary(target, access)}</p> : <>
<p className="domain-connection-boundary">{projectDomainTrustSource(access)}</p>
<div className="domain-node-modes" aria-label="支持的节点类型">
<button type="button" data-selected={target.nodeType === 'local-terminal'} onClick={() => onSelectNodeType('local-terminal')}><Laptop aria-hidden="true" /><span><strong></strong><small>使</small></span></button>
<button type="button" data-selected={target.nodeType === 'cloud-resident'} onClick={() => onSelectNodeType('cloud-resident')}><Cloud aria-hidden="true" /><span><strong></strong><small>线</small></span></button>
</div>
<ol className="domain-connection-steps">
{steps.map((step, index) => (
<li key={step.id} data-state={step.state}>
<span>{step.state === 'verified' ? <ShieldCheck aria-hidden="true" /> : index + 1}</span>
<div><strong>{step.label}</strong><small>{step.detail}</small></div>
<em>{step.state === 'verified' ? '已验证' : step.state === 'checking' ? '核对中' : '待完成'}</em>
</li>
))}
</ol>
<p className="domain-connection-boundary">{projectDomainRuntimeBoundary(target, access)} </p>
</>}
<footer className="storage-sheet-footer">
<button className="secondary-button" onClick={onOpenCodeChannel} disabled={!target}></button>
<span />
<button className="secondary-button" onClick={onClose}></button>
<button className="primary-button" onClick={onEnterRuntime} disabled={!canEnter}>
{canEnter ? '进入第五域运行体' : target ? '等待可信域接入' : '请先选择域'}
</button>
</footer>
</section>
</div>
);
}