refactor: AppShell 拆分 + savePaths 并行化

- 抽取 useAppActions hook(~160行),AppShell 从 306 行精简至 105 行
- AppShell 现在只负责布局和渲染,操作逻辑全部可单独测试
- savePaths 改为 Promise.allSettled 并行保存 + 并行备份
- useKeyboard 通过 hook 内部集成,不再暴露给 AppShell

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-26 00:36:59 +08:00
parent 3a21891f84
commit e6a2416271
3 changed files with 211 additions and 232 deletions
+11 -6
View File
@@ -230,15 +230,20 @@ export const useAppStore = create<AppState>((set, get) => ({
set({ statusMessage: i18n.t('status.saving') });
// 保存前备份
try { await invoke('backup_registry', { customDir: null, sysPaths, userPaths }); } catch { /* 备份失败不阻止保存 */ }
// 备份(不阻塞保存)
invoke('backup_registry', { customDir: null, sysPaths, userPaths }).catch(() => {});
let sysOk = true, userOk = true;
try { await invoke('save_system_paths', { paths: sysPaths }); } catch { sysOk = false; }
try { await invoke('save_user_paths', { paths: userPaths }); } catch { userOk = false; }
// 并行保存
const [sysResult, userResult] = await Promise.allSettled([
invoke('save_system_paths', { paths: sysPaths }),
invoke('save_user_paths', { paths: userPaths }),
]);
const sysOk = sysResult.status === 'fulfilled';
const userOk = userResult.status === 'fulfilled';
if (sysOk && userOk) {
try { await invoke('broadcast_env_change'); } catch { /* 广播失败不阻止 */ }
invoke('broadcast_env_change').catch(() => {});
set({ isModified: false, statusMessage: i18n.t('status.saved') });
} else if (sysOk) {
set({ statusMessage: '用户 PATH 保存失败,系统 PATH 已保存' });