import { defineStore } from 'pinia' import { ref, computed } from 'vue' import axios from 'axios' const API_BASE_URL = 'https://begushiybashkir.ru/api/v1/auth' export const useAuthStore = defineStore('auth', () => { const user = ref(null) const token = ref(localStorage.getItem('auth_token') || '') const loading = ref(false) const error = ref('') // Computed свойства const isAuthenticated = computed(() => !!token.value && !!user.value) const userFullName = computed(() => { if (!user.value) return '' return `${user.value.firstName} ${user.value.lastName}` }) // Установка токена const setToken = (newToken) => { token.value = newToken localStorage.setItem('auth_token', newToken) // Устанавливаем токен в заголовки axios по умолчанию axios.defaults.headers.common['Authorization'] = `Bearer ${newToken}` } // Очистка токена const clearToken = () => { token.value = '' localStorage.removeItem('auth_token') delete axios.defaults.headers.common['Authorization'] } // Установка пользователя const setUser = (userData) => { user.value = userData } // Очистка пользователя const clearUser = () => { user.value = null } // Регистрация const register = async (userData) => { loading.value = true error.value = '' try { const response = await axios.post(`${API_BASE_URL}/register`, userData) // После успешной регистрации автоматически логинимся const loginResponse = await axios.post(`${API_BASE_URL}/login`, { email: userData.email, password: userData.password }) const { token: authToken, user: userInfo } = loginResponse.data setToken(authToken) setUser(userInfo) return { success: true, data: response.data } } catch (err) { error.value = err.response?.data?.message || 'Ошибка регистрации' return { success: false, error: error.value } } finally { loading.value = false } } // Логин const login = async (credentials) => { loading.value = true error.value = '' try { const response = await axios.post(`${API_BASE_URL}/login`, credentials) const { token: authToken, user: userInfo } = response.data setToken(authToken) setUser(userInfo) return { success: true, data: response.data } } catch (err) { error.value = err.response?.data?.message || 'Ошибка входа' return { success: false, error: error.value } } finally { loading.value = false } } // Выход const logout = async () => { loading.value = true try { await axios.post(`${API_BASE_URL}/logout`, {}, { headers: { 'Authorization': `Bearer ${token.value}` } }) } catch (err) { console.error('Ошибка при выходе:', err) } finally { clearToken() clearUser() loading.value = false } } // Получение профиля const fetchProfile = async () => { loading.value = true error.value = '' try { const response = await axios.get(`${API_BASE_URL}/profile`) setUser(response.data) return { success: true, data: response.data } } catch (err) { error.value = err.response?.data?.message || 'Ошибка загрузки профиля' clearToken() clearUser() return { success: false, error: error.value } } finally { loading.value = false } } // Инициализация при загрузке приложения const initializeAuth = async () => { if (token.value) { // Восстанавливаем заголовок авторизации axios.defaults.headers.common['Authorization'] = `Bearer ${token.value}` // Загружаем данные пользователя await fetchProfile() } } return { // State user, token, loading, error, // Getters isAuthenticated, userFullName, // Actions register, login, logout, fetchProfile, initializeAuth, setToken, clearToken } })