import type { Invalidator, Subscriber, Unsubscriber } from 'svelte/store'; import { writable, derived } from 'svelte/store'; type Nullable = T | null; interface User { uuid: string; username: string; } interface TokenStore { subscribe: (run: Subscriber>, invalidate: Invalidator>) => Unsubscriber, authenticate: (newToken: string) => void, unauthenticate: () => void } function createTokenStore(): TokenStore { const storedToken = localStorage.getItem("token"); const { subscribe, set } = writable(storedToken); function authenticate(newToken: string): void { try { localStorage.setItem("token", newToken); set(newToken); } catch (e) { console.error('error', e); } } function unauthenticate(): void { localStorage.removeItem("token"); set(null); } return { subscribe, authenticate, unauthenticate }; } function onTokenChange ($token: Nullable): boolean { return $token ? true : false; } export const token = createTokenStore(); export const authenticated = derived(token, onTokenChange); export const user = writable(null);