98 lines
2.6 KiB
TypeScript
98 lines
2.6 KiB
TypeScript
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";
|
|
|
|
const login = async (credentials: LoginCredentials): Promise<LoginResponse> => {
|
|
const response = await apiClient.post<LoginResponse>(
|
|
"/auth/login",
|
|
credentials,
|
|
);
|
|
return response.data;
|
|
};
|
|
|
|
const register = async (
|
|
data: RegisterData,
|
|
): Promise<Record<string, string>> => {
|
|
const response = await apiClient.post<Record<string, string>>(
|
|
"/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) => ({
|
|
user: null,
|
|
token: null,
|
|
isLoading: false,
|
|
error: null,
|
|
|
|
login: async (credentials: LoginCredentials) => {
|
|
set({ isLoading: true, error: null });
|
|
try {
|
|
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",
|
|
isLoading: false,
|
|
});
|
|
throw error;
|
|
}
|
|
},
|
|
|
|
register: async (data: RegisterData) => {
|
|
set({ isLoading: true, error: null });
|
|
try {
|
|
await register(data);
|
|
// После регистрации пользователь не авторизуется автоматически
|
|
// Нужно войти через /auth/login
|
|
set({ isLoading: false });
|
|
} catch (error) {
|
|
set({
|
|
error:
|
|
error instanceof Error ? error.message : "Registration failed",
|
|
isLoading: false,
|
|
});
|
|
throw error;
|
|
}
|
|
},
|
|
|
|
logout: () => {
|
|
set({ user: null, token: null, error: null });
|
|
},
|
|
|
|
clearError: () => {
|
|
set({ error: null });
|
|
},
|
|
}),
|
|
{
|
|
name: "auth-storage",
|
|
partialize: (state) => ({ token: state.token, user: state.user }),
|
|
},
|
|
),
|
|
);
|