summaryrefslogtreecommitdiff
path: root/frontend/src/App.svelte
diff options
context:
space:
mode:
authorSomhairle H. Marisol <[email protected]>2026-09-17 14:32:37 +0800
committerSomhairle H. Marisol <[email protected]>2026-09-17 14:32:37 +0800
commit5c0ba37eda80d39e6ceca59bb1d5f4942f858995 (patch)
tree948723f9cedf7ccb0707fa6ee516bd30fe20fd10 /frontend/src/App.svelte
downloadstrategy-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.svelte71
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>