@@ -17,12 +17,18 @@ const login = async (credentials: LoginCredentials): Promise<LoginResponse> => {
|
|||||||
return response.data;
|
return response.data;
|
||||||
};
|
};
|
||||||
|
|
||||||
const register = async (data: RegisterData): Promise<LoginResponse> => {
|
const register = async (
|
||||||
const response = await apiClient.post<LoginResponse>("/auth/register", {
|
data: RegisterData,
|
||||||
|
): Promise<Record<string, string>> => {
|
||||||
|
const response = await apiClient.post<Record<string, string>>("/auth/token", {
|
||||||
login: data.login,
|
login: data.login,
|
||||||
password: data.password,
|
password: data.password,
|
||||||
name: data.firstName,
|
name: data.firstName,
|
||||||
last_name: data.lastName,
|
last_name: data.lastName,
|
||||||
|
is_active: data.is_active,
|
||||||
|
permission_admin: data.permission_admin,
|
||||||
|
permission_manage_agent: data.permission_manage_agent,
|
||||||
|
permission_view: data.permission_view,
|
||||||
});
|
});
|
||||||
return response.data;
|
return response.data;
|
||||||
};
|
};
|
||||||
@@ -62,9 +68,10 @@ 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 response = await register(data);
|
await register(data);
|
||||||
const user = mapResponseToUser(response);
|
// После регистрации пользователь не авторизуется автоматически
|
||||||
set({ user, token: response.token, isLoading: false });
|
// Нужно войти через /auth/login
|
||||||
|
set({ isLoading: false });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
set({
|
set({
|
||||||
error:
|
error:
|
||||||
|
|||||||
@@ -8,6 +8,10 @@ export interface RegisterData {
|
|||||||
password: string;
|
password: string;
|
||||||
firstName: string;
|
firstName: string;
|
||||||
lastName: string;
|
lastName: string;
|
||||||
|
is_active?: boolean;
|
||||||
|
permission_admin?: boolean;
|
||||||
|
permission_manage_agent?: boolean;
|
||||||
|
permission_view?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface LoginResponse {
|
export interface LoginResponse {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { useAuthStore } from "@/modules/auth/store/useAuthStore";
|
|||||||
|
|
||||||
export const RegisterPage: React.FC = () => {
|
export const RegisterPage: React.FC = () => {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const { register, isLoading, error, clearError, token } = useAuthStore();
|
const { register, isLoading, error, clearError } = useAuthStore();
|
||||||
const [formData, setFormData] = useState({
|
const [formData, setFormData] = useState({
|
||||||
login: "",
|
login: "",
|
||||||
password: "",
|
password: "",
|
||||||
@@ -14,12 +14,7 @@ export const RegisterPage: React.FC = () => {
|
|||||||
lastName: "",
|
lastName: "",
|
||||||
});
|
});
|
||||||
const [passwordError, setPasswordError] = useState<string | null>(null);
|
const [passwordError, setPasswordError] = useState<string | null>(null);
|
||||||
|
const [successMessage, setSuccessMessage] = useState<string | null>(null);
|
||||||
useEffect(() => {
|
|
||||||
if (token) {
|
|
||||||
navigate("/");
|
|
||||||
}
|
|
||||||
}, [token, navigate]);
|
|
||||||
|
|
||||||
const handleSubmit = async (e: React.FormEvent) => {
|
const handleSubmit = async (e: React.FormEvent) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
@@ -38,7 +33,17 @@ export const RegisterPage: React.FC = () => {
|
|||||||
firstName: formData.firstName,
|
firstName: formData.firstName,
|
||||||
lastName: formData.lastName,
|
lastName: formData.lastName,
|
||||||
});
|
});
|
||||||
navigate("/");
|
setSuccessMessage("Аккаунт успешно создан! Теперь вы можете войти.");
|
||||||
|
setFormData({
|
||||||
|
login: "",
|
||||||
|
password: "",
|
||||||
|
confirmPassword: "",
|
||||||
|
firstName: "",
|
||||||
|
lastName: "",
|
||||||
|
});
|
||||||
|
setTimeout(() => {
|
||||||
|
navigate("/auth");
|
||||||
|
}, 2000);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// Error is handled by store
|
// Error is handled by store
|
||||||
}
|
}
|
||||||
@@ -82,7 +87,10 @@ export const RegisterPage: React.FC = () => {
|
|||||||
className="w-16 h-16 mx-auto mb-4 rounded-full flex items-center justify-center"
|
className="w-16 h-16 mx-auto mb-4 rounded-full flex items-center justify-center"
|
||||||
style={{ backgroundColor: "var(--bg-secondary)" }}
|
style={{ backgroundColor: "var(--bg-secondary)" }}
|
||||||
>
|
>
|
||||||
<FiUserPlus className="w-8 h-8" style={{ color: "var(--accent)" }} />
|
<FiUserPlus
|
||||||
|
className="w-8 h-8"
|
||||||
|
style={{ color: "var(--accent)" }}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<h1
|
<h1
|
||||||
className="text-3xl font-bold mb-2"
|
className="text-3xl font-bold mb-2"
|
||||||
@@ -109,6 +117,20 @@ export const RegisterPage: React.FC = () => {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{/* Success Message */}
|
||||||
|
{successMessage && (
|
||||||
|
<div
|
||||||
|
className="mb-6 p-4 rounded-lg border text-sm"
|
||||||
|
style={{
|
||||||
|
backgroundColor: "var(--success-bg)",
|
||||||
|
borderColor: "var(--success-border)",
|
||||||
|
color: "var(--success-text)",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{successMessage}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
{/* Form */}
|
{/* Form */}
|
||||||
<form onSubmit={handleSubmit} className="space-y-4">
|
<form onSubmit={handleSubmit} className="space-y-4">
|
||||||
{/* Name Fields */}
|
{/* Name Fields */}
|
||||||
@@ -293,8 +315,16 @@ export const RegisterPage: React.FC = () => {
|
|||||||
className="mt-2 text-sm flex items-center gap-1"
|
className="mt-2 text-sm flex items-center gap-1"
|
||||||
style={{ color: "var(--error-text)" }}
|
style={{ color: "var(--error-text)" }}
|
||||||
>
|
>
|
||||||
<svg className="w-4 h-4" fill="currentColor" viewBox="0 0 20 20">
|
<svg
|
||||||
<path fillRule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z" clipRule="evenodd" />
|
className="w-4 h-4"
|
||||||
|
fill="currentColor"
|
||||||
|
viewBox="0 0 20 20"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
fillRule="evenodd"
|
||||||
|
d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z"
|
||||||
|
clipRule="evenodd"
|
||||||
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
{passwordError}
|
{passwordError}
|
||||||
</p>
|
</p>
|
||||||
@@ -311,7 +341,8 @@ export const RegisterPage: React.FC = () => {
|
|||||||
}}
|
}}
|
||||||
onMouseEnter={(e) => {
|
onMouseEnter={(e) => {
|
||||||
if (!isLoading) {
|
if (!isLoading) {
|
||||||
e.currentTarget.style.backgroundColor = "var(--button-primary-hover)";
|
e.currentTarget.style.backgroundColor =
|
||||||
|
"var(--button-primary-hover)";
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
onMouseLeave={(e) => {
|
onMouseLeave={(e) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user