summaryrefslogtreecommitdiffstatshomepage
path: root/frontend/src/lib/Sort.ts
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/src/lib/Sort.ts')
-rw-r--r--frontend/src/lib/Sort.ts42
1 files changed, 42 insertions, 0 deletions
diff --git a/frontend/src/lib/Sort.ts b/frontend/src/lib/Sort.ts
new file mode 100644
index 0000000..4c9a353
--- /dev/null
+++ b/frontend/src/lib/Sort.ts
@@ -0,0 +1,42 @@
+import { SortDirection } from '$gql/graphql';
+import { getContext, setContext } from 'svelte';
+import { writable, type Writable } from 'svelte/store';
+import { navigate } from './Navigation';
+
+export interface SortData<T> {
+ on: T;
+ direction: SortDirection;
+ seed: number | undefined;
+}
+
+export class SortContext<T extends string> {
+ on: T;
+ direction: SortDirection;
+ seed: number | undefined;
+ labels: Record<T, string>;
+
+ constructor({ on, direction, seed }: SortData<T>, labels: Record<T, string>) {
+ this.on = on;
+ this.direction = direction;
+ this.seed = seed;
+ this.labels = labels;
+ }
+
+ set update({ on, direction, seed }: SortData<T>) {
+ this.on = on;
+ this.direction = direction;
+ this.seed = seed;
+ }
+
+ apply(params: URLSearchParams) {
+ navigate({ sort: { on: this.on, direction: this.direction, seed: this.seed } }, params);
+ }
+}
+
+export function initSortContext<T extends string>(sort: SortData<T>, labels: Record<T, string>) {
+ return setContext<Writable<SortContext<T>>>('sort', writable(new SortContext(sort, labels)));
+}
+
+export function getSortContext<T extends string>() {
+ return getContext<Writable<SortContext<T>>>('sort');
+}