/* profile.jsx — Configurações (perfil e senha) via API. */ function SettingsModal({ user, initialTab, onClose, onSave, pushToast }) { const { Ic, FX } = window; const [tab, setTab] = React.useState(initialTab || "perfil"); const [name, setName] = React.useState(user.name || ""); const [roleTitle, setRoleTitle] = React.useState(user.role_title || ""); const [email, setEmail] = React.useState(user.email || ""); const [avatar, setAvatar] = React.useState(user.avatar || null); const [cur, setCur] = React.useState(""); const [pw, setPw] = React.useState(""); const [pw2, setPw2] = React.useState(""); const [err, setErr] = React.useState(""); const [busy, setBusy] = React.useState(false); const fileRef = React.useRef(null); const initials = (name || "U").trim().split(/\s+/).map(w => w[0]).slice(0, 2).join("").toUpperCase(); const pickFile = () => fileRef.current && fileRef.current.click(); const onFile = (e) => { const f = e.target.files && e.target.files[0]; if (!f) return; if (!f.type.startsWith("image/")) { pushToast("⚠️", "Selecione uma imagem"); return; } if (f.size > 200 * 1024) { pushToast("⚠️", "Imagem grande demais (máx 200 KB)"); return; } const reader = new FileReader(); reader.onload = () => { setAvatar(reader.result); FX.sfx.play("click"); }; reader.readAsDataURL(f); }; const saveProfile = async () => { setErr(""); if (!name.trim()) { setErr("O nome não pode ficar vazio."); return; } setBusy(true); try { const res = await window.Api.users.update(user.id, { name: name.trim(), role_title: roleTitle.trim() || "Membro", avatar, }); onSave(res.user); pushToast("✅", "Perfil atualizado!"); onClose(); } catch (e) { setErr(e.message); } finally { setBusy(false); } }; const saveEmail = async () => { setErr(""); setBusy(true); try { const res = await window.Api.users.update(user.id, { email: email.trim() }); onSave(res.user); pushToast("✅", "E-mail salvo!"); onClose(); } catch (e) { setErr(e.message); } finally { setBusy(false); } }; const savePassword = async () => { setErr(""); if (!cur) { setErr("Informe a senha atual."); return; } if (pw.length < 12) { setErr("A nova senha precisa de ao menos 12 caracteres."); return; } if (pw !== pw2) { setErr("As senhas não coincidem."); return; } setBusy(true); try { await window.Api.users.update(user.id, { password: pw, current_password: cur }); pushToast("🔒", "Senha alterada!"); setCur(""); setPw(""); setPw2(""); onClose(); } catch (e) { setErr(e.message); } finally { setBusy(false); } }; return (
Gerencie seu perfil e sua conta.
PNG, JPG ou WEBP — máx 200 KB, recomendado quadrado.
{err}
}{err}
}