diff --git a/frontend/src/routes/__layout-root.svelte b/frontend/src/routes/__layout-root.svelte
index 4fa864ce7a..c6ae2dd112 100644
--- a/frontend/src/routes/__layout-root.svelte
+++ b/frontend/src/routes/__layout-root.svelte
@@ -1 +1,104 @@
+
+
+
+
+
diff --git a/frontend/src/routes/__layout.svelte b/frontend/src/routes/__layout@root.svelte
similarity index 81%
rename from frontend/src/routes/__layout.svelte
rename to frontend/src/routes/__layout@root.svelte
index 54f73e4991..34dd16a4a3 100644
--- a/frontend/src/routes/__layout.svelte
+++ b/frontend/src/routes/__layout@root.svelte
@@ -1,38 +1,27 @@
-
-
-
-
diff --git a/frontend/src/routes/user/login@user.svelte b/frontend/src/routes/user/login@user.svelte
index 01ea61aea4..dec3c60068 100644
--- a/frontend/src/routes/user/login@user.svelte
+++ b/frontend/src/routes/user/login@user.svelte
@@ -1,15 +1,13 @@
-
+
Currently only signup through Github is supported
(undefined)
-export const workspaceStore = writable(undefined)
+export let workspaceStore = writable(
+ persistedWorkspace ? String(persistedWorkspace) : undefined
+)
export const usersWorkspaceStore = writable(undefined)
export const usernameStore: Readable = derived(
[usersWorkspaceStore, workspaceStore],
@@ -21,3 +25,18 @@ export const usernameStore: Readable = derived(
}
)
export const superadmin = writable(undefined)
+
+if (browser) {
+ workspaceStore.subscribe((workspace) => {
+ if (workspace) {
+ localStorage.setItem('workspace', String(workspace))
+ }
+ })
+}
+
+export function clearStores(): void {
+ userStore.set(undefined)
+ workspaceStore.set(undefined)
+ usersWorkspaceStore.set(undefined)
+ superadmin.set(undefined)
+}
diff --git a/frontend/src/utils.ts b/frontend/src/utils.ts
index fc9af00efb..dc6308f2e8 100644
--- a/frontend/src/utils.ts
+++ b/frontend/src/utils.ts
@@ -1,10 +1,9 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
-import { toast } from '@zerodevx/svelte-toast'
-import { CancelablePromise, UserService } from './gen'
-import { superadmin, userStore, workspaceStore } from './stores'
-import type { UserExt } from './stores'
-import { get } from 'svelte/store'
import { goto } from '$app/navigation'
+import { toast } from '@zerodevx/svelte-toast'
+import { get } from 'svelte/store'
+import { CancelablePromise, UserService, type User } from './gen'
+import { clearStores, superadmin, userStore, workspaceStore, type UserExt } from './stores'
export function isToday(someDate: Date): boolean {
const today = new Date()
@@ -76,14 +75,7 @@ export function truncateHash(hash: string): string {
async function loadStore(workspace: string): Promise {
try {
const user = await UserService.whoami({ workspace })
- const nuser = {
- username: user.username,
- email: user.email,
- created_at: user.created_at,
- is_admin: user.is_admin,
- groups: user.groups!,
- pgroups: user.groups!.map((x) => `g/${x}`)
- }
+ const nuser = mapUserToUserExt(user)
userStore.set(nuser)
return nuser
} catch (error) {
@@ -151,7 +143,7 @@ export async function refreshSuperadmin(): Promise {
export async function logout(logoutMessage?: string): Promise {
try {
- superadmin.set(undefined)
+ clearStores()
goto(`/user/login${logoutMessage ? '?error=' + encodeURIComponent(logoutMessage) : ''}`)
await UserService.logout()
sendUserToast('you have been logged out')
@@ -265,10 +257,7 @@ export function removeKeysWithEmptyValues(obj: any): any {
}
export function allTrue(dict: { [id: string]: boolean }): boolean {
- for (let v of Object.values(dict)) {
- if (!v) return false
- }
- return true
+ return Object.values(dict).every(Boolean)
}
export function forLater(scheduledString: string): boolean {
@@ -331,3 +320,11 @@ export function truncateRev(s: string, n: number, prefix: string = '...'): strin
export function isString(value: any) {
return typeof value === 'string' || value instanceof String
}
+
+export function mapUserToUserExt(user: User): UserExt {
+ return {
+ ...user,
+ groups: user.groups!,
+ pgroups: user.groups!.map((x) => `g/${x}`)
+ }
+}