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}`) + } +}