diff --git a/WebApp/src/app.html b/WebApp/src/app.html index 646b23d..1885608 100644 --- a/WebApp/src/app.html +++ b/WebApp/src/app.html @@ -13,7 +13,7 @@
%sveltekit.body%
diff --git a/WebApp/src/lib/app/controller-shared.js b/WebApp/src/lib/app/controller-shared.js index db7e0ea..cf0ae1d 100644 --- a/WebApp/src/lib/app/controller-shared.js +++ b/WebApp/src/lib/app/controller-shared.js @@ -2,12 +2,12 @@ // @ts-nocheck const PAGE_PATHS = { - auth: '/', - onboarding: '/onboarding', - camera: '/camera', - client: '/client', - activity: '/activity', - settings: '/settings' + auth: '/auth/login', + onboarding: '/app/onboarding', + camera: '/app/camera', + client: '/app/client', + activity: '/app/activity', + settings: '/app/settings' }; const DEVICE_STORAGE_KEY = 'mobileSimDevice'; @@ -66,15 +66,21 @@ const normalizePath = (path) => path.replace(/\/+$/, '') || '/'; export const pageFromPath = (path) => { switch (normalizePath(path)) { - case '/onboarding': + case '/auth': + case '/auth/login': + case '/auth/signup': + return 'auth'; + case '/app': + return 'app'; + case '/app/onboarding': return 'onboarding'; - case '/camera': + case '/app/camera': return 'camera'; - case '/client': + case '/app/client': return 'client'; - case '/activity': + case '/app/activity': return 'activity'; - case '/settings': + case '/app/settings': return 'settings'; default: return 'auth'; diff --git a/WebApp/src/lib/app/controller.js b/WebApp/src/lib/app/controller.js index 44a0c2e..251d239 100644 --- a/WebApp/src/lib/app/controller.js +++ b/WebApp/src/lib/app/controller.js @@ -55,6 +55,9 @@ let initPromise = null; let socket = null; let pollInterval = null; let socketHeartbeatInterval = null; +const handleBeforeUnload = () => { + void cleanupConnectionState(); +}; let clientVideoElement = null; @@ -839,7 +842,13 @@ const invalidateSavedDevice = async (message, options = {}) => { const enforceRouteForSession = () => { const state = getAppState(); const page = pageFromPath(window.location.pathname); - setAppState({ page }); + const initialPage = + page === 'app' + ? state.deviceToken + ? getHomePageKeyForRole(state.device?.role) + : 'onboarding' + : page; + setAppState({ page: initialPage }); if (!state.session) { if (page !== 'auth') { @@ -856,7 +865,7 @@ const enforceRouteForSession = () => { } const expectedHome = getHomePageKeyForRole(state.device?.role); - if ((page === 'auth' || page === 'onboarding') && expectedHome) { + if ((page === 'auth' || page === 'onboarding' || page === 'app') && expectedHome) { navigateToScreen('home', { replace: true, role: state.device?.role }); return; } @@ -903,9 +912,7 @@ const init = async () => { void refreshCameraInputDevices(); applyMotionDetectionReadiness(); - window.addEventListener('beforeunload', () => { - void cleanupConnectionState(); - }); + window.addEventListener('beforeunload', handleBeforeUnload); initialized = true; })().finally(() => { @@ -923,6 +930,7 @@ const destroy = async () => { if (typeof document !== 'undefined') { document.removeEventListener('visibilitychange', onVisibilityChange); } + window.removeEventListener('beforeunload', handleBeforeUnload); initialized = false; await cleanupConnectionState(); }; @@ -955,6 +963,10 @@ const actions = { patchAppState((state) => ({ isRegistering: !state.isRegistering })); }, + setAuthMode(isRegistering) { + setAppState({ isRegistering }); + }, + async submitAuth() { const state = getAppState(); const { email, password, name } = state.authForm; diff --git a/WebApp/src/routes/(shell)/+layout.svelte b/WebApp/src/routes/(shell)/+layout.svelte new file mode 100644 index 0000000..7053100 --- /dev/null +++ b/WebApp/src/routes/(shell)/+layout.svelte @@ -0,0 +1,19 @@ + + +
+ {@render children()} +
diff --git a/WebApp/src/routes/(shell)/app/+page.svelte b/WebApp/src/routes/(shell)/app/+page.svelte new file mode 100644 index 0000000..9b6f053 --- /dev/null +++ b/WebApp/src/routes/(shell)/app/+page.svelte @@ -0,0 +1,34 @@ + + +
+
+ Preparing your workspace… +
+
diff --git a/WebApp/src/routes/activity/+page.svelte b/WebApp/src/routes/(shell)/app/activity/+page.svelte similarity index 100% rename from WebApp/src/routes/activity/+page.svelte rename to WebApp/src/routes/(shell)/app/activity/+page.svelte diff --git a/WebApp/src/routes/camera/+page.svelte b/WebApp/src/routes/(shell)/app/camera/+page.svelte similarity index 100% rename from WebApp/src/routes/camera/+page.svelte rename to WebApp/src/routes/(shell)/app/camera/+page.svelte diff --git a/WebApp/src/routes/client/+page.svelte b/WebApp/src/routes/(shell)/app/client/+page.svelte similarity index 100% rename from WebApp/src/routes/client/+page.svelte rename to WebApp/src/routes/(shell)/app/client/+page.svelte diff --git a/WebApp/src/routes/onboarding/+page.svelte b/WebApp/src/routes/(shell)/app/onboarding/+page.svelte similarity index 100% rename from WebApp/src/routes/onboarding/+page.svelte rename to WebApp/src/routes/(shell)/app/onboarding/+page.svelte diff --git a/WebApp/src/routes/settings/+page.svelte b/WebApp/src/routes/(shell)/app/settings/+page.svelte similarity index 100% rename from WebApp/src/routes/settings/+page.svelte rename to WebApp/src/routes/(shell)/app/settings/+page.svelte diff --git a/WebApp/src/routes/+layout.svelte b/WebApp/src/routes/+layout.svelte index fb3c785..4b5ad0e 100644 --- a/WebApp/src/routes/+layout.svelte +++ b/WebApp/src/routes/+layout.svelte @@ -3,7 +3,6 @@ import '../app.css'; import { onMount } from 'svelte'; import favicon from '$lib/assets/favicon.svg'; - import { appController } from '$lib/app/controller'; import { clearInstallPrompt, setInstallPrompt, @@ -85,14 +84,11 @@ window.addEventListener('online', handleOnline); window.addEventListener('offline', handleOffline); - void appController.init(); - return () => { window.removeEventListener('beforeinstallprompt', handleBeforeInstallPrompt); window.removeEventListener('appinstalled', handleAppInstalled); window.removeEventListener('online', handleOnline); window.removeEventListener('offline', handleOffline); - void appController.destroy(); }; }); diff --git a/WebApp/src/routes/activity/+page.ts b/WebApp/src/routes/activity/+page.ts new file mode 100644 index 0000000..42bc129 --- /dev/null +++ b/WebApp/src/routes/activity/+page.ts @@ -0,0 +1,5 @@ +import { redirect } from '@sveltejs/kit'; + +export function load() { + throw redirect(307, '/app/activity'); +} diff --git a/WebApp/src/routes/camera/+page.ts b/WebApp/src/routes/camera/+page.ts new file mode 100644 index 0000000..64c31e5 --- /dev/null +++ b/WebApp/src/routes/camera/+page.ts @@ -0,0 +1,5 @@ +import { redirect } from '@sveltejs/kit'; + +export function load() { + throw redirect(307, '/app/camera'); +} diff --git a/WebApp/src/routes/client/+page.ts b/WebApp/src/routes/client/+page.ts new file mode 100644 index 0000000..e3c6392 --- /dev/null +++ b/WebApp/src/routes/client/+page.ts @@ -0,0 +1,5 @@ +import { redirect } from '@sveltejs/kit'; + +export function load() { + throw redirect(307, '/app/client'); +} diff --git a/WebApp/src/routes/onboarding/+page.ts b/WebApp/src/routes/onboarding/+page.ts new file mode 100644 index 0000000..25a3009 --- /dev/null +++ b/WebApp/src/routes/onboarding/+page.ts @@ -0,0 +1,5 @@ +import { redirect } from '@sveltejs/kit'; + +export function load() { + throw redirect(307, '/app/onboarding'); +} diff --git a/WebApp/src/routes/settings/+page.ts b/WebApp/src/routes/settings/+page.ts new file mode 100644 index 0000000..9c862f1 --- /dev/null +++ b/WebApp/src/routes/settings/+page.ts @@ -0,0 +1,5 @@ +import { redirect } from '@sveltejs/kit'; + +export function load() { + throw redirect(307, '/app/settings'); +}