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');
+}