From 632eef6424d8dc8d40c2906177892697679e7b85 Mon Sep 17 00:00:00 2001 From: Joris Date: Sat, 19 Apr 2025 12:36:38 +0200 Subject: Add ZIG server --- frontend/ts/src/route.ts | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 frontend/ts/src/route.ts (limited to 'frontend/ts/src/route.ts') diff --git a/frontend/ts/src/route.ts b/frontend/ts/src/route.ts new file mode 100644 index 0000000..eb5b57f --- /dev/null +++ b/frontend/ts/src/route.ts @@ -0,0 +1,59 @@ +import * as router from 'lib/router' + +// Model + +export type Route = + | Login + | Maps + | Map; + +type Login = { + state: 'login' +} +export const login: Login = { state: 'login' } + +type Maps = { + state: 'maps' +} +export const maps: Maps = { state: 'maps' } + +type Map = { + state: 'map', + id: string +} +export function map({ id }: { id: string }): Map { + return { state: 'map', id } +} + +// Serialization + +export function get(url: string): Route | undefined { + let res; + + if (url == '/login') { + return { state: 'login' } + } else if (url == '/') { + return { state: 'maps' } + } else if (res = router.matches(url, '/:id')) { + return { + state: 'map', + id: res.data['id'] + } + } +} + +export function toString(route: Route): string { + if (route.state == 'login') return '/login' + else if (route.state == 'map') return `/${route.id}` + else return '/' +} + +// History + +export function push(route: Route): void { + history.pushState({}, '', toString(route)) + + // Trigger pop state + const popStateEvent = new PopStateEvent('popstate', {}) + dispatchEvent(popStateEvent) +} -- cgit v1.2.3