Files
suwayomi-material-you-webui/src/modules/core/AppRoute.constants.ts
T

198 lines
5.7 KiB
TypeScript
Raw Normal View History

2024-12-11 20:10:59 +01:00
/*
* Copyright (C) Contributors to the Suwayomi project
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { SourceType } from '@/lib/graphql/generated/graphql.ts';
import { MangaIdInfo } from '@/modules/manga/Manga.types.ts';
import { ChapterSourceOrderInfo } from '@/modules/chapter/Chapter.types.ts';
2024-12-11 20:10:59 +01:00
type AppRouteInfo = {
match: string;
path?: string | ((...args: any[]) => string);
};
type TAppRoutes = Record<string, AppRouteInfo & { childRoutes?: TAppRoutes }>;
export const AppRoutes = {
root: {
match: '/',
path: '/',
},
matchAll: {
match: '*',
},
about: {
match: 'about',
path: '/about',
},
2024-12-11 20:10:59 +01:00
settings: {
path: '/settings',
match: 'settings',
childRoutes: {
categories: {
match: 'categories',
path: '/settings/categories',
},
reader: {
match: 'reader',
path: '/settings/reader',
},
library: {
match: 'library',
path: '/settings/library',
childRoutes: {
duplicates: {
match: 'duplicates',
path: '/settings/library/duplicates',
},
},
},
download: {
match: 'download',
path: '/settings/download',
},
backup: {
match: 'backup',
path: '/settings/backup',
},
server: {
match: 'server',
path: '/settings/server',
},
webui: {
match: 'webui',
path: '/settings/webui',
},
browse: {
match: 'browse',
path: '/settings/browse',
},
device: {
match: 'device',
path: '/settings/device',
},
tracking: {
match: 'tracking',
path: '/settings/tracking',
},
appearance: {
match: 'appearance',
path: '/settings/appearance',
},
2025-03-22 01:16:38 +01:00
history: {
match: 'history',
path: '/settings/history',
},
2024-12-11 20:10:59 +01:00
},
},
sources: {
match: 'sources',
path: '/sources',
childRoutes: {
browse: {
match: ':sourceId',
path: (sourceId: SourceType['id']) => `/sources/${sourceId}`,
},
configure: {
match: ':sourceId/configure',
path: (sourceId: SourceType['id']) => `/sources/${sourceId}/configure`,
},
searchAll: {
match: 'all/search',
path: (query?: string | null | undefined) => {
const queryParam = query ? `query=${encodeURIComponent(query)}` : '';
return `/sources/all/search${queryParam ? `?${queryParam}` : ''}`;
},
2024-12-11 20:10:59 +01:00
},
},
},
downloads: {
match: 'downloads',
path: '/downloads',
},
manga: {
match: 'manga/:id',
path: (mangaId: MangaIdInfo['id']) => `/manga/${mangaId}`,
childRoutes: {
reader: {
match: 'chapter/:chapterNum',
path: (mangaId: MangaIdInfo['id'], chapterNum: ChapterSourceOrderInfo['sourceOrder']) =>
`/manga/${mangaId}/chapter/${chapterNum}`,
},
},
},
library: {
match: 'library',
path: (tab?: string, search?: string) => {
const tabParam = tab ? `tab=${tab}` : '';
const searchParam = search ? `query=${encodeURIComponent(search)}` : '';
const params = [tabParam, searchParam].filter(Boolean).join('&');
return `/library${params ? `?${params}` : ''}`;
},
2024-12-11 20:10:59 +01:00
},
updates: {
match: 'updates',
path: '/updates',
},
2025-03-11 03:53:40 +07:00
history: {
match: 'history',
path: '/history',
},
recent: {
match: 'recent',
path: '/recent',
},
2024-12-11 20:10:59 +01:00
browse: {
match: 'browse',
path: '/browse',
},
migrate: {
match: 'migrate/source/:sourceId',
path: (sourceId: SourceType['id']) => `/migrate/source/${sourceId}`,
childRoutes: {
search: {
match: 'manga/:mangaId/search',
path: (sourceId: SourceType['id'], mangaId: MangaIdInfo['id']) =>
`/migrate/source/${sourceId}/manga/${mangaId}/search`,
},
},
},
tracker: {
match: 'tracker/login/oauth',
path: '/tracker/login/oauth',
},
reader: {
match: '/manga/:mangaId/chapter/:chapterSourceOrder/*',
path: (mangaId: MangaIdInfo['id'], chapterSourceOrder: ChapterSourceOrderInfo['sourceOrder']) =>
`/manga/${mangaId}/chapter/${chapterSourceOrder}`,
2024-12-11 20:10:59 +01:00
},
2025-03-09 15:48:54 +01:00
more: {
match: '/more',
path: '/more',
},
} as const satisfies TAppRoutes;
type ExtractChildRouteStringPaths<T> = T extends { childRoutes: infer U } ? ExtractStringPaths<U[keyof U]> : never;
type ExtractStringPaths<T> = T extends { path: infer P }
? P extends string
? P | ExtractChildRouteStringPaths<T>
: ExtractChildRouteStringPaths<T>
: ExtractChildRouteStringPaths<T>;
export type StaticAppRoute = ExtractStringPaths<(typeof AppRoutes)[keyof typeof AppRoutes]>;
2025-04-30 02:40:05 +02:00
export const GROUPED_VIRTUOSO_Z_INDEX = 2;