// auth.jsx — вход / регистрация ("впиши имя в книгу") function Auth({ mode = "register", onMode, onDone, onBack }) { const isReg = mode === "register"; const [name, setName] = React.useState(""); const [email, setEmail] = React.useState(""); const [pass, setPass] = React.useState(""); const [error, setError] = React.useState(""); const [busy, setBusy] = React.useState(false); const ready = isReg ? (name.trim() && email.trim() && pass.length >= 8) : (email.trim() && pass.trim()); async function submit(e) { e.preventDefault(); if (!ready || busy) return; setBusy(true); setError(""); try { const res = isReg ? await window.AzothApi.register({ displayName: name.trim(), email: email.trim(), password: pass }) : await window.AzothApi.login({ email: email.trim(), password: pass }); window.AzothApi.setToken(res.token); onDone({ id: res.user.id, name: res.user.display_name || name.trim() || "мандрівник", email: res.user.email, isNew: isReg, disciplines: ["free", "tarot", "numero"], }); } catch (err) { const msg = String(err.message || err); setError(msg.includes("already registered") ? "Ця адреса вже вписана. Спробуй увійти." : msg.includes("Invalid email or password") ? "Ключ не збігся з іменем. Перевір адресу й таємне слово." : msg); } finally { setBusy(false); } } return (

{isReg ? "Замкни коло" : "Переступи поріг"}

{isReg ? "Кілька слів — і завіса прочиниться вперше." : "З поверненням. Назви ключ, що ти лишив."}

{isReg && (
setName(e.target.value)} placeholder="ім'я, що носиш у колі" autoFocus />
)}
setEmail(e.target.value)} autoComplete="email" placeholder="твоя адреса у світі живих" />
setPass(e.target.value)} autoComplete={isReg ? "new-password" : "current-password"} placeholder="••••••••" />
{error &&
{error}
}

Переступаючи поріг, ти погоджуєшся споглядати з розумом і мірою.

); } Object.assign(window, { Auth });