feat: create auth
ci-front / build (push) Successful in 2m1s

This commit is contained in:
2026-04-04 01:43:25 +03:00
parent 57f12f792c
commit 065b5492ef
3 changed files with 60 additions and 41 deletions
+31 -37
View File
@@ -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<LoginResponse> => {
const response = await apiClient.post<LoginResponse>(
"/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<LoginResponse> => {
const response = await apiClient.post<LoginResponse>("/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<AuthState>()(
persist(
(set) => ({
@@ -55,8 +47,9 @@ export const useAuthStore = create<AuthState>()(
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<AuthState>()(
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:
+16 -4
View File
@@ -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 {
+13
View File
@@ -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<AxiosError> => {