Files
TallyNote/web-next/src/router/index.ts
T
Qiufeng 12495fb6a4
TallyNote release / linux-x64 (push) Successful in 6m24s
release: 1.1.0
2026-08-31 20:11:34 +08:00

50 lines
1.7 KiB
TypeScript

import type { LucideIcon } from "lucide-react";
import { Archive, ClipboardList, LayoutDashboard, RefreshCw, Trash2, Users } from "lucide-react";
export type RouteId = "dashboard" | "expenses" | "trash" | "admins" | "audit" | "update";
export interface AppRoute {
id: RouteId;
title: string;
eyebrow: string;
icon: LucideIcon;
}
export const APP_ROUTES: readonly AppRoute[] = [
{ id: "dashboard", title: "仪表盘", eyebrow: "概览", icon: LayoutDashboard },
{ id: "expenses", title: "账目", eyebrow: "工作台", icon: ClipboardList },
{ id: "trash", title: "回收站", eyebrow: "系统", icon: Trash2 },
{ id: "admins", title: "管理员", eyebrow: "系统", icon: Users },
{ id: "audit", title: "审计日志", eyebrow: "系统", icon: Archive },
{ id: "update", title: "系统更新", eyebrow: "系统", icon: RefreshCw },
];
export const DEFAULT_ROUTE_ID: RouteId = "dashboard";
export const ROUTE_PATHS: Readonly<Record<RouteId, string>> = {
dashboard: "/",
expenses: "/expenses",
trash: "/trash",
admins: "/admins",
audit: "/audit",
update: "/update",
};
export function isRouteId(value: string): value is RouteId {
return APP_ROUTES.some((route) => route.id === value);
}
export function routePath(id: RouteId): string {
return ROUTE_PATHS[id];
}
export function routeIdFromPath(pathname: string): RouteId | undefined {
const normalized = pathname.length > 1 ? pathname.replace(/\/+$/, "") : pathname;
if (normalized === "/dashboard") return DEFAULT_ROUTE_ID;
return APP_ROUTES.find((route) => ROUTE_PATHS[route.id] === normalized)?.id;
}
export function routeTitle(id: string): string {
return APP_ROUTES.find((route) => route.id === id)?.title ?? "账目";
}