Files
tier-maker/frontend/src/stores/auth.js

63 lines
1.6 KiB
JavaScript

import { defineStore } from 'pinia'
import { api } from '../lib/api'
let refreshPromise = null
export const useAuthStore = defineStore('auth', {
state: () => ({
user: null,
status: 'idle',
hydrated: false,
}),
actions: {
async refresh() {
if (refreshPromise) return refreshPromise
this.status = 'loading'
refreshPromise = (async () => {
try {
const data = await api.me()
this.user = data.user
return this.user
} catch (error) {
this.user = null
return null
} finally {
this.status = 'idle'
this.hydrated = true
refreshPromise = null
}
})()
return refreshPromise
},
async signup(email, nickname, password) {
const data = await api.signup({ email, nickname, password })
this.user = data?.user || null
this.hydrated = true
return data
},
async login(email, password) {
const data = await api.login({ email, password })
this.user = data?.user || null
this.hydrated = true
return data?.user || null
},
async verifyEmail(token) {
const data = await api.verifyEmail({ token })
this.user = data?.user || null
this.hydrated = true
return this.user
},
async confirmPasswordReset(token, password) {
const data = await api.confirmPasswordReset({ token, password })
this.user = data?.user || null
this.hydrated = true
return this.user
},
async logout() {
await api.logout()
this.user = null
this.hydrated = true
},
},
})