126 lines
3.4 KiB
TypeScript
126 lines
3.4 KiB
TypeScript
import authService, { type LoginCredentials, type User } from '@/services/authService';
|
|
import { defineStore } from 'pinia';
|
|
import { computed, ref } from 'vue';
|
|
|
|
export const useAuthStore = defineStore(
|
|
'auth',
|
|
() => {
|
|
// State
|
|
const user = ref<User | null>(null);
|
|
const token = ref<string | null>(null);
|
|
const loading = ref(false);
|
|
const error = ref<string | null>(null);
|
|
|
|
// Getters
|
|
const isAuthenticated = computed(() => user.value !== null);
|
|
const currentUser = computed(() => user.value);
|
|
|
|
// Actions
|
|
async function login(credentials: LoginCredentials): Promise<boolean> {
|
|
loading.value = true;
|
|
error.value = null;
|
|
|
|
try {
|
|
const response = await authService.login(credentials);
|
|
user.value = response.user;
|
|
|
|
if (response.token) {
|
|
token.value = response.token;
|
|
}
|
|
|
|
return true;
|
|
} catch (err: any) {
|
|
error.value = err.message || 'Login failed';
|
|
return false;
|
|
} finally {
|
|
loading.value = false;
|
|
}
|
|
}
|
|
|
|
async function logout(): Promise<void> {
|
|
loading.value = true;
|
|
|
|
try {
|
|
await authService.logout();
|
|
} catch (err: any) {
|
|
console.error('Logout error:', err);
|
|
} finally {
|
|
// Clear state regardless of API call result
|
|
user.value = null;
|
|
token.value = null;
|
|
error.value = null;
|
|
loading.value = false;
|
|
}
|
|
}
|
|
|
|
async function checkAuth(): Promise<boolean> {
|
|
if (user.value) {
|
|
return true;
|
|
}
|
|
|
|
loading.value = true;
|
|
|
|
try {
|
|
const currentUser = await authService.getCurrentUser();
|
|
user.value = currentUser;
|
|
return true;
|
|
} catch {
|
|
user.value = null;
|
|
token.value = null;
|
|
return false;
|
|
} finally {
|
|
loading.value = false;
|
|
}
|
|
}
|
|
|
|
async function fetchUser(): Promise<void> {
|
|
loading.value = true;
|
|
error.value = null;
|
|
|
|
try {
|
|
const currentUser = await authService.getCurrentUser();
|
|
user.value = currentUser;
|
|
} catch (err: any) {
|
|
error.value = err.message || 'Failed to fetch user';
|
|
user.value = null;
|
|
token.value = null;
|
|
} finally {
|
|
loading.value = false;
|
|
}
|
|
}
|
|
|
|
function clearError(): void {
|
|
error.value = null;
|
|
}
|
|
|
|
function setUser(userData: User): void {
|
|
user.value = userData;
|
|
}
|
|
|
|
return {
|
|
// State
|
|
user,
|
|
token,
|
|
loading,
|
|
error,
|
|
// Getters
|
|
isAuthenticated,
|
|
currentUser,
|
|
// Actions
|
|
login,
|
|
logout,
|
|
checkAuth,
|
|
fetchUser,
|
|
clearError,
|
|
setUser,
|
|
};
|
|
},
|
|
{
|
|
persist: {
|
|
key: 'auth-storage',
|
|
storage: typeof window !== 'undefined' ? localStorage : undefined,
|
|
paths: ['user', 'token'],
|
|
},
|
|
}
|
|
);
|