import { useState, useCallback } from "react"; import { useTranslation } from 'react-i18next'; import CloseIcon from "./icons/CloseIcon"; import { useAuthContext } from "../context/AuthContext"; import { API_URL } from "../config/authConstants"; import { saveTokens } from "../api/apiClient"; /** * AuthModal — модальное окно входа и регистрации прямо на странице ленты. * Открывается когда неавторизованный пользователь пытается создать объявление. */ export default function AuthModal({ onClose }) { const { t } = useTranslation(); const [mode, setMode] = useState("login"); // "login" | "register" const { login: saveAuth } = useAuthContext(); return (
{error}
}{t('auth.noAccount')}{" "}
> ); } // ─── Register form (inline modal) ────────────────────────────────────────── function RegisterFormInline({ saveAuth, onClose, onSwitch }) { const { t } = useTranslation(); const [form, setForm] = useState({ name: "", login: "", password: "", password2: "", }); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); const [errors, setErrors] = useState({}); const setField = useCallback((key, val) => { setForm(p => ({ ...p, [key]: val })); setErrors(p => ({ ...p, [key]: "" })); }, []); const validate = () => { const e = {}; if (!form.name.trim()) e.name = t('auth.validateNameRequired'); if (!form.login.trim()) e.login = t('auth.validateLoginRequired'); else if (form.login.length < 3) e.login = t('auth.loginMinChars'); if (form.password.length < 6) e.password = t('auth.validatePasswordMin'); if (form.password !== form.password2) e.password2 = t('auth.validatePasswordMatch'); setErrors(e); return !Object.keys(e).length; }; const handleSubmit = async () => { if (!validate()) return; setLoading(true); setError(""); try { // 1. Регистрация const regRes = await fetch(`${API_URL}/api/v1/auth/register`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ name: form.name, login: form.login, password: form.password, }), }); const regData = await regRes.json(); if (!regRes.ok) throw new Error(regData.message || t('auth.registrationError')); // 2. Автоматический вход после регистрации const loginRes = await fetch(`${API_URL}/api/v1/auth/login`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ login: form.login, password: form.password }), }); if (!loginRes.ok) throw new Error("Аккаунт создан. Войдите вручную."); const { token, refreshToken, user } = await loginRes.json(); saveTokens(token, refreshToken); saveAuth(user, token); onClose(); } catch (err) { setError(err.message); } finally { setLoading(false); } }; return ( <>{errors.name}
}{errors.login}
}{errors.password}
}{errors.password2}
}{error}
}{t('auth.hasAccount')}{" "}
> ); } // ─── Shared submit button ────────────────────────────────────────────────── function SubmitButton({ loading, label, onClick }) { return ( ); }