Files
koring-launcher/src/App.tsx
T
dream_pep 8fc6fcaf05 feat(update): 实现更新通道管理系统与更新调试页面
本次提交完成以下变更:
1. 实现完整的更新通道管理功能,支持慢走/跑步两种更新模式,可在设置页切换且配置持久化生效
2. 新增更新调试页面,集成检查更新、版本比对、设置测试版本等调试工具
3. 新增快速打开Chromium DevTools的按钮,方便开发调试
4. 完善自动更新后端逻辑,新增版本比对、测试版本覆盖、通道动态获取等IPC接口
5. 调整GitHub Release构建脚本,修复prerelease版本的命名与发布问题
6. 添加semver依赖与类型定义,完善全量类型声明
7. 更新自动更新文档,补充更新通道相关的设计说明
8. 微调默认配置,添加主题暗黑模式的初始配置
2026-08-31 02:20:25 +08:00

115 lines
4.0 KiB
TypeScript

import { useEffect } from "react";
import { RootLayout } from "./layouts/RootLayout";
import { useRouteStore } from "./stores/routeStore";
import { useTheme } from "./hooks/useTheme";
import { useConfigStore } from "./stores/configStore";
import { syncThemeFromConfig } from "./stores/themeStore";
import { syncA11yFromConfig } from "./stores/a11yStore";
import { syncBackgroundFromConfig } from "./stores/backgroundStore";
import { useAuthStore } from "./stores/authStore";
import { useKoringAuthStore } from "./stores/koringAuthStore";
import type { AppConfig } from "./api/config";
import { Home } from "./pages/home";
import { Store } from "./pages/store";
import { Today } from "./pages/today";
import { PlayLink } from "./pages/play-link";
import { Setting } from "./pages/setting";
import { SettingLogin } from "./pages/setting/login";
import { Gallery } from "./pages/gallery";
import { TaskQueue } from "./pages/task-queue";
import { UpdatePage } from "./pages/update";
import { Debug } from "./pages/debug";
import { SplashDebug } from "./pages/debug/splash-debug";
import { DisplayDebug } from "./pages/debug/display-debug";
import { VersionCardDebug } from "./pages/debug/version-card-debug";
import { UpdateDebug } from "./pages/debug/update-debug";
import { TaskDebug } from "./pages/debug/task-debug";
import { CrashDebug } from "./pages/debug/crash-debug";
import { Oobe } from "./pages/oobe";
import { OobeLanguage } from "./pages/oobe/step-language";
import { OobeAgreement } from "./pages/oobe/step-agreement";
import { OobeLogin } from "./pages/oobe/step-login";
import { OobeWelcome } from "./pages/oobe/step-welcome";
import { OobeVersion } from "./pages/oobe/step-version";
import { OobeBetaTest } from "./pages/oobe/step-beta-test";
import { OobeFinish } from "./pages/oobe/step-finish";
import { OobeLegal } from "./pages/oobe/step-legal";
import { OobeAboutInfo } from "./pages/oobe/about-info";
const pageMap = {
home: Home,
store: Store,
today: Today,
"play-link": PlayLink,
setting: Setting,
"setting/login": SettingLogin,
gallery: Gallery,
"task-queue": TaskQueue,
update: UpdatePage,
oobe: Oobe,
"oobe/language": OobeLanguage,
"oobe/agreement": OobeAgreement,
"oobe/login": OobeLogin,
"oobe/welcome": OobeWelcome,
"oobe/version": OobeVersion,
"oobe/beta-test": OobeBetaTest,
"oobe/finish": OobeFinish,
"oobe/about-info": OobeAboutInfo,
"oobe/legal": OobeLegal,
debug: Debug,
"debug-splash": SplashDebug,
"debug-display": DisplayDebug,
"debug-version-card": VersionCardDebug,
"debug-update": UpdateDebug,
"debug-task": TaskDebug,
"debug-crash": CrashDebug,
} as const;
function App() {
useTheme();
const current = useRouteStore((s) => s.current);
const Page = pageMap[current];
useEffect(() => {
// Listen for preloaded config from main process
const unsub = window.electronAPI?.onConfigPreload((data) => {
const { config, isFirstLaunch } = data;
const cfg = config as AppConfig;
useConfigStore.getState().applyPreloaded(cfg, isFirstLaunch);
// 语言偏好 → <html lang>
document.documentElement.lang = (cfg as AppConfig).app?.language ?? "zh-CN";
syncThemeFromConfig();
syncA11yFromConfig();
syncBackgroundFromConfig();
useAuthStore.getState().initFromRegistry();
useKoringAuthStore.getState().initFromDisk();
// Navigate to OOBE on first launch or if oobe not completed
if (isFirstLaunch || cfg.oobe) {
useRouteStore.getState().navigate("oobe");
}
});
return () => { unsub?.(); };
}, []);
// 主进程权威配置广播 → 覆盖本地镜像并同步派生 store
useEffect(() => {
const unsub = window.electronAPI?.onConfigChanged((config) => {
useConfigStore.getState().applyChanged(config as AppConfig);
syncThemeFromConfig();
syncA11yFromConfig();
syncBackgroundFromConfig();
});
return () => { unsub?.(); };
}, []);
return (
<RootLayout>
<Page key={current} />
</RootLayout>
);
}
export default App;