diff --git a/frontend/src/modules/auth/store/useAuthStore.ts b/frontend/src/modules/auth/store/useAuthStore.ts index ed22746..523cea3 100644 --- a/frontend/src/modules/auth/store/useAuthStore.ts +++ b/frontend/src/modules/auth/store/useAuthStore.ts @@ -1,49 +1,41 @@ import { create } from "zustand"; import { persist } from "zustand/middleware"; +import { apiClient } from "@/shared/api/axios.instance"; import type { AuthState, LoginCredentials, RegisterData, User, + LoginResponse, } from "../types/auth.types"; -// Mock API functions - замените на реальные запросы -const mockLogin = async ( - credentials: LoginCredentials, -): Promise<{ user: User; token: string }> => { - // Имитация API запроса - await new Promise((resolve) => setTimeout(resolve, 1000)); - - if (credentials.login === "admin" && credentials.password === "admin") { - return { - user: { - id: "1", - login: credentials.login, - firstName: "Admin", - lastName: "User", - }, - token: "mock-jwt-token", - }; - } - throw new Error("Invalid credentials"); +const login = async (credentials: LoginCredentials): Promise => { + const response = await apiClient.post( + "/auth/login", + credentials, + ); + return response.data; }; -const mockRegister = async ( - data: RegisterData, -): Promise<{ user: User; token: string }> => { - await new Promise((resolve) => setTimeout(resolve, 1000)); - - return { - user: { - id: Date.now().toString(), - login: data.login, - firstName: data.firstName, - lastName: data.lastName, - }, - token: "mock-jwt-token", - }; +const register = async (data: RegisterData): Promise => { + const response = await apiClient.post("/auth/register", { + login: data.login, + password: data.password, + name: data.firstName, + last_name: data.lastName, + }); + return response.data; }; +const mapResponseToUser = (response: LoginResponse): User => ({ + login: response.login, + name: response.name, + last_name: response.last_name, + permission_admin: response.permission_admin, + permission_manage_agent: response.permission_manage_agent, + permission_view: response.permission_view, +}); + export const useAuthStore = create()( persist( (set) => ({ @@ -55,8 +47,9 @@ export const useAuthStore = create()( login: async (credentials: LoginCredentials) => { set({ isLoading: true, error: null }); try { - const { user, token } = await mockLogin(credentials); - set({ user, token, isLoading: false }); + const response = await login(credentials); + const user = mapResponseToUser(response); + set({ user, token: response.token, isLoading: false }); } catch (error) { set({ error: error instanceof Error ? error.message : "Login failed", @@ -69,8 +62,9 @@ export const useAuthStore = create()( register: async (data: RegisterData) => { set({ isLoading: true, error: null }); try { - const { user, token } = await mockRegister(data); - set({ user, token, isLoading: false }); + const response = await register(data); + const user = mapResponseToUser(response); + set({ user, token: response.token, isLoading: false }); } catch (error) { set({ error: diff --git a/frontend/src/modules/auth/types/auth.types.ts b/frontend/src/modules/auth/types/auth.types.ts index 08de1ea..ca4e6d8 100644 --- a/frontend/src/modules/auth/types/auth.types.ts +++ b/frontend/src/modules/auth/types/auth.types.ts @@ -10,11 +10,23 @@ export interface RegisterData { lastName: string; } -export interface User { - id: string; +export interface LoginResponse { + name: string; login: string; - firstName: string; - lastName: string; + last_name: string; + permission_admin: boolean; + permission_manage_agent: boolean; + permission_view: boolean; + token: string; +} + +export interface User { + login: string; + name: string; + last_name: string; + permission_admin: boolean; + permission_manage_agent: boolean; + permission_view: boolean; } export interface AuthState { diff --git a/frontend/src/shared/api/axios.instance.ts b/frontend/src/shared/api/axios.instance.ts index 853ec64..0b72df6 100644 --- a/frontend/src/shared/api/axios.instance.ts +++ b/frontend/src/shared/api/axios.instance.ts @@ -32,6 +32,19 @@ class ApiClient { private setupInterceptors(): void { this.axiosInstance.interceptors.request.use( (config: InternalAxiosRequestConfig): InternalAxiosRequestConfig => { + // Получаем токен из localStorage + const authStorage = localStorage.getItem("auth-storage"); + if (authStorage) { + try { + const parsed = JSON.parse(authStorage); + const token = parsed.state?.token; + if (token) { + config.headers.Authorization = `Bearer ${token}`; + } + } catch (e) { + console.error("[Auth] Failed to parse auth storage:", e); + } + } return config; }, (error: AxiosError): Promise => {