summaryrefslogtreecommitdiffstatshomepage
path: root/frontend/src/lib/Navigation.ts
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/src/lib/Navigation.ts')
-rw-r--r--frontend/src/lib/Navigation.ts52
1 files changed, 32 insertions, 20 deletions
diff --git a/frontend/src/lib/Navigation.ts b/frontend/src/lib/Navigation.ts
index e6b17cd..4dcb998 100644
--- a/frontend/src/lib/Navigation.ts
+++ b/frontend/src/lib/Navigation.ts
@@ -1,36 +1,44 @@
import { goto as svelteGoto } from '$app/navigation';
-import { SortDirection } from '$gql/graphql';
+import { SortDirection, type ComicFilter } from '$gql/graphql';
import JsonURL from '@jsonurl/jsonurl';
-import { type PaginationData } from './Pagination';
-import { type SortData } from './Sort';
import { toastError } from './Toasts';
+import type { Key } from './Utils';
-function paramToNum<T>(value: string | null, fallback: T) {
- if (value) {
- const number = +value;
+export interface PaginationData {
+ page: number;
+ items: number;
+}
- if (Number.isNaN(number) || number < 0) {
- return fallback;
- }
+export interface SortData<T extends Key> {
+ on: T;
+ direction: SortDirection;
+ seed: number | undefined;
+}
+
+function number<T>(value: string | null, fallback: T) {
+ if (!value) return fallback;
- return number;
+ const number = +value;
+
+ if (Number.isNaN(number) || number < 0) {
+ return fallback;
}
- return fallback;
+ return number;
}
-export function parseSortData<T>(params: URLSearchParams, fallback: T): SortData<T> {
+export function parseSortData<T extends Key>(params: URLSearchParams, fallback: T): SortData<T> {
return {
on: (params.get('s') as T) || fallback,
direction: (params.get('d') as SortDirection) || SortDirection.Ascending,
- seed: paramToNum(params.get('r'), undefined)
+ seed: number(params.get('r'), undefined)
};
}
export function parsePaginationData(params: URLSearchParams, defaultItems = 120): PaginationData {
return {
- page: paramToNum(params.get('p'), 1),
- items: paramToNum(params.get('i'), defaultItems)
+ page: number(params.get('p'), 1),
+ items: number(params.get('i'), defaultItems)
};
}
@@ -41,7 +49,7 @@ export function parseFilter<T>(params: URLSearchParams): T {
try {
return JsonURL.parse(param, { AQF: true, impliedObject: {} }) as T;
- } catch (e) {
+ } catch {
return {} as T;
}
}
@@ -62,7 +70,7 @@ interface NavigationParameters<T> {
pagination?: Partial<PaginationData>;
}
-function paramsFrom<T>(
+function parametersFrom<T>(
{ pagination, filter, sort }: NavigationParameters<T>,
current?: URLSearchParams
) {
@@ -102,13 +110,17 @@ function paramsFrom<T>(
return params;
}
-export function navigate(parameters: NavigationParameters<object>, current?: URLSearchParams) {
+export function navigate(params: NavigationParameters<object>, current?: URLSearchParams) {
goto({
- params: paramsFrom(parameters, current),
+ params: parametersFrom(params, current),
options: { noScroll: false, keepFocus: true, replaceState: true }
});
}
export function href<T>(base: string, params: NavigationParameters<T>) {
- return `/${base}/?${paramsFrom(params).toString()}`;
+ return `/${base}/?${parametersFrom(params).toString()}`;
+}
+
+export function quickComicFilter(id: number | string, filter: keyof ComicFilter) {
+ window.open(href('comics', { filter: { include: { [filter]: { all: [id] } } } }));
}