@@ -1,49 +1,41 @@
|
|||||||
import { create } from "zustand";
|
import { create } from "zustand";
|
||||||
import { persist } from "zustand/middleware";
|
import { persist } from "zustand/middleware";
|
||||||
|
import { apiClient } from "@/shared/api/axios.instance";
|
||||||
import type {
|
import type {
|
||||||
AuthState,
|
AuthState,
|
||||||
LoginCredentials,
|
LoginCredentials,
|
||||||
RegisterData,
|
RegisterData,
|
||||||
User,
|
User,
|
||||||
|
LoginResponse,
|
||||||
} from "../types/auth.types";
|
} from "../types/auth.types";
|
||||||
|
|
||||||
// Mock API functions - замените на реальные запросы
|
const login = async (credentials: LoginCredentials): Promise<LoginResponse> => {
|
||||||
const mockLogin = async (
|
const response = await apiClient.post<LoginResponse>(
|
||||||
credentials: LoginCredentials,
|
"/auth/login",
|
||||||
): Promise<{ user: User; token: string }> => {
|
credentials,
|
||||||
// Имитация API запроса
|
);
|
||||||
await new Promise((resolve) => setTimeout(resolve, 1000));
|
return response.data;
|
||||||
|
|
||||||
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 mockRegister = async (
|
const register = async (data: RegisterData): Promise<LoginResponse> => {
|
||||||
data: RegisterData,
|
const response = await apiClient.post<LoginResponse>("/auth/register", {
|
||||||
): Promise<{ user: User; token: string }> => {
|
|
||||||
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
||||||
|
|
||||||
return {
|
|
||||||
user: {
|
|
||||||
id: Date.now().toString(),
|
|
||||||
login: data.login,
|
login: data.login,
|
||||||
firstName: data.firstName,
|
password: data.password,
|
||||||
lastName: data.lastName,
|
name: data.firstName,
|
||||||
},
|
last_name: data.lastName,
|
||||||
token: "mock-jwt-token",
|
});
|
||||||
};
|
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>()(
|
export const useAuthStore = create<AuthState>()(
|
||||||
persist(
|
persist(
|
||||||
(set) => ({
|
(set) => ({
|
||||||
@@ -55,8 +47,9 @@ export const useAuthStore = create<AuthState>()(
|
|||||||
login: async (credentials: LoginCredentials) => {
|
login: async (credentials: LoginCredentials) => {
|
||||||
set({ isLoading: true, error: null });
|
set({ isLoading: true, error: null });
|
||||||
try {
|
try {
|
||||||
const { user, token } = await mockLogin(credentials);
|
const response = await login(credentials);
|
||||||
set({ user, token, isLoading: false });
|
const user = mapResponseToUser(response);
|
||||||
|
set({ user, token: response.token, isLoading: false });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
set({
|
set({
|
||||||
error: error instanceof Error ? error.message : "Login failed",
|
error: error instanceof Error ? error.message : "Login failed",
|
||||||
@@ -69,8 +62,9 @@ export const useAuthStore = create<AuthState>()(
|
|||||||
register: async (data: RegisterData) => {
|
register: async (data: RegisterData) => {
|
||||||
set({ isLoading: true, error: null });
|
set({ isLoading: true, error: null });
|
||||||
try {
|
try {
|
||||||
const { user, token } = await mockRegister(data);
|
const response = await register(data);
|
||||||
set({ user, token, isLoading: false });
|
const user = mapResponseToUser(response);
|
||||||
|
set({ user, token: response.token, isLoading: false });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
set({
|
set({
|
||||||
error:
|
error:
|
||||||
|
|||||||
@@ -10,11 +10,23 @@ export interface RegisterData {
|
|||||||
lastName: string;
|
lastName: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface User {
|
export interface LoginResponse {
|
||||||
id: string;
|
name: string;
|
||||||
login: string;
|
login: string;
|
||||||
firstName: string;
|
last_name: string;
|
||||||
lastName: 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 {
|
export interface AuthState {
|
||||||
|
|||||||
@@ -32,6 +32,19 @@ class ApiClient {
|
|||||||
private setupInterceptors(): void {
|
private setupInterceptors(): void {
|
||||||
this.axiosInstance.interceptors.request.use(
|
this.axiosInstance.interceptors.request.use(
|
||||||
(config: InternalAxiosRequestConfig): InternalAxiosRequestConfig => {
|
(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;
|
return config;
|
||||||
},
|
},
|
||||||
(error: AxiosError): Promise<AxiosError> => {
|
(error: AxiosError): Promise<AxiosError> => {
|
||||||
|
|||||||
Reference in New Issue
Block a user