diff options
| author | Somhairle H. Marisol <[email protected]> | 2026-09-17 14:32:37 +0800 |
|---|---|---|
| committer | Somhairle H. Marisol <[email protected]> | 2026-09-17 14:32:37 +0800 |
| commit | 5c0ba37eda80d39e6ceca59bb1d5f4942f858995 (patch) | |
| tree | 948723f9cedf7ccb0707fa6ee516bd30fe20fd10 /frontend/src/App.svelte | |
| download | strategy-lab-5c0ba37eda80d39e6ceca59bb1d5f4942f858995.tar.gz | |
chore: establish Strategy Lab source baseline (development, not release)
Diffstat (limited to 'frontend/src/App.svelte')
| -rw-r--r-- | frontend/src/App.svelte | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte new file mode 100644 index 0000000..ae70ba4 --- /dev/null +++ b/frontend/src/App.svelte @@ -0,0 +1,71 @@ +<script lang="ts"> + import { onMount } from 'svelte'; + import type { Route } from './lib/router'; + import { routeFromHash, replace } from './lib/router'; + import { session } from './lib/session.svelte'; + import Layout from './components/Layout.svelte'; + import AuthPages from './pages/AuthPages.svelte'; + import ProjectsPage from './pages/ProjectsPage.svelte'; + import ProjectPage from './pages/ProjectPage.svelte'; + import DatasetsPage from './pages/DatasetsPage.svelte'; + import RunsPage from './pages/RunsPage.svelte'; + import UsagePage from './pages/UsagePage.svelte'; + import AccountPage from './pages/AccountPage.svelte'; + import AdminPage from './pages/AdminPage.svelte'; + import Loading from './components/Loading.svelte'; + + let route = $state<Route>(routeFromHash()); + + window.addEventListener('hashchange', () => { + route = routeFromHash(); + }); + + const publicRoutes = new Set(['login', 'register', 'reset']); + const projectRoutes = new Set(['project-data', 'project-strategy', 'project-backtest', 'project-results']); + + onMount(() => { + void session.refresh(); + }); + + $effect(() => { + if (publicRoutes.has(route.name)) return; + if (session.status === 'anon') { + replace('/login'); + return; + } + if (session.me && route.name === 'admin' && session.me.role !== 'admin') { + replace('/projects'); + } + }); + + const showAuth = $derived(publicRoutes.has(route.name) || session.status === 'anon'); + const booting = $derived(session.status === 'loading' && !publicRoutes.has(route.name)); +</script> + +<div class="app-root"> + {#if booting} + <Loading /> + {:else if showAuth} + <AuthPages {route} /> + {:else} + <Layout {route}> + {#if route.name === 'projects'} + <ProjectsPage /> + {:else if projectRoutes.has(route.name)} + <ProjectPage {route} /> + {:else if route.name === 'datasets'} + <DatasetsPage /> + {:else if route.name === 'runs'} + <RunsPage /> + {:else if route.name === 'usage'} + <UsagePage /> + {:else if route.name === 'account'} + <AccountPage /> + {:else if route.name === 'admin'} + <AdminPage /> + {:else} + <ProjectsPage /> + {/if} + </Layout> + {/if} +</div> |
