95 lines
2.9 KiB
TypeScript
95 lines
2.9 KiB
TypeScript
import { AuthService, OpenAPI, type ResponseAuth } from '@odit/lfk-client-js';
|
|
import { writable } from 'svelte/store';
|
|
|
|
type UserState = {
|
|
access_token: string;
|
|
refresh_token: string;
|
|
isLoggedIn: boolean;
|
|
refreshInterval: NodeJS.Timer | undefined
|
|
};
|
|
|
|
const userStore = () => {
|
|
const state: UserState = {
|
|
access_token: '',
|
|
refresh_token: '',
|
|
isLoggedIn: false,
|
|
refreshInterval: undefined
|
|
};
|
|
|
|
const { subscribe, set, update } = writable(state);
|
|
|
|
const methods = {
|
|
async login(resAuth: ResponseAuth) {
|
|
update((state: UserState) => {
|
|
if (!resAuth) {
|
|
return state;
|
|
}
|
|
|
|
state.access_token = resAuth.access_token;
|
|
state.refresh_token = resAuth.refresh_token;
|
|
state.isLoggedIn = true;
|
|
state.refreshInterval = setInterval(() => {
|
|
this.refreshAuth();
|
|
}, 2 * 60000)
|
|
|
|
localStorage.setItem('kiosk-userdata', JSON.stringify(state));
|
|
localStorage.setItem('kiosk-access_token', state.access_token);
|
|
OpenAPI.TOKEN = resAuth.access_token;
|
|
return state;
|
|
});
|
|
},
|
|
async refreshAuth() {
|
|
try {
|
|
const authRes = await AuthService.authControllerRefresh({ token: state.refresh_token }) as ResponseAuth;
|
|
OpenAPI.TOKEN = authRes.access_token;
|
|
} catch {
|
|
this.logout();
|
|
}
|
|
},
|
|
async loginFromStorage() {
|
|
console.log('loginFromStorage');
|
|
const access_token = localStorage.getItem('kiosk-access_token');
|
|
if (!access_token) {
|
|
throw new Error('Unauthorized');
|
|
}
|
|
|
|
const storagedata = localStorage.getItem('kiosk-userdata');
|
|
const userdata = JSON.parse(storagedata || '{}') as UserState;
|
|
|
|
update((state: UserState) => {
|
|
state.access_token = access_token;
|
|
state.refresh_token = userdata.refresh_token;
|
|
state.isLoggedIn = true;
|
|
state.refreshInterval = setInterval(() => {
|
|
this.refreshAuth();
|
|
}, 2 * 60000);
|
|
OpenAPI.TOKEN = userdata.access_token;
|
|
|
|
return state;
|
|
});
|
|
|
|
await this.refreshAuth();
|
|
},
|
|
async logout() {
|
|
update((state: UserState) => {
|
|
state.isLoggedIn = false;
|
|
state.access_token = '';
|
|
state.refresh_token = '';
|
|
state.refreshInterval = undefined;
|
|
localStorage.clear();
|
|
return state;
|
|
});
|
|
}
|
|
};
|
|
|
|
return {
|
|
subscribe,
|
|
set,
|
|
update,
|
|
state,
|
|
...methods
|
|
};
|
|
};
|
|
|
|
export default userStore();
|