CatPtain's picture
Upload 57 files
4db4b63 verified
import { defineStore } from 'pinia'
import api from '@/services'
interface User {
id: string
username: string
role: string
}
interface AuthState {
user: User | null
token: string | null
isAuthenticated: boolean
}
export const useAuthStore = defineStore('auth', {
state: (): AuthState => ({
user: null,
token: localStorage.getItem('pptist_token'),
isAuthenticated: false
}),
getters: {
currentUser: (state) => state.user,
isLoggedIn: (state) => state.isAuthenticated && !!state.token,
userRole: (state) => state.user?.role || 'guest'
},
actions: {
async login(username: string, password: string) {
try {
const response = await api.login(username, password)
this.token = response.token
this.user = response.user
this.isAuthenticated = true
localStorage.setItem('pptist_token', response.token)
localStorage.setItem('pptist_user', JSON.stringify(response.user))
return response
} catch (error) {
this.logout()
throw error
}
},
async verifyToken() {
if (!this.token) {
this.logout()
return false
}
try {
const response = await api.verifyToken()
this.user = response.user
this.isAuthenticated = true
return true
} catch (error) {
this.logout()
return false
}
},
logout() {
this.user = null
this.token = null
this.isAuthenticated = false
localStorage.removeItem('pptist_token')
localStorage.removeItem('pptist_user')
},
async initAuth() {
const savedUser = localStorage.getItem('pptist_user')
if (savedUser && this.token) {
try {
this.user = JSON.parse(savedUser)
await this.verifyToken()
} catch (error) {
this.logout()
}
}
}
}
})