import { goto } from '$app/navigation'; import { browser } from '$app/env'; import { writable } from 'svelte/store'; import type { Info } from '$lib/pb/all.pb'; import { UserService } from '$lib/pb/all.pb'; import { withToken } from '$lib/pb/pbutil'; const token = browser ? window.localStorage.getItem('authToken') : null; export class Data { readonly info?: Info; readonly token?: string; constructor(token?: string, info?: Info) { this.info = info; this.token = token; } loggedIn(): boolean { return this.token !== null; } login(newToken: string) { window.localStorage.setItem('authToken', newToken); } logout() { window.localStorage.removeItem('authToken'); } refresh() { UserService.Info({}, withToken(this.token)) .then((info) => { auth.set(new Data(token, info)); }) .catch(() => { this.logout(); auth.set(new Data()); goto('/'); }); } } export const auth = writable(new Data(token)); auth.subscribe(async (newAuth) => { if (!browser) return; // user is already set if (newAuth.info || !newAuth.token) return; if (!newAuth.token) { newAuth.logout(); auth.set(new Data()); return; } // token just got added window.localStorage.setItem('authToken', newAuth.token); UserService.Info({}, withToken(newAuth.token)) .then((info) => { auth.set(new Data(newAuth.token, info)); }) .catch(() => { newAuth.logout(); auth.set(new Data()); goto('/'); }); });