import {defineStore} from 'pinia'; import {computed, ref} from "vue"; import {useRouter} from "vue-router"; import {useClient} from "@/plugins/api.js"; import {useSessionStorage} from "@vueuse/core"; import {jwtDecode} from "jwt-decode"; function getClaimsFromToken(token) { try { return jwtDecode(token); } catch (error) { console.error('Invalid token:', error); return null; } } export const useAuthStore = defineStore( 'auth', () => { const clientApi = useClient() const router = useRouter() const accessToken = useSessionStorage('auth-accessToken', undefined) const refreshToken = useSessionStorage('auth-refreshToken', undefined) const isAuthenticated = computed(() => !!accessToken.value) const userId = computed(() => { const claims = getClaimsFromToken(accessToken.value) return claims.sub; }) function updateTokens(data) { accessToken.value = data.accessToken refreshToken.value = data.refreshToken } function cleanTokens() { updateTokens({ accessToken: undefined, refreshToken: undefined, }) } async function logout() { cleanTokens() await router.push('/') } async function login(email, password) { try { const response = await clientApi.post( 'api/users/login', { email: email, password: password }) updateTokens(response.data) return true } catch (error) { console.error(error) cleanTokens() return false } } async function loginWithGoogle(accessToken) { try { const response = await clientApi.post( 'api/users/login-with-google', { token: accessToken }) updateTokens(response.data) return true } catch (error) { console.error(error) cleanTokens() return false } } async function refresh() { try { const response = await clientApi.post( 'api/users/refresh', { refreshToken: refreshToken }); updateTokens({ accessToken: response.accessToken, refreshToken: refreshToken }) } catch (error) { console.error(error) cleanTokens() } } return {accessToken, refreshToken, isAuthenticated, userId, login, loginWithGoogle, logout} })