aboutsummaryrefslogtreecommitdiff
path: root/frontend/ts/src/route.ts
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/ts/src/route.ts')
-rw-r--r--frontend/ts/src/route.ts59
1 files changed, 59 insertions, 0 deletions
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)
+}