Files
consumocuidado/stores/auth.ts

90 lines
2.3 KiB
TypeScript

import { defineStore } from 'pinia'
export const useAuthStore = defineStore('auth', {
state: () => ({
access: null as string | null,
refreshTokens: null as string | null,
id: null as number | null,
name: null as string | null,
email: null as string | null,
role: 'ANON' as string,
cookiesAreAccepted: false,
}),
getters: {
isAuthenticated: (state) => !!state.access,
isUser: (state) => state.role === 'SHOP_USER',
isManager: (state) => state.role === 'COOP_MANAGER',
isAdmin: (state) => state.role === 'SITE_ADMIN',
getName: (state) => state.name,
getId: (state) => state.id,
cookiesAccepted: (state) => state.cookiesAreAccepted,
},
actions: {
// Actions to handle authentication (action's migration)
async login(email: string, password: string) {
const config = useRuntimeConfig()
const payload = await $fetch('/token/', {
baseURL: config.public.baseURL,
method: 'POST',
body: { email, password }
})
//console.log('Login payload:', payload)
this.setPayload(payload)
},
async setUser() {
const config = useRuntimeConfig()
const data = await $fetch('/my_user/', {
baseURL: config.public.baseURL,
method: 'GET',
headers: {
Authorization: `Bearer ${this.access}`
}
})
try {
this.setUserData(data)
} catch (error) {
console.error('Error setting user data:', error)
}
},
async refreshAccessToken() {
const config = useRuntimeConfig()
if (!this.refreshTokens) return
const data = await $fetch('/token/refresh/', {
baseURL: config.public.baseURL,
method: 'POST',
body: { refresh: this.refreshTokens }
})
this.setPayload(data)
},
async logout() {
this.$reset()
},
// Mutations migration
acceptCookies() {
this.cookiesAreAccepted = true
},
setUserData(payload: any) {
this.id = payload.id
this.name = payload.full_name
this.email = payload.email
this.role = payload.role
},
setPayload(payload: any) {
this.access = payload.access
if (payload.refresh) {
this.refreshTokens = payload.refresh
}
}
},
persist: true,
}
)