From 88f36575fb81c47b2e88f708890da77dcadde2e1 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 19 Apr 2023 10:35:22 +0200 Subject: [PATCH] Basic userstore --- src/lib/userstore.ts | 92 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 src/lib/userstore.ts diff --git a/src/lib/userstore.ts b/src/lib/userstore.ts new file mode 100644 index 0000000..39e61bc --- /dev/null +++ b/src/lib/userstore.ts @@ -0,0 +1,92 @@ +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: number +}; + +const userStore = () => { + const state: UserState = { + access_token: '', + refresh_token: '', + isLoggedIn: false, + refreshInterval: 0 + }; + + 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('userdata', JSON.stringify(state)); + localStorage.setItem('access_token', state.access_token); + localStorage.setItem('refresh_token', state.refresh_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(); + } + }, + loginFromStorage() { + console.log('loginFromStorage'); + const access_token = localStorage.getItem('token'); + if (!access_token) { + throw new Error('Unauthorized'); + } + + const storagedata = localStorage.getItem('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); + return state; + }); + + this.refreshAuth + }, + async logout() { + update((state: UserState) => { + state.isLoggedIn = false; + state.access_token = ''; + state.refresh_token = ''; + state.refreshInterval = 0; + localStorage.clear(); + return state; + }); + } + }; + + return { + subscribe, + set, + update, + state, + ...methods + }; +}; + +export default userStore();