Files
koring-launcher/src/stores/routeStore.ts
T
dream_pep fad8f612bf feat: 重构背景图处理体系,优化用户UX体验
- 重构背景图全链路处理:改用文件路径存储而非base64,新增`koring-res://`自定义协议流式加载本地壁纸,大幅降低内存占用
- 调整配置文件存储路径至userData目录,解决NSIS重装/升级时配置被清空的问题
- 新增路由调试页面,支持快速跳转所有已注册的应用页面
- 优化OOBE引导和更新完成页的「前往首页」按钮,添加4秒延迟渐入动画
- 自动迁移旧版配置:将安装目录的配置文件迁移至userData,同时将base64格式的背景配置自动转换为文件路径存储
- 重构预加载脚本、主进程IPC处理器与前端页面的背景图相关逻辑
- 更新AGENTS.md开发文档,修正路径与逻辑说明
- 更新应用背景图资源文件
2026-09-04 19:34:58 +08:00

154 lines
5.5 KiB
TypeScript

import { create } from "zustand";
export type RouteKey =
| "home"
| "store"
| "today"
| "play-link"
| "setting"
| "setting/login"
| "gallery"
| "task-queue"
| "update"
| "oobe"
| "oobe/language"
| "oobe/agreement"
| "oobe/version"
| "oobe/beta-test"
| "oobe/login"
| "oobe/welcome"
| "oobe/finish"
| "oobe/about-info"
| "oobe/legal"
| "upvp"
| "upvp/complete"
| "upvp/version"
| "upvp/check"
| "upvp/beta-test"
| "upvp/finish"
| "debug"
| "debug-splash"
| "debug-display"
| "debug-version-card"
| "debug-update"
| "debug-task"
| "debug-resource"
| "debug-crash"
| "debug-routes";
export type TitleBarMode = "default" | "sub" | "window" | "oobe";
export type TransitionDirection = "forward" | "backward";
interface RouteItem {
key: RouteKey;
label: string;
path: string;
hidden?: boolean;
backable?: boolean;
}
export const routes: RouteItem[] = [
{ key: "home", label: "首页", path: "/home" },
{ key: "gallery", label: "实例", path: "/gallery" },
{ key: "store", label: "资源", path: "/store" },
{ key: "today", label: "资讯", path: "/today" },
{ key: "play-link", label: "联机", path: "/play-link" },
{ key: "setting", label: "设置", path: "/setting" },
];
export const allRoutes: RouteItem[] = [
...routes,
{ key: "setting/login", label: "登录", path: "/setting/login", hidden: true, backable: true },
{ key: "task-queue", label: "任务队列", path: "/task-queue", hidden: true },
{ key: "update", label: "更新日志", path: "/update", hidden: true, backable: true },
{ key: "oobe", label: "OOBE", path: "/oobe", hidden: true },
{ key: "oobe/language", label: "语言设置", path: "/oobe/language", hidden: true },
{ key: "oobe/agreement", label: "同意协议", path: "/oobe/agreement", hidden: true },
{ key: "oobe/version", label: "当前版本", path: "/oobe/version", hidden: true },
{ key: "oobe/beta-test", label: "测试协议", path: "/oobe/beta-test", hidden: true },
{ key: "oobe/login", label: "登录", path: "/oobe/login", hidden: true },
{ key: "oobe/welcome", label: "欢迎", path: "/oobe/welcome", hidden: true },
{ key: "oobe/finish", label: "完成", path: "/oobe/finish", hidden: true },
{ key: "oobe/about-info", label: "关于信息", path: "/oobe/about-info", hidden: true, backable: true },
{ key: "oobe/legal", label: "法律信息", path: "/oobe/legal", hidden: true },
{ key: "upvp", label: "更新引导", path: "/upvp", hidden: true },
{ key: "upvp/complete", label: "更新已完成", path: "/upvp/complete", hidden: true },
{ key: "upvp/version", label: "当前版本", path: "/upvp/version", hidden: true },
{ key: "upvp/check", label: "检查版本", path: "/upvp/check", hidden: true },
{ key: "upvp/beta-test", label: "测试协议", path: "/upvp/beta-test", hidden: true },
{ key: "upvp/finish", label: "完成", path: "/upvp/finish", hidden: true },
{ key: "debug", label: "调试", path: "/debug", hidden: true },
{ key: "debug-splash", label: "启动动画调试", path: "/debug/splash", hidden: true },
{ key: "debug-display", label: "显示效果调试", path: "/debug/display", hidden: true },
{ key: "debug-version-card", label: "版本卡片调试", path: "/debug/version-card", hidden: true },
{ key: "debug-update", label: "更新功能测试", path: "/debug/update", hidden: true },
{ key: "debug-task", label: "任务队列调试", path: "/debug/task", hidden: true },
{ key: "debug-resource", label: "资源与内存", path: "/debug/resource", hidden: true },
{ key: "debug-crash", label: "崩溃测试", path: "/debug/crash", hidden: true },
{ key: "debug-routes", label: "页面跳转", path: "/debug/routes", hidden: true },
];
const topLevelKeys = new Set(routes.map((r) => r.key));
function getRouteTitleBarMode(key: RouteKey): TitleBarMode {
if (key === "oobe" || key.startsWith("oobe/") || key === "upvp" || key.startsWith("upvp/")) return "oobe";
return topLevelKeys.has(key) ? "default" : "sub";
}
function startTransition(dir: TransitionDirection, callback: () => void) {
document.documentElement.dataset.transitionDir = dir;
if (document.startViewTransition) {
document.startViewTransition(callback);
} else {
callback();
}
}
interface RouteState {
current: RouteKey;
titleBarMode: TitleBarMode;
direction: TransitionDirection;
history: RouteKey[];
/** 资源中心选中的分类(原版游戏 / MOD / 整合包) */
storeSection: "game" | "mod" | "modpack";
navigate: (key: RouteKey) => void;
setTitleBarMode: (mode: TitleBarMode) => void;
setStoreSection: (section: "game" | "mod" | "modpack") => void;
goBack: () => void;
}
export const useRouteStore = create<RouteState>((set, get) => ({
current: "home",
titleBarMode: "default",
direction: "forward",
history: [],
storeSection: "game",
navigate: (key) => {
const prev = get().current;
if (prev === key) return;
startTransition("forward", () => {
set({
current: key,
titleBarMode: getRouteTitleBarMode(key),
direction: "forward",
history: [...get().history, prev],
});
});
},
setTitleBarMode: (mode) => set({ titleBarMode: mode }),
setStoreSection: (section) => set({ storeSection: section }),
goBack: () => {
const { history } = get();
if (history.length === 0) return;
const prev = history[history.length - 1];
startTransition("backward", () => {
set({
current: prev,
titleBarMode: getRouteTitleBarMode(prev),
history: history.slice(0, -1),
direction: "backward",
});
});
},
}));