Files
reiverr/src/lib/stores/app-state.store.ts
2024-05-20 00:27:55 +03:00

88 lines
2.0 KiB
TypeScript

import { derived, writable } from 'svelte/store';
import { createLocalStorageStore } from './localstorage.store';
import { getReiverrApiClient, type ReiverrUser } from '../apis/reiverr/reiverr-api';
interface AuthenticationStoreData {
token?: string;
serverBaseUrl?: string;
}
interface UserStoreData {
user: ReiverrUser | null;
}
interface AppStateData extends AuthenticationStoreData {
user: ReiverrUser | null;
}
const authenticationStore = createLocalStorageStore<AuthenticationStoreData>(
'authentication-token',
{
token: undefined,
serverBaseUrl: window?.location?.origin
}
);
function createAppState() {
const userStore = writable<UserStoreData>(undefined);
const combinedStore = derived<[typeof userStore, typeof authenticationStore], AppStateData>(
[userStore, authenticationStore],
([user, auth]) => {
return {
...user,
...auth
};
}
);
function setBaseUrl(serverBaseUrl: string | undefined = undefined) {
authenticationStore.update((p) => ({ ...p, serverBaseUrl }));
}
function setToken(token: string | undefined = undefined) {
authenticationStore.update((p) => ({ ...p, token }));
}
function setUser(user: ReiverrUser | null) {
userStore.set({ user });
}
function logOut() {
setUser(null);
setToken(undefined);
}
const ready = new Promise<AppStateData>((resolve) => {
combinedStore.subscribe((state) => {
if (state.token && state.serverBaseUrl && state.user !== undefined) {
resolve(state);
}
});
});
return {
subscribe: combinedStore.subscribe,
setBaseUrl,
setToken,
setUser,
logOut,
ready
};
}
export const appState = createAppState();
export const appStateUser = derived(appState, ($state) => $state.user);
authenticationStore.subscribe((auth) => {
if (auth.token) {
getReiverrApiClient(auth.serverBaseUrl, auth.token)
?.GET('/user', {})
.then((res) => res.data)
.then((user) => appState.setUser(user || null))
.catch((err) => appState.setUser(null));
} else {
appState.setUser(null);
}
});