Skip to content

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

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 == [] 的实际处理是否符合选定语义

不在范围

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions