jankboard/client/src/App.svelte

110 lines
3.1 KiB
Svelte
Raw Normal View History

2024-02-21 13:49:39 -08:00
<script lang="ts">
import '@fontsource/roboto/latin.css'
import 'material-icons/iconfont/material-icons.css'
import Dashboard from './lib/Dashboard/Dashboard.svelte'
import 'material-symbols'
import AppBar from './lib/Apps/AppBar.svelte'
import { appList } from './lib/Apps/appList'
import { initializeTelemetry } from './lib/utils/initializeTelemetry'
import { onDestroy, onMount } from 'svelte'
import { Toaster } from 'svelte-french-toast'
import { initializationSequence } from './lib/Sequences/sequences'
import { settingsStore } from './lib/stores/settingsStore'
import getSettings from './lib/utils/getSettings'
import hideSplashscreen from './lib/utils/hideSplashscreen'
import Cutouts from './lib/Dashboard/Cutouts/Cutouts.svelte'
2024-02-21 20:10:42 -08:00
let activeApp: App = 'camera'
// fake loading splash screen to look cool if the model loads too fast
let fakeLoadingDone = false
// and the real one, to wait for massive robot model to load if it's slow
let realLoadingDone = false
let started = false
let unlistenAll: () => void
onMount(() => {
let savedSettings = getSettings()
if (savedSettings !== false) {
settingsStore.set(savedSettings)
}
window.ResizeObserver = ResizeObserver
2024-02-25 01:29:59 -08:00
// disabled while migrating away from python
initializeTelemetry().then((unsubFunction: () => void) => {
unlistenAll = unsubFunction
})
settingsStore.subscribe((value) => {
localStorage.setItem('settings', JSON.stringify(value))
})
setTimeout(() => {
fakeLoadingDone = true
}, 3000)
})
onDestroy(() => {
unlistenAll && unlistenAll()
})
const start = () => {
hideSplashscreen()
initializationSequence()
}
const onVisualizationLoaded = () => {
realLoadingDone = true
}
$: if (realLoadingDone && fakeLoadingDone && !started) {
started = true
start()
}
2024-02-21 13:49:39 -08:00
</script>
2024-03-10 23:35:27 -07:00
<main class="select-none transition-opacity duration-300">
2024-02-21 20:10:42 -08:00
<!-- driver dashboard -->
<div class="h-screen w-[35vw] fixed shadow-lg shadow-slate-800 z-10">
<Dashboard on:loaded={onVisualizationLoaded} />
2024-02-21 20:10:42 -08:00
</div>
<!-- the infotainment system -->
2024-02-25 01:44:35 -08:00
<div class="min-h-screen w-[65vw] right-0 absolute infotainment-container">
2024-02-21 20:10:42 -08:00
<!-- dynamic app system (edit appList.ts to add new apps) -->
2024-02-25 01:44:35 -08:00
<div class="mx-10 mt-10 overflow-hidden">
2024-02-21 20:10:42 -08:00
<svelte:component this={appList[activeApp].component} />
</div>
2024-02-25 01:44:35 -08:00
<div class="fixed w-[65vw] flex justify-center right-0 bottom-0 mb-4">
2024-02-21 20:10:42 -08:00
<AppBar bind:activeApp {appList} />
</div>
</div>
</main>
2024-02-21 13:49:39 -08:00
<!-- Camera cutouts -->
<Cutouts show={activeApp !== 'camera'} />
2024-02-25 01:44:35 -08:00
<!-- toast service -->
<Toaster />
2024-02-21 14:19:36 -08:00
<style lang="postcss">
main {
font-family: 'Roboto', sans-serif;
2024-02-21 14:19:36 -08:00
}
2024-02-21 20:10:42 -08:00
.infotainment-container {
background-image: url('./assets/wallpaper.jpg');
background-repeat: repeat-y;
background-size: cover;
/* hide scrollbar */
-ms-overflow-style: none;
scrollbar-width: none;
background-position: top right;
width: 65vw;
height: 100vh;
}
.infotainment-container::-webkit-scrollbar {
/* hide scrollbar */
display: none;
2024-02-21 20:10:42 -08:00
}
2024-02-21 13:49:39 -08:00
</style>