Issue 118 - ShaoClean/Alune GitHub Wiki

Issue #118:页面反馈改为弹窗与通知浮层

背景与结果

原 Git 取消横幅插在工作区正文前。在同为 1440×960 的窗口中,正文由 1204×840 缩为 1204×742.86,高度减少约 97px。迁移后,弹窗打开与关闭期间正文均保持 1204×840;提交草稿、历史和文件内容保留。

迁移清单

范围 已迁移反馈 展示与处理入口
Git 同步 获取、拉取、推送失败或取消;同步上下文读取失败 排队弹窗,完整原因、刷新状态、复制、关闭;取消说明保留“已完成的步骤不会回滚”
仓库配置及状态 配置读取失败、状态失败、分支/储藏/远程读取失败 后台读取使用通知入口,面板失败使用弹窗;保留重试和首载失败状态
历史 历史首载/分页/刷新失败、历史变化、提交文件失败 弹窗;重试原分页或刷新历史;提交文件错误仅由局部来源负责
文件目录 已有目录内容上的刷新失败 弹窗与重试,目录内容保留;首次加载失败继续就地说明
PR/MR 与令牌 原令牌被删除、目标变化、令牌读取/应用失败、PR/MR 失败、远端列表失败 通知入口或弹窗;保留令牌管理、重新加载、重新应用及重试,详情标明远端
设置 AI 设置读取、外观/工作区持久化、令牌加载、服务商保存/测试、提交生成保存、主题导入/恢复 错误弹窗或持久通知;成功使用轻量 message;保留重新加载配置入口
网络代理 保存/操作结果、其他窗口更新配置、服务器状态刷新失败 冲突/后台错误经通知入口查看;明确“重新加载会丢弃草稿”;关闭提示保留草稿
版本更新 桥接错误、检查/下载/安装异常 设置页弹窗或后台通知,保留重连/检查/下载/安装入口;已有更新弹窗内仍使用内部错误
持续状态 尚无提交、无远程、缺作者、浅克隆、未知 PR/MR 平台、远端不可用 紧凑“提示”入口按需查看;保留添加远程、设置作者、获取完整历史

字段校验、内容空状态、不支持预览、现有表单/确认弹窗内部错误继续就地显示。Git 操作进度、计时与取消入口保留。

实现方案

FeedbackProvider 统一队列,FeedbackScope 限定仓库或设置页,FeedbackNotice 注册当前事件。事件按上下文、来源和请求/结果版本去重;关闭只确认显示,不执行写操作。重复点击处理入口被 busy 锁拦截。源组件卸载或上下文失效后移除回调;React StrictMode 的旧清理不会删除新注册。当前来源最新结果保留到成功或退出页面,已确认事件版本缓存最多 200 个,不持久化到磁盘。

普通成功结果复用 Ant Design message。持续说明和后台错误通过不会抢焦点的入口打开;用户主动重试的新失败可以重新提示。多个需阅读结果顺序展示。

全屏时将提示入口挂载到 Diff 对话框内部,避免浏览器原生 inert 规则让入口无法点击。从持续说明进入设置作者等配置操作时退出 Diff 全屏,使表单可以正常输入。详情使用原生 <dialog> 顶层与 Ant Design 按钮:支持焦点约束、Escape、焦点返回,以及覆盖同为原生顶层的 Diff 全屏。已有 Ant Design 表单/确认弹窗打开时,统一详情等待其关闭,避免叠加。长文本独立滚动,可选择并复制。深浅主题使用现有 CSS 变量。

Electron 中只允许应用自身可信 renderer/origin 的 clipboard-sanitized-write;剪贴板读取、外部来源和其他权限继续拒绝。桌面复制验收需显示并聚焦窗口,后台隐藏窗口会被 Chromium 拒绝复制。

验收记录

环境:macOS arm64,Node.js v25.5.0;Web 使用 Ego Lite Chromium;桌面使用项目锁定 Electron 44.2.0 的暂存应用。截图采用合成仓库/接口故障数据,不包含真实令牌或服务器资料。

检查 结果
npm test -w web 167/167 通过,含队列/去重/重试/过期回调/重复提交、提交文件错误归属,以及原 history、files、PR/MR、status、layout 回归
npm run desktop:build 5 个任务通过;保留既有大 bundle 警告
npm run test:unit -w desktop 44/44 通过,含可信来源剪贴板写入与读取拒绝
node apps/desktop/scripts/smoke.mjs(从 apps/desktop 运行 node scripts/smoke.mjs) 完整冒烟通过,含真实本地 Git 反馈、全屏提示与作者配置、历史 / Diff、侧栏、外观、令牌、更新和重启恢复
Git 取消的前后尺寸 旧横幅使正文高度减少 97.14px;新弹窗前/中/后均为 1204×840
关闭、刷新与主动再次失败 旧错误关闭后刷新不重弹;新的失败再显示;刷新状态没有再次发送 Git 写请求
历史、提交文件、目录、PR/MR 通过接口故障触发与重试;提交文件单次错误只出现一个详情弹窗
设置保存、令牌读取、主题导入 失败详情可查看;设置草稿关闭后保留;成功保存显示 message 浮层
代理并发修改 后台检查保留输入焦点;关闭提示端口草稿保持 7899;明确重载后才恢复配置端口 7890
持续状态 加载时不自动弹窗,用户通过提示入口查看;打开作者编辑框时没有叠加反馈弹窗
仓库切换 历史请求延迟 1.8 秒时切换至另一仓库,旧请求返回后无弹窗、无旧回调入口
长错误、深浅色、390px 窗口 通过;80 行错误在详情内滚动,按钮可用
Diff 全屏 错误详情位于最上层;Escape 仅关闭反馈;提示入口可以点击并查看持续说明;设置作者操作退出全屏后表单可输入
版本更新失败 注入隔离桌面桥接状态验收检查失败详情与重试入口;不访问真实发布源、不安装更新

历史回归最初仍查找已移除的 .history-notice--error,已改为验证新详情和重试后的历史保留。桌面复制测试最初在隐藏窗口触发,修正为聚焦窗口后验证真实剪贴板,并恢复原文本。反馈重复操作测试等待上一次 Git 刷新完成后执行,避免在按钮禁用时模拟点击。复制验收后的窗口保持可见直到冒烟结束,确保后续侧栏拖动的动画帧继续运行。

最终补查发现,原生全屏的 inert 规则会屏蔽外部提示入口和作者表单;改为全屏内挂载入口、配置操作释放全屏层,浏览器真实点击与输入验证通过,并补充桌面断言。

截图

迁移前 Git 取消:

迁移前 Git 取消横幅

迁移后浅色弹窗:

迁移后 Git 取消弹窗

历史、文件、PR/MR:

历史读取失败 目录刷新失败 PR/MR 读取失败

设置与代理:

提交生成设置保存失败 代理配置冲突 版本更新失败

持续说明与边界:

按需查看仓库说明 深色 Diff 全屏中的反馈 全屏内按需打开提示 窄窗口长错误

复验与边界

合成 API:node apps/web/tests/fixtures/feedback-api.mjs 3198,将开发 Vite 的 /api 代理指向 http://127.0.0.1:3198。POST /__faults 接受例如 {"log":true}、{"tree":true}、{"outdated":true};空对象恢复正常响应。页面由真实组件渲染,未修改截图中的 DOM。

Windows/Linux 原生桌面、真实私有 GitHub/GitLab、真实发布源与真实 SSH 断网取消场景未在本机逐项执行;本次不改变后端 Git 取消、回滚、鉴权与配置持久化语义。回退代码 PR 后需单独核对 Wiki 修订。

弹窗系统 UI 设计稿

本设计稿已独立收录至 UI 规范 → 弹窗系统,完整设计说明、交互 HTML、深浅主题预览和附件校验信息统一在该页维护。

关联资料

⚠️ **GitHub.com Fallback** ⚠️