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(null); const token = ref(null); const loading = ref(false); const error = ref(null); // Getters const isAuthenticated = computed(() => user.value !== null); const currentUser = computed(() => user.value); // Actions async function login(credentials: LoginCredentials): Promise { 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 { 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 { 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 { 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'], }, } );