Files
HellreigN/frontend/src/modules/auth/store/useAuthStore.ts
T
nikitaa_ts 69ff617c30
ci-front / build (push) Successful in 2m27s
fix: auth store
2026-04-04 18:20:52 +03:00

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 }),
},
),
);