feat(web): implement user store

This commit is contained in:
Stevan Freeborn
2026-02-21 07:32:28 -06:00
parent a3dc58d19b
commit 74e55b2f48
+36 -2
View File
@@ -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<typeof useUserStore>;
export const useUserStore = defineStore('userStore', () => {
const user = ref<User | null>(getUserFromLocalStorage());
const clientFactory = inject(ClientFactoryKey);
const authServiceFactory = inject(AuthServiceFactoryKey);
function logUserIn(jwtToken: string) {
const { sub, exp } = jwtDecode<JwtTokenPayload>(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,
};
});