import type { Invalidator, Subscriber, Unsubscriber } from 'svelte/store'; import type { Preference } from '../types'; 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 } interface UserStore { subscribe: (run: Subscriber>, invalidate?: Invalidator>) => Unsubscriber, setUser: (user: User) => void, reset: () => void } interface PreferenceStore { subscribe: (run: Subscriber, invalidate?: Invalidator) => Unsubscriber, set: (this: void, value: Preference) => 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; } function createUserStore(): UserStore { const user = localStorage.getItem('user'); const userObj: Nullable = user ? JSON.parse(user) : null; const { subscribe, set } = writable(userObj); const setUser = (user: User) => { localStorage.setItem('user', JSON.stringify(user)); set(user); } const reset = () => { localStorage.removeItem('user'); set(null); } return { subscribe, setUser, reset } } function createPreferenceStore(): PreferenceStore { const preferences = localStorage.getItem('preferences'); const preferenceObj: Preference = preferences ? JSON.parse(preferences) : { color: "#FF0000", size: { size: 16, unit: 'oz' } }; const { subscribe, set } = writable(preferenceObj); return { subscribe, set } } export const token = createTokenStore(); export const authenticated = derived(token, onTokenChange); export const user = createUserStore(); export const preferences = createPreferenceStore();