71 lines
1.4 KiB
TypeScript
71 lines
1.4 KiB
TypeScript
|
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<Data>(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('/');
|
||
|
});
|
||
|
});
|