feat(auth): implement login page and state management
This commit is contained in:
@@ -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,
|
||||
};
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user