Skip to content

feat(settings): 设置界面重构 — 分节化 / 精简 / Beta 渠道 / 麦克风 / 市场登录#521

Merged
appergb merged 10 commits into
betafrom
feat/settings-revamp
May 22, 2026
Merged

feat(settings): 设置界面重构 — 分节化 / 精简 / Beta 渠道 / 麦克风 / 市场登录#521
appergb merged 10 commits into
betafrom
feat/settings-revamp

Conversation

@appergb
Copy link
Copy Markdown
Collaborator

@appergb appergb commented May 22, 2026

User description

概述

将 2200 行的 Settings.tsx 单体拆为 pages/settings/ 下的按节文件,并对设置界面做整体精简与多项功能调整。合并目标:beta

改动

界面精简

  • 移除各设置项冗长 / 多行描述(在 180px 标签列普遍折成多行),只留标签与控件
  • 删除「个性化」独立 tab —— 仅剩字体大小一项、整页太空,并入「关于」
  • 移除失效的「毛玻璃强度」滑块(其 CSS 变量 --ol-glass-blur 无可见元素消费)

关于 / 更新

  • 版本卡片图标右上方放「检查更新」按钮,固定查正式版(channel='stable'
  • 「加入 Beta 渠道」迁到「高级」页底部、单独成节;开启后出现查测试版的检查按钮
  • 检查中按钮内转圈动画;结果(已是最新 / 失败)只在按钮内以图标 + 颜色呈现,
    卡片高度恒定,不再因状态文字 reflow 抽搐
  • Rust app_check_update_with_channel 新增可选 channel 参数 —— 两个按钮各查各
    渠道;后台 AutoUpdateGate 不传 channel,仍按 prefs.update_channel

麦克风选择

  • 由全屏弹窗改为 SelectLite 下拉(与语言选择一致的「官方框」)
  • SelectLite 增加 trailing / onOpenChange;新增 MicrophoneSelect —— 选中项
    右侧打勾、勾左侧实时音量条

市场登录

  • 抽出共用 GithubLoginModalui/Modal,扩展市场与风格市场登录统一走弹窗
  • 修复风格市场登录弹窗「先小后大」尺寸跳动(各阶段固定 minHeight

弹窗动画

  • 去掉开启动画里的 blur 滤镜(卡顿 / 闪烁),改纯 opacity + transform
  • 设置弹窗切 tab 内容轻微淡入;各处弹窗动画时长 / 缓动统一到 global.css

网络

  • 新增 net.rs:进程级共享 reqwest 客户端(连接池复用)+ 传输层失败指数退避重试

测试

  • tsc --noEmit 通过
  • vite build 通过
  • tauri build(release)通过,macOS .app / .dmg 均成功打包
  • 关于页:图标旁「检查更新」转圈 + 结果反馈,卡片不抽搐
  • 高级页底部「加入 Beta 渠道」:开关 + 开启后的检查按钮
  • 麦克风下拉:打勾 + 音量条
  • 扩展市场 / 风格市场登录弹窗尺寸一致
  • 设置弹窗开启 / 切 tab 动画顺滑

PR Type

Enhancement, Bug fix, Tests


Description

  • 拆分设置页为多节结构

  • 重构供应商、麦克风、本地模型

  • 引入共享 HTTP 客户端重试

  • 调整提示词与回归测试


Diagram Walkthrough

flowchart LR
  SM["Settings modal"]
  Tabs["Settings tabs"]
  Prov["Providers section"]
  Local["Local model section"]
  About["About / update section"]
  Net["Shared HTTP client & retry"]
  Cmd["Tauri commands"]
  Market["Marketplace & GitHub flows"]
  Tests["Prompt tests & rules"]

  SM -- "routes to" --> Tabs
  Tabs -- "services" --> Prov
  Tabs -- "advanced" --> Local
  Tabs -- "about" --> About
  Prov -- "uses" --> Cmd
  Local -- "switches ASR" --> Cmd
  About -- "checks updates" --> Cmd
  Cmd -- "network refactor" --> Net
  Cmd -- "marketplace / GitHub" --> Market
  Tests -- "regression coverage" --> Cmd
Loading

File Walkthrough

Relevant files
Enhancement
25 files
commands.rs
Shared client and channel-aware checks                                     
+176/-157
net.rs
Add shared HTTP client retries                                                     
+72/-0   
ProvidersSection.tsx
Extract provider settings into section                                     
+791/-0 
SettingsModal.tsx
Rebuild settings modal navigation                                               
+119/-495
LocalModelSection.tsx
Add local ASR model management                                                     
+219/-0 
RecordingInputSection.tsx
Extract recording input settings                                                 
+336/-0 
GithubLoginModal.tsx
Share GitHub login modal component                                             
+218/-0 
AboutSection.tsx
Move about and update controls                                                     
+151/-0 
MicrophoneSelect.tsx
Add compact microphone selector                                                   
+152/-0 
DebugToolsSection.tsx
Extract debug tools section                                                           
+110/-0 
MarketplaceSection.tsx
Extract marketplace settings section                                         
+108/-0 
DataStorageSection.tsx
Extract data storage settings                                                       
+84/-0   
CheckUpdateButton.tsx
Isolate update check button logic                                               
+80/-0   
BetaChannelSection.tsx
Isolate beta channel controls                                                       
+51/-0   
Modal.tsx
Add shared modal primitive                                                             
+51/-0   
Marketplace.tsx
Align marketplace page behavior                                                   
+20/-261
PermissionsSection.tsx
Extract permissions settings section                                         
+7/-28   
Icon.tsx
Add icons for new sections                                                             
+1/-0     
SelectLite.tsx
Extend lightweight select behavior                                             
+9/-0     
MarketplaceModal.tsx
Rework marketplace modal UX                                                           
+2/-2     
LanguageSection.tsx
Extract language settings section                                               
+2/-6     
ShortcutsSection.tsx
Extract shortcuts settings section                                             
+1/-5     
shared.tsx
Share settings row and helpers                                                     
+4/-4     
ipc.ts
Expand IPC bindings for settings                                                 
+1/-1     
QaPanel.tsx
Refresh QA panel interactions                                                       
+2/-2     
Tests
1 files
polish.rs
Update structured prompt tests                                                     
+5/-4     
Bug fix
3 files
types.rs
Refine structured prompt instructions                                       
+4/-1     
FloatingShell.tsx
Update settings entry destinations                                             
+3/-3     
AutoUpdate.tsx
Refine updater dialog and flow                                                     
+6/-4     
Miscellaneous
4 files
lib.rs
Register networking module                                                             
+1/-0     
tabs.tsx
Define settings tab composition                                                   
+78/-0   
App.tsx
Wire new settings section routes                                                 
+5/-4     
main.tsx
Adjust app bootstrap wiring                                                           
+4/-1     
Documentation
5 files
ja.ts
Update Japanese settings strings                                                 
+30/-27 
zh-TW.ts
Update Traditional Chinese strings                                             
+31/-28 
ko.ts
Update Korean settings strings                                                     
+30/-27 
zh-CN.ts
Update Simplified Chinese strings                                               
+31/-28 
en.ts
Update English settings strings                                                   
+30/-27 
Formatting
1 files
global.css
Tweak global motion and layout styles                                       
+23/-4   
Additional files
3 files
Settings.tsx +0/-2213
AboutUpdateControl.tsx +0/-53   
AdvancedSection.tsx +0/-441 

将 2200 行的 Settings.tsx 单体拆为 pages/settings/ 下的按节文件(通用 / 服务 /
隐私 / 高级 / 关于),并对设置界面做整体精简与功能调整。

界面精简
- 移除各设置项冗长 / 多行描述(在 180px 标签列普遍折成多行),只留标签与控件
- 删除「个性化」独立 tab —— 仅剩字体大小一项、整页太空,并入「关于」
- 移除失效的「毛玻璃强度」滑块(其 CSS 变量无可见元素消费)

关于 / 更新
- 版本卡片图标右上方放「检查更新」按钮,固定查正式版(channel='stable')
- 「加入 Beta 渠道」迁到「高级」页底部、单独成节;开启后出现查测试版的检查按钮
- 检查中按钮内转圈;结果(已是最新 / 失败)只在按钮内呈现,卡片高度恒定,
  不再因状态文字 reflow 抽搐
- Rust app_check_update_with_channel 新增可选 channel 参数,两个按钮各查各渠道;
  后台 AutoUpdateGate 仍按 prefs.update_channel 走

麦克风选择
- 由全屏弹窗改为 SelectLite 下拉(与语言选择一致的「官方框」)
- SelectLite 增加 trailing / onOpenChange;新增 MicrophoneSelect —— 选中项右侧
  打勾、勾左侧实时音量条

市场登录
- 抽出共用 GithubLoginModal 与 ui/Modal,扩展市场与风格市场登录统一走弹窗
- 修复风格市场登录弹窗「先小后大」尺寸跳动(各阶段固定 minHeight)

弹窗动画
- 去掉开启动画里的 blur 滤镜(卡顿 / 闪烁),改纯 opacity + transform
- 设置弹窗切 tab 内容轻微淡入;各处弹窗动画时长 / 缓动统一到 global.css

网络
- 新增 net.rs:进程级共享 reqwest 客户端(连接池复用)+ 传输层失败指数退避重试
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 22, 2026

PR Reviewer Guide 🔍

(Review updated until commit 99f22a6)

Here are some key observations to aid the review process:

⏱️ Estimated effort to review: 3 🔵🔵🔵⚪⚪
🧪 PR contains tests
🔒 No security concerns identified
⚡ No major issues detected

- ProvidersSection: 验证失败时显示 validateFailed 文案,不再对 result.ok=false
  误报「连接检查通过」
- ProvidersSection: LLM/ASR 切换失败时下拉框回滚到 committed provider,避免 UI
  停在新选项而后端仍是旧 provider;去掉 handler 末尾的 rethrow —— 作为 SelectLite
  onChange 是即发即忘调用,rethrow 会变成未处理的 promise rejection
- CheckUpdateButton: 自动收起计时器只依赖 status,不再因 useAutoUpdate 每次渲染
  返回新 updater 对象而被反复 clear/reset
- 新增 i18n key settings.providers.validateFailed(zh-CN/zh-TW/en/ja/ko)
@github-actions
Copy link
Copy Markdown

Persistent review updated to latest commit 7dc1600

- send_with_retry 不再重试 is_timeout():reqwest 的 is_timeout 也涵盖「请求已发出、
  等响应时超时」,此时服务端可能已收到并在处理,重试 POST/DELETE(marketplace
  点赞 / 删除等)会重复执行。只保留 is_connect / is_request 两类「请求未送达服务端」
  的重试;net.rs 文档原本宣称超时重试幂等安全 —— 该说法对超时不成立,一并订正
- check_network 改单发、不走 send_with_retry:每 30s 的状态探针走 10 次退避会在
  被过滤 / 黑洞网络下把探测拖到近一分钟、状态灯像卡死;瞬时误判由下个 30s 周期
  自动纠正。仍用 net::http() 共享连接池
@github-actions
Copy link
Copy Markdown

Persistent review updated to latest commit 15b4fb1

解决 LocalModelSection.tsx 冲突:beta 的 PR #504(Windows sherpa-onnx 本地 ASR)
改的是 AdvancedSection.tsx,而本分支已把它拆分重命名为 LocalModelSection.tsx。
合并保留本分支的拆分 + 文案精简,并并入 #504 的 sherpa-onnx-local 引擎行、
isOnSherpaOnnx / pendingNameKey / 禁用逻辑。其余文件由 git 自动合并。
@github-actions
Copy link
Copy Markdown

Persistent review updated to latest commit 2056ad8

types.rs 的 STRUCTURED_BUILTIN_PROMPT「事项数 → 输出形态」规则已重写(原「≤ 2 条」
拆成「仅 1 条 / = 2 条」两档),但 polish.rs 的两个 structured_prompt 测试仍断言旧
文案,CI 的 macOS / Linux cargo test 因此变红(Windows 偶然未跑到同批次)。
同步订正断言:
- 「事项 ≤ 2 条」→「事项仅 1 条」+「事项 = 2 条」
- 「不硬塞层级」→「输出连贯段落」(仅 1 条事项 → 连贯段落,语义等价)
本地 cargo test --lib:306 passed / 0 failed。
@github-actions
Copy link
Copy Markdown

Persistent review updated to latest commit 0689442

重构 OAuth 登录为 GithubLoginModal 后,onLoginSuccess / MarketplaceSection
onSuccess 用裸 void updatePrefs(...) 写 marketplaceDevLogin,丢掉了重构前
try/catch 里的失败日志 —— prefs 写入失败会冒成未处理的 promise rejection。
补回 .catch + console.warn,与重构前行为一致。
@github-actions
Copy link
Copy Markdown

Persistent review updated to latest commit 038744f

上一轮加的回滚无条件把下拉退回 committed provider。但 provider 切换是多步非原子
操作:若 setActiveLlmProvider 已成功、后续 updatePrefs / setCredential 才失败,
后端 active 已是新 provider,回滚下拉到旧的反而让「下拉显示旧 / 后端用新」。
改为记 backendSwitched 标志:仅当后端切换本身没成时才回滚下拉框,让下拉始终与
后端 active 一致。ASR 同理。
@github-actions
Copy link
Copy Markdown

Persistent review updated to latest commit 74be27d

LocalModelSection.performSwitch 是 async、try/finally 无 catch,而调用方
(Qwen3 / Foundry / sherpa Toggle、禁用按钮)都是 void performSwitch(...)
即发即忘。setActiveAsrProvider / updatePrefs 失败会冒成未处理的 promise
rejection。补 catch + console.error 吞掉。
@github-actions
Copy link
Copy Markdown

Persistent review updated to latest commit 8986c56

合并 beta 的 #504 引入了第三个本地 ASR 引擎 sherpa-onnx-local,但本分支的
ProvidersSection(早于 #504 拆出)只认 local-qwen3 / foundry-local-whisper。
sherpa-onnx-local 激活时 knownAsr 查不到 → 主 Card 回落显示 volcengine、
凭据字段也错。补齐 5 处:ASR_PRESETS 条目、visibleAsrPresets 过滤、isLocked、
anomalousNameKey、本地引擎不渲染云端凭据字段的分支判断。
@github-actions
Copy link
Copy Markdown

Persistent review updated to latest commit 00b2bd0

处理 PR-Agent 第 8 轮:
- ProvidersSection.onAsrProviderChange: asr.endpoint / asr.model 是所有 ASR 厂商
  共用的凭据槽,原「仅槽空时填」逻辑使跨厂商切换不生效(dropdown 切了、实际仍
  打旧厂商地址)。改为强制覆盖预设默认值,与 onLlmProviderChange 一致。
- net.rs send_with_retry: 重试范围从 is_connect() || is_request() 收窄到只剩
  is_connect()。is_request() 多为确定性失败(endpoint 配置错误等),重试 10 次
  只是徒增数秒延迟才暴露错误;连接层失败才是真正瞬时、值得重试的一类。
@github-actions
Copy link
Copy Markdown

Persistent review updated to latest commit 99f22a6

@appergb appergb merged commit 1b8217e into beta May 22, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant