Skip to content

[ui][bug] Style 页"总开关"注释与实现不一致 — 注释说留 raw/default 兜底,实际全清空 #312

@appergb

Description

@appergb

现象

openless-all/app/src/pages/Style.tsx:61-73onMasterToggle

const onMasterToggle = async () => {
  if (!prefs) return;
  if (masterEnabled) {
    // 全部关闭 → 留 raw 和当前 default 兜底     ← 注释
    const next = { ...prefs, enabledModes: [] as PolishMode[] }; // ← 实际行为
    setPrefs(next);
    await setSettings(next);
  } else {
    const next = { ...prefs, enabledModes: ['raw', 'light', 'structured', 'formal'] as PolishMode[] };
    setPrefs(next);
    await setSettings(next);
  }
};

注释写的是"留 raw 和当前 default 兜底",但代码把 enabledModes 直接清成 []

完整链路(UI → IPC → Rust handler)

  • UI: Style.tsx:84 顶栏 toggle 按钮
  • IPC: setSettings(prefs) src/lib/ipc.ts:142invokeOrMock('set_settings', { prefs }, …)
  • Rust: commands.rs:116 set_settings(prefs: UserPreferences),写入 preferences.json,并被 coordinator.rs 读取用于切换风格热键和 dictation pipeline

触发条件

用户在 Style 页右上角"总开关"上把开关从开切到关。

实际后果

prefs.enabledModes 被持久化为空数组。后端 coordinator 在切换风格热键 / 选择 polish mode 时如果依赖 enabled_modes 做过滤(建议在 fix 时再 grep 一次 enabled_modes 确认行为),可能:

  • 风格切换热键变成空集合,无可选风格
  • 或者 fallback 到 defaultMode,与"raw + default 兜底"语义不同
  • 或者直接把 dictation 流程降级到 raw(最坏情况:用户以为"关闭风格"=不显示风格选择器,实际是把 polish 整体禁掉)

修复需要先决定的语义

请先在 issue 上明确"总开关 = OFF"到底应该是哪种语义,再改代码:

  • 方案 A(按注释)enabledModes = ['raw', defaultMode],保留 raw 和当前默认两个,用户仍能在两者之间切换
  • 方案 B(按当前实现)enabledModes = [],UI 上风格选择器灰掉,dictation 永远走 raw(这种情况下,注释要改,且要确认 coordinator 不会对 [] 反常处理)
  • 方案 CenabledModes 只保留 defaultMode(极简)

建议接受标准

  • 在 issue 上确认上面任一方案
  • 实现与注释一致
  • 加 1 个测试覆盖 master toggle off 时 prefs.enabledModes 的最终值
  • 顺便核实 coordinator.rsenabled_modes == [] 的实际处理是否符合选定语义

不在范围

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions