76 lines
3.5 KiB
TypeScript
76 lines
3.5 KiB
TypeScript
import type { GamePluginRuntimeProfilesResponse, RuntimeDLLExtensionProfileResponse } from "../api/types";
|
|
|
|
interface RuntimeDLLExtensionsPanelProps {
|
|
runtimeProfiles?: GamePluginRuntimeProfilesResponse;
|
|
embedded?: boolean;
|
|
}
|
|
|
|
export function RuntimeDLLExtensionsPanel({ runtimeProfiles, embedded = false }: RuntimeDLLExtensionsPanelProps) {
|
|
const extensions = runtimeProfiles?.dllExtensions ?? [];
|
|
if (extensions.length === 0) {
|
|
return null;
|
|
}
|
|
const content = <RuntimeDLLExtensionsContent extensions={extensions} />;
|
|
return embedded ? <section className="console-module" aria-label="UE4SS DLL extensions">{content}</section> : <article className="console-panel" aria-label="UE4SS DLL extensions">{content}</article>;
|
|
}
|
|
|
|
function RuntimeDLLExtensionsContent({ extensions }: { extensions: RuntimeDLLExtensionProfileResponse[] }) {
|
|
return (
|
|
<>
|
|
<div className="panel-header">
|
|
<h2>UE4SS DLL 扩展</h2>
|
|
<span className="page-status">声明式、固定版本、启动前同步</span>
|
|
</div>
|
|
<p className="page-status">Run 不直接执行 DLL;已安装的 UE4SS 会在目标服务端正常启动时加载它。</p>
|
|
<div className="console-record-list">
|
|
{extensions.map((extension) => (
|
|
<article key={extension.key} className="console-record">
|
|
<div className="console-record-head">
|
|
<strong>{extension.displayName}</strong>
|
|
<span className={extension.releaseState === "ready" ? "status-pill status-active" : "status-pill status-disabled"}>{extension.releaseState === "ready" ? "已固定发布" : "待发布"}</span>
|
|
</div>
|
|
<div className="console-record-meta">
|
|
<span>{extension.key}</span>
|
|
<span>版本 {extension.version}</span>
|
|
</div>
|
|
<dl className="detail-list">
|
|
<div>
|
|
<dt>下载声明</dt>
|
|
<dd>{releaseLocation(extension)}</dd>
|
|
</div>
|
|
<div>
|
|
<dt>DLL 校验</dt>
|
|
<dd>{extension.checksum || "待发布后固定"}</dd>
|
|
</div>
|
|
<div>
|
|
<dt>目标可执行文件兼容</dt>
|
|
<dd>{extension.targetExecutableChecksum || "待发布后固定"}</dd>
|
|
</div>
|
|
<div>
|
|
<dt>UE4SS ABI</dt>
|
|
<dd>{extension.ue4ssAbi || "待发布后固定"}</dd>
|
|
</div>
|
|
</dl>
|
|
<div className="tag-list" aria-label={`${extension.displayName} activation policy`}>
|
|
<span>启动前自动校验和更新</span>
|
|
<span>运行:目标服务端受监管启动</span>
|
|
<span>由 UE4SS 正常加载</span>
|
|
<span>{supportedTargets(extension)}</span>
|
|
<span>Linux 启动前拒绝</span>
|
|
</div>
|
|
{extension.releaseState === "unpublished" && <p className="page-status">发布者尚未提供完整哈希、大小与兼容性固定值;此声明可查看,但不会派发给 Run。</p>}
|
|
</article>
|
|
))}
|
|
</div>
|
|
</>
|
|
);
|
|
}
|
|
|
|
function releaseLocation(extension: RuntimeDLLExtensionProfileResponse): string {
|
|
return [extension.releaseHost, extension.releaseFilename].filter((value): value is string => Boolean(value)).join(" / ") || "待发布";
|
|
}
|
|
|
|
function supportedTargets(extension: RuntimeDLLExtensionProfileResponse): string {
|
|
return extension.supportedTargets.map((target) => `${target.os} ${target.arch}`).join(", ") || "Windows amd64";
|
|
}
|