diff options
Diffstat (limited to 'frontend/ts/src/route.ts')
-rw-r--r-- | frontend/ts/src/route.ts | 59 |
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) +} |