Nyavokevin eec6c974c9
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
fix safari
2025-10-03 18:57:04 +03:00

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'],
},
}
);