2022-09-05 17:53:31 +02:00
|
|
|
<script lang="ts">
|
2022-09-05 21:01:17 +02:00
|
|
|
import Router, { location, pop } from 'svelte-spa-router'
|
|
|
|
|
|
|
|
import SoftKey from './components/SoftKey.svelte'
|
|
|
|
|
|
|
|
import Home from './routes/Home.svelte'
|
|
|
|
import Login from './routes/Login.svelte'
|
|
|
|
import Redirect from './routes/Redirect.svelte'
|
|
|
|
|
|
|
|
import { titleStore, softkeysStore } from './stores.ts'
|
|
|
|
|
|
|
|
let title
|
|
|
|
titleStore.subscribe(value => title = value)
|
|
|
|
|
|
|
|
let softkeys
|
|
|
|
softkeysStore.subscribe(value => softkeys = value)
|
|
|
|
|
2022-09-06 14:21:05 +02:00
|
|
|
// Navigation
|
2022-09-05 21:01:17 +02:00
|
|
|
const routes = {
|
|
|
|
'/': Home,
|
|
|
|
'/login': Login,
|
|
|
|
'*': Redirect,
|
|
|
|
}
|
2022-09-05 20:03:11 +02:00
|
|
|
|
2022-09-06 14:21:05 +02:00
|
|
|
// Go back
|
|
|
|
function goBack() {
|
|
|
|
// exit if we're on the main screen
|
|
|
|
if ($location === '/') {
|
|
|
|
window.close()
|
|
|
|
}
|
|
|
|
// otherwise, go back
|
|
|
|
pop()
|
|
|
|
}
|
|
|
|
|
2022-09-05 20:03:11 +02:00
|
|
|
// Account creation (or not)
|
|
|
|
function createAccount() {
|
|
|
|
alert('Unfortunately, you cannot create an account yet :(')
|
|
|
|
}
|
2022-09-05 17:53:31 +02:00
|
|
|
|
2022-09-05 20:03:11 +02:00
|
|
|
// For D-pad navigation
|
|
|
|
function nav(move) {
|
|
|
|
let currentIndex = document.activeElement.tabIndex
|
|
|
|
let next = currentIndex + move
|
|
|
|
let items = document.querySelectorAll('.focusable')
|
2022-09-05 17:53:31 +02:00
|
|
|
|
2022-09-05 20:03:11 +02:00
|
|
|
// Loop around if at end
|
|
|
|
if (next < 0) next = items.length - 1
|
|
|
|
if (next > items.length - 1) next = 0
|
|
|
|
let targetElement = items[next]
|
|
|
|
targetElement.focus()
|
2022-09-05 17:53:31 +02:00
|
|
|
}
|
|
|
|
|
2022-09-05 20:03:11 +02:00
|
|
|
// Key-down handler
|
|
|
|
function handleKeydown(e) {
|
|
|
|
switch(e.key) {
|
|
|
|
case 'ArrowUp':
|
|
|
|
nav(-1)
|
|
|
|
break
|
|
|
|
case 'ArrowDown':
|
|
|
|
nav(1)
|
|
|
|
break
|
|
|
|
case 'SoftLeft':
|
|
|
|
case '[':
|
2022-09-05 21:01:17 +02:00
|
|
|
softkeys.left.callback()
|
2022-09-05 20:03:11 +02:00
|
|
|
break
|
2022-09-05 21:01:17 +02:00
|
|
|
case 'Enter':
|
|
|
|
softkeys.center.callback()
|
2022-09-16 15:19:57 +02:00
|
|
|
break
|
2022-09-05 20:03:11 +02:00
|
|
|
case 'SoftRight':
|
|
|
|
case ']':
|
2022-09-05 21:01:17 +02:00
|
|
|
softkeys.right.callback()
|
2022-09-05 20:03:11 +02:00
|
|
|
break
|
|
|
|
case 'Backspace':
|
2022-09-06 14:21:05 +02:00
|
|
|
goBack()
|
|
|
|
e.preventDefault()
|
2022-09-05 20:03:11 +02:00
|
|
|
break
|
|
|
|
}
|
2022-09-05 17:53:31 +02:00
|
|
|
}
|
2022-09-05 20:03:11 +02:00
|
|
|
|
|
|
|
// Listen for keys
|
|
|
|
document
|
|
|
|
.activeElement
|
|
|
|
.addEventListener('keydown', handleKeydown)
|
|
|
|
</script>
|
|
|
|
|
2022-09-05 21:01:17 +02:00
|
|
|
<main id="app">
|
|
|
|
<div id="header">
|
|
|
|
<div name="header">{title}</div>
|
|
|
|
</div>
|
|
|
|
<div id="content">
|
|
|
|
<Router {routes}/>
|
|
|
|
</div>
|
|
|
|
<div class="softkeys">
|
|
|
|
{#if softkeys.left && softkeys.left.label}
|
|
|
|
<SoftKey side="left">{softkeys.left.label}</SoftKey>
|
|
|
|
{/if}
|
|
|
|
{#if softkeys.center && softkeys.center.label}
|
|
|
|
<SoftKey side="center">{softkeys.center.label}</SoftKey>
|
|
|
|
{/if}
|
|
|
|
{#if softkeys.right && softkeys.right.label}
|
|
|
|
<SoftKey side="right">{softkeys.right.label}</SoftKey>
|
|
|
|
{/if}
|
|
|
|
</div>
|
|
|
|
</main>
|