|
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() |
|
} |
|
} |
|
} |
|
} |
|
}) |