feat: change auth form with register
This commit is contained in:
@@ -3,39 +3,65 @@ import axios from "axios";
|
|||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
|
|
||||||
const AuthForm = () => {
|
const AuthForm = () => {
|
||||||
const [formData, setFormData] = useState({ username: "", password: "" });
|
const [formData, setFormData] = useState({
|
||||||
|
username: "",
|
||||||
|
password: "",
|
||||||
|
first_name: "",
|
||||||
|
last_name: "",
|
||||||
|
phone: "",
|
||||||
|
});
|
||||||
|
const [isLogin, setIsLogin] = useState(true);
|
||||||
|
const [error, setError] = useState(null);
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
const API_BASE = "/api";
|
const API_BASE = "/api";
|
||||||
|
|
||||||
|
const handleChange = (field) => (e) =>
|
||||||
|
setFormData({ ...formData, [field]: e.target.value });
|
||||||
|
|
||||||
|
const doLogin = async (username, password) => {
|
||||||
|
const res = await axios.post(`${API_BASE}/login`, { username, password });
|
||||||
|
const data = res.data;
|
||||||
|
if (data.token) {
|
||||||
|
localStorage.setItem("token", data.token);
|
||||||
|
localStorage.setItem("user", JSON.stringify(data.user));
|
||||||
|
localStorage.removeItem("error");
|
||||||
|
navigate("/");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const handleSubmit = async (e) => {
|
const handleSubmit = async (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
setError("");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const response = await axios.post(`${API_BASE}/login`, formData);
|
if (isLogin) {
|
||||||
const data = response.data;
|
await doLogin(formData.username, formData.password);
|
||||||
|
} else {
|
||||||
if (data.token) {
|
await axios.post(`${API_BASE}/register`, formData);
|
||||||
localStorage.setItem("token", data.token);
|
await doLogin(formData.username, formData.password);
|
||||||
localStorage.setItem("user", JSON.stringify(data.user));
|
|
||||||
localStorage.removeItem("error");
|
|
||||||
navigate("/");
|
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
let errorMessage =
|
setError(
|
||||||
err.response?.data?.error || err.message || "Неверный логин или пароль";
|
err.response?.data?.error ||
|
||||||
const errorLog = {
|
err.message ||
|
||||||
message: errorMessage,
|
(isLogin
|
||||||
};
|
? "Неверный логин или пароль"
|
||||||
localStorage.setItem("error", JSON.stringify(errorLog));
|
: "Не удалось зарегистрироваться"),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const toggleMode = () => {
|
||||||
|
setIsLogin(!isLogin);
|
||||||
|
setError("");
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex min-h-screen items-center justify-center bg-gray-100 px-4">
|
<div className="flex min-h-screen items-center justify-center bg-gray-100 px-4">
|
||||||
<div className="w-full max-w-md space-y-8 rounded-lg bg-white p-10 shadow-md">
|
<div className="w-full max-w-md space-y-8 rounded-lg bg-white p-10 shadow-md">
|
||||||
<h2 className="text-center text-3xl font-bold text-gray-900">
|
<h2 className="text-center text-3xl font-bold text-gray-900">
|
||||||
Вход в FISHFISH
|
{isLogin ? "Вход в FISH FISH" : "Регистрация в FISH FISH"}
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<form className="mt-8 space-y-6" onSubmit={handleSubmit}>
|
<form className="mt-8 space-y-6" onSubmit={handleSubmit}>
|
||||||
@@ -46,9 +72,7 @@ const AuthForm = () => {
|
|||||||
className="relative block w-full rounded-t-md border border-gray-300 px-3 py-2 text-gray-900 focus:border-blue-500 focus:outline-none sm:text-sm"
|
className="relative block w-full rounded-t-md border border-gray-300 px-3 py-2 text-gray-900 focus:border-blue-500 focus:outline-none sm:text-sm"
|
||||||
placeholder="Логин"
|
placeholder="Логин"
|
||||||
value={formData.username}
|
value={formData.username}
|
||||||
onChange={(e) =>
|
onChange={handleChange("username")}
|
||||||
setFormData({ ...formData, username: e.target.value })
|
|
||||||
}
|
|
||||||
/>
|
/>
|
||||||
<input
|
<input
|
||||||
type="password"
|
type="password"
|
||||||
@@ -56,24 +80,57 @@ const AuthForm = () => {
|
|||||||
className="relative block w-full rounded-b-md border border-gray-300 px-3 py-2 text-gray-900 focus:border-blue-500 focus:outline-none sm:text-sm"
|
className="relative block w-full rounded-b-md border border-gray-300 px-3 py-2 text-gray-900 focus:border-blue-500 focus:outline-none sm:text-sm"
|
||||||
placeholder="Пароль"
|
placeholder="Пароль"
|
||||||
value={formData.password}
|
value={formData.password}
|
||||||
onChange={(e) =>
|
onChange={handleChange("password")}
|
||||||
setFormData({ ...formData, password: e.target.value })
|
|
||||||
}
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
{!isLogin && (
|
||||||
|
<>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
required
|
||||||
|
className="relative block w-full rounded-t-md border border-gray-300 px-3 py-2 text-gray-900 focus:border-blue-500 focus:outline-none sm:text-sm"
|
||||||
|
placeholder="Имя"
|
||||||
|
value={formData.first_name}
|
||||||
|
onChange={handleChange("first_name")}
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
required
|
||||||
|
className="relative block w-full rounded-t-md border border-gray-300 px-3 py-2 text-gray-900 focus:border-blue-500 focus:outline-none sm:text-sm"
|
||||||
|
placeholder="Фамилия"
|
||||||
|
value={formData.last_name}
|
||||||
|
onChange={handleChange("last_name")}
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
required
|
||||||
|
className="relative block w-full rounded-t-md border border-gray-300 px-3 py-2 text-gray-900 focus:border-blue-500 focus:outline-none sm:text-sm"
|
||||||
|
placeholder="Номер телефона"
|
||||||
|
value={formData.phone}
|
||||||
|
onChange={handleChange("phone")}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{localStorage.getItem("error") && (
|
{error && <p className="text-center text-sm text-red-600">{error}</p>}
|
||||||
<p className={`text-sm text-red-500`}>
|
|
||||||
{JSON.parse(localStorage.getItem("error"))["message"] || ""}
|
|
||||||
</p>
|
|
||||||
)}
|
|
||||||
|
|
||||||
<button
|
<button
|
||||||
type="submit"
|
type="submit"
|
||||||
className="group relative flex w-full justify-center rounded-md bg-blue-600 px-4 py-2 text-sm font-medium text-white hover:bg-blue-700"
|
className="group relative flex w-full justify-center rounded-md bg-blue-600 px-4 py-2 text-sm font-medium text-white hover:bg-blue-700"
|
||||||
>
|
>
|
||||||
Войти
|
{isLogin ? "Войти" : "Зарегистрироваться"}
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
|
<p className="text-center text-sm text-gray-600">
|
||||||
|
{isLogin ? "Нет аккаунта?" : "Уже есть аккаунт?"}{" "}
|
||||||
|
<span
|
||||||
|
className="cursor-pointer text-blue-600 hover:underline"
|
||||||
|
onClick={toggleMode}
|
||||||
|
>
|
||||||
|
{isLogin ? "Зарегистрироваться" : "Войти"}
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user