56 lines
1.4 KiB
JavaScript
56 lines
1.4 KiB
JavaScript
import { defineStore } from 'pinia'
|
|
import { userService } from '../../services/userService.js'
|
|
|
|
export const useAuthStore = defineStore('auth', {
|
|
state: () => ({
|
|
user: null,
|
|
status: 'idle',
|
|
error: null,
|
|
}),
|
|
getters: {
|
|
isLoggedIn: (state) => !!state.user,
|
|
creditsBalance: (state) => state.user?.creditsBalance ?? 0,
|
|
freeUsed: (state) => state.user?.freeUsed ?? false,
|
|
canConvert: (state) => {
|
|
if (!state.user) return false
|
|
if (!state.user.freeUsed) return true
|
|
return state.user.creditsBalance > 0
|
|
},
|
|
},
|
|
actions: {
|
|
async fetchMe() {
|
|
const user = await userService.getMe()
|
|
this.user = user
|
|
},
|
|
async login(email, password) {
|
|
this.status = 'loading'
|
|
this.error = null
|
|
try {
|
|
this.user = await userService.login(email, password)
|
|
this.status = 'idle'
|
|
} catch (e) {
|
|
this.error = e.message
|
|
this.status = 'error'
|
|
}
|
|
},
|
|
async logout() {
|
|
await userService.logout()
|
|
this.user = null
|
|
},
|
|
async register(email, password, name) {
|
|
this.status = 'loading'
|
|
this.error = null
|
|
try {
|
|
this.user = await userService.register(email, password, name)
|
|
this.status = 'idle'
|
|
} catch (e) {
|
|
this.error = e.message
|
|
this.status = 'error'
|
|
}
|
|
},
|
|
refreshBalance(newBalance) {
|
|
if (this.user) this.user.creditsBalance = newBalance
|
|
},
|
|
},
|
|
})
|