继续收敛前端 IPC 错误正文
保留模板权限、Direct 订阅和剪贴板失败详情 补充前端回归测试与错误处理文档
This commit is contained in:
@@ -2,6 +2,8 @@ import { writeText } from '@tauri-apps/plugin-clipboard-manager';
|
||||
import { Copy } from 'lucide-react';
|
||||
import { useState } from 'react';
|
||||
|
||||
import { visibleClientErrorMessage } from '../../../services/errorReporting';
|
||||
|
||||
type CopyState = 'idle' | 'copied' | 'failed';
|
||||
|
||||
export function UiEditorCopyPathButton({
|
||||
@@ -15,16 +17,21 @@ export function UiEditorCopyPathButton({
|
||||
relativePath: string;
|
||||
value: CopyState;
|
||||
}>({ relativePath, value: 'idle' });
|
||||
const [copyError, setCopyError] = useState('');
|
||||
const value =
|
||||
copyState.relativePath === relativePath ? copyState.value : 'idle';
|
||||
|
||||
async function copyPath() {
|
||||
setCopyState({ relativePath, value: 'idle' });
|
||||
setCopyError('');
|
||||
try {
|
||||
await writeText(relativePath);
|
||||
setCopyState({ relativePath, value: 'copied' });
|
||||
} catch {
|
||||
} catch (error) {
|
||||
setCopyState({ relativePath, value: 'failed' });
|
||||
setCopyError(
|
||||
`复制失败:${visibleClientErrorMessage(error)};请手动复制路径。`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +39,7 @@ export function UiEditorCopyPathButton({
|
||||
<>
|
||||
{value === 'failed' ? (
|
||||
<p className="mt-2 text-xs text-red-600" role="alert">
|
||||
复制失败,请手动复制路径。
|
||||
{copyError || '复制失败,请手动复制路径。'}
|
||||
</p>
|
||||
) : null}
|
||||
<button
|
||||
|
||||
@@ -1043,7 +1043,11 @@ describe('UiEditorPage', () => {
|
||||
);
|
||||
fireEvent.click(await screen.findByRole('button', { name: '复制路径' }));
|
||||
|
||||
expect(await screen.findByText('复制失败,请手动复制路径。')).toBeTruthy();
|
||||
expect(
|
||||
await screen.findByText(
|
||||
'复制失败:clipboard unavailable;请手动复制路径。',
|
||||
),
|
||||
).toBeTruthy();
|
||||
});
|
||||
it.each([
|
||||
['manual', 'saved', 1],
|
||||
|
||||
@@ -133,6 +133,7 @@ DirectProject 已经解决过同一类问题([`【ADR】DirectProject命令接
|
||||
- 旧版已落盘的通用“执行通道中断”文本无法恢复历史原因,读取时明确追加“宿主未提供具体错误正文”;新事件只在确实没有 detail 时使用同样标记。
|
||||
- 画板/模板/图片分离/参考图/External Editor/资源编辑/项目快照/错误报告等外围 HTTP 入口也遵循同一出口:读取有限响应正文,保留状态码、服务端 message/code 和操作上下文,凭据、URL、路径按统一规则脱敏;不能因为不是 Direct 回合主链就回到“HTTP N”兜底。
|
||||
- 模板库权限探测和 Direct 线程订阅/consume/bootstrap 属于用户可见的前端状态边界:权限/IPC 失败可以关闭入口或结束订阅,但必须同时保留安全错误正文;禁止用空 catch、只 settle 锚点或清空状态来吞掉认证、网络和 IPC 原因。
|
||||
- UI 编辑器剪贴板、文件选择、预览等原生 IPC 操作的失败提示也必须经过 `visibleClientErrorMessage`;操作指引可以保留,但不能覆盖原生错误正文。
|
||||
|
||||
## 后果与边界
|
||||
|
||||
|
||||
@@ -54,3 +54,4 @@ DirectProject 回合失败在确认不是客户端内部不可归类故障时,
|
||||
- 新增/通过:外部 MCP HTTP 401/429 定向 2 项、前端 Direct/Runtime 错误正文 25 项、旧历史通用中断脱敏回归 1 项;认证 Rust 定向 19 项、素材上传响应错误定向 1 项通过。`appSurface` 全套仍有环境/fixture 相关失败,不能据此宣称全绿。
|
||||
- 继续扫描又发现画板项目/资产下载、模板库、图片分离、参考图上传、External Editor 生成恢复、资源编辑上传/轮询、项目快照和错误报告提交仍有“HTTP 只有编号”或未脱敏正文路径;已统一补上状态码 + 有界正文 + 精确脱敏。资源编辑拒绝原因继续复用既有 `details.message` 解析,避免丢掉平台具体原因。
|
||||
- 前端继续发现两个静默出口:模板库权限检查失败会直接清空入口,Direct 线程订阅/consume/bootstrap 的 IPC 失败会只 settle anchor 而不显示正文;现分别保留权限检查错误,并把订阅链错误正文送入项目状态栏/运行错误出口。认证失败回归已验证显示 `authentication-required`,不再变成泛化“执行失败,请稍后重试”。
|
||||
- UI 编辑器复制路径的原生剪贴板 IPC 失败也曾只显示“复制失败,请手动复制路径”,现保留脱敏后的剪贴板错误正文并同时给出手动复制指引。
|
||||
|
||||
Reference in New Issue
Block a user