feat(auth): implement login page and state management

This commit is contained in:
2025-06-17 10:00:17 +03:00
parent c4a1c2cde0
commit d6059f4325
5 changed files with 209 additions and 11 deletions

View File

@@ -1,26 +1,53 @@
import { defineStore } from "pinia";
import { ref } from "vue";
import { ref, computed } from "vue";
import { registerUser as apiRegisterUser } from "@/api/auth";
import type { RegisterRequest } from "@/types";
import router from "@/router";
import apiClient from "@/api/axios";
export const useAuthStore = defineStore("auth", () => {
// State
const user = ref<User | null>(null);
const token = ref<string | null>(localStorage.getItem("authToken"));
const isLoading = ref(false);
const error = ref<string | null>(null);
// === Getters ===
const isAuthenticated = computed(() => !!user.value && !!token.value);
// Actions
function setAuthData(userData: User, authToken: string) {
user.value = userData;
token.value = authToken;
localStorage.setItem("authToken", authToken);
apiClient.defaults.headers.common["Authorization"] = `Bearer ${authToken}`;
}
async function handleLogin(credentials: LoginRequest) {
isLoading.value = true;
error.value = null;
try {
const response = await apiLoginUser(credentials);
setAuthData(response.data.user, response.data.token);
await router.push({ name: "home" });
} catch (e: any) {
if (e.response && e.response.data) {
error.value = e.response.data;
} else {
error.value = "Произошла неизвестная ошибка при входе";
}
} finally {
isLoading.value = false;
}
}
async function handleRegister(userData: RegisterRequest) {
isLoading.value = true;
error.value = null;
try {
await apiRegisterUser(userData);
// После успешной регистрации перенаправляем на страницу входа
await router.push({ name: "login" });
// Можно добавить сообщение об успехе ("тост")
// alert('Регистрация прошла успешно! Теперь вы можете войти.');
} catch (e: any) {
// Обрабатываем ошибки от Axios
if (e.response && e.response.data) {
error.value = e.response.data;
} else {
@@ -30,10 +57,26 @@ export const useAuthStore = defineStore("auth", () => {
isLoading.value = false;
}
}
// Функция для выхода
function handleLogout() {
user.value = null;
token.value = null;
localStorage.removeItem("authToken");
delete apiClient.defaults.headers.common["Authorization"];
router.push({ name: "login" });
}
return {
// State
user,
token,
isLoading,
error,
// Getters
isAuthenticated,
// Actions
handleLogin,
handleRegister,
handleLogout,
};
});