[Bug] 内测声明弹窗在设置写入失败时永久锁死界面(无任何逃生口) #7471
1207627875
started this conversation in
General
Replies: 2 comments 1 reply
|
背景难绷 |
0 replies
|
我误打误撞方法是在cordis.patch.yml
|
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
问题概述
内测声明欢迎弹窗(welcome notice modal)在用户确认状态写入持久化失败时,会把整个应用永久锁死:没有任何关闭路径,只能无限点击"继续"并反复看到红色报错"暂时无法保存确认状态,请重试。"。
复现现象
根因分析(四重设计缺陷叠加)
1. "关闭弹窗"被硬绑定到"持久化写入成功"
WelcomeNotice的点击逻辑:finish()负责卸载弹窗。一旦acknowledge()返回false(写入未持久化),弹窗就一直挂着。durable(持久化)分支没有像 memory 分支那样的"本次会话内本地记住"兜底:2. 弹窗同时关掉了所有其他出口
OnboardingModal:onClose是空函数,关闭按钮 / 遮罩点击 / ESC 全部被吞掉;document.getElementById("root").inert = true,整个应用根节点不可交互。结果:点击"继续"成了唯一出路,而这条路恰恰是正在失败的那条。
3. 要持久化的字段本身被标记为"易失、不持久化"
host 端插件配置:
Cordis/schemastery 体系里
volatile()的语义就是"运行时易失、不持久化"。settings 写入侧的write()/strip()逻辑会把 volatile 字段从持久化层剥离;scope.set(...)之后 store 重新读取scope.value.welcomeNoticeVersion仍然是undefined,于是acknowledged恒为false,状态进入error,显示"暂时无法保存确认状态"。一个"跨启动记住用户选择"的字段,却被标记成了 volatile,这是设计自相矛盾。4. 错误状态下仍然只提供那个正在失败的按钮
按钮的禁用条件只看
status === "saving",error 状态下"继续"依然可点,用户只能无限重复同一个失败动作,没有"跳过本次 / 稍后再说"的次级按钮。为什么常规自救无效
settings.yaml/settings.yaml.imported:旧文件在首次启动迁移时被 rename 为.imported,之后不再被读取;运行时配置已经迁到cordis.patch.yml。.imported文件里手动加过welcomeNoticeVersion,但因为命名空间写错(写成了ui-onboarding,正确应为ui-settings-general),且该文件已废弃,弹窗依旧:cordis.patch.yml,且该字段是 volatile:建议修复方向
#root.inert = true。volatile():去掉.volatile()让它正常持久化,或为 durable 写入单独提供非 volatile 存储。涉及文件
packages/client/ui-settings-models/src/client/WelcomeNotice.jspackages/client/ui-settings-models/src/client/OnboardingModal.js(onClose: ignoreImplicitDismiss、#root.inert = true)packages/client/ui-settings-models/src/client/welcome-store.js(acknowledge()返回 false;仅 memory 分支有兜底)packages/client/ui-settings-general/src/index.ts(welcomeNoticeVersion: z.string().volatile())write()/strip()逻辑(packages/settings/...)All reactions