From 74e55b2f48eee1e8d70cba7d007ba38b3b08d99b Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Wed, 18 Feb 2026 06:00:48 -0600 Subject: [PATCH] feat(web): implement user store --- src/FiscalOS.Web/src/stores/userStore.ts | 38 ++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/FiscalOS.Web/src/stores/userStore.ts b/src/FiscalOS.Web/src/stores/userStore.ts index e38560c..a4abcfe 100644 --- a/src/FiscalOS.Web/src/stores/userStore.ts +++ b/src/FiscalOS.Web/src/stores/userStore.ts @@ -1,8 +1,10 @@ +import { AuthServiceFactoryKey } from '@/services/authService'; +import { ClientConfig, ClientFactoryKey } from '@/services/client'; import { jwtDecode } from 'jwt-decode'; import { defineStore } from 'pinia'; -import { ref } from 'vue'; +import { inject, ref } from 'vue'; -export const USER_KEY = 'onxGraphAuth'; +export const USER_KEY = 'fiscalos_auth'; export type User = { id: string; @@ -24,6 +26,8 @@ export type UserStore = ReturnType; export const useUserStore = defineStore('userStore', () => { const user = ref(getUserFromLocalStorage()); + const clientFactory = inject(ClientFactoryKey); + const authServiceFactory = inject(AuthServiceFactoryKey); function logUserIn(jwtToken: string) { const { sub, exp } = jwtDecode(jwtToken); @@ -41,9 +45,39 @@ export const useUserStore = defineStore('userStore', () => { user.value = null; } + async function refreshAccessToken(originalRequest: Request) { + const unauthorizedResponse = new Response(null, { status: 401 }); + + if (user.value === null || !clientFactory || !authServiceFactory) { + logUserOut(); + return { response: unauthorizedResponse, accessToken: '' }; + } + + const client = clientFactory.create( + new ClientConfig({ Authorization: `Bearer ${user.value.token}` }, true) + ); + + const authService = authServiceFactory.create(client); + + const refreshResult = await authService.refreshToken(); + + if (refreshResult.err) { + logUserOut(); + return { response: unauthorizedResponse, accessToken: '' }; + } + + logUserIn(refreshResult.val.accessToken); + + originalRequest.headers.set('Authorization', `Bearer ${refreshResult.val.accessToken}`); + const response = await fetch(originalRequest); + + return { response, accessToken: refreshResult.val.accessToken }; + } + return { user: user, logUserIn, logUserOut, + refreshAccessToken, }; });