/* Área de gestão de usuários — RF-UI-01 e RF-USUARIOS-05 a 13 (ESP-0001).
Vive dentro do shell, como `view_patients.jsx`, e não como takeover.
Esconder a navegação não é proteger: a autorização é do backend
(`/api/users` recusa quem não é administrador). A tela apenas evita oferecer
o que seria recusado. */
const PERFIS = [
["administrador", "Administração"],
["editor", "Editoração"],
["operador", "Operação"],
];
const NOME_DO_PERFIL = Object.fromEntries(PERFIS);
const SENHA_MINIMA = 14;
const ERROS_DE_USUARIO = {
email_ja_cadastrado: "Já existe um usuário com este e-mail.",
ultimo_administrador_ativo: null, // a mensagem do backend indica a saída; usar a dele
autorrebaixamento_proibido: null, // idem — a mensagem do backend já orienta a procurar outro administrador
perfil_invalido: "Selecione um perfil válido.",
senha_fraca: `A senha deve ter no mínimo ${SENHA_MINIMA} caracteres.`,
usuario_nao_encontrado: "Usuário não encontrado. Atualize a listagem.",
};
function mensagemDeErro(erro) {
if (!erro) return "";
const especifica = ERROS_DE_USUARIO[erro.code];
if (especifica) return especifica;
return erro.message || "Não foi possível concluir a solicitação.";
}
function UserForm({ usuario, souEu, onSalvar, onCancelar, busy, erro }) {
const novo = !usuario;
const [nome, setNome] = React.useState(usuario ? usuario.nome : "");
const [email, setEmail] = React.useState(usuario ? usuario.email : "");
const [perfil, setPerfil] = React.useState(usuario ? usuario.perfil : "editor");
const [ativo, setAtivo] = React.useState(usuario ? usuario.ativo : true);
const [senha, setSenha] = React.useState("");
const senhaCurta = novo && senha.length > 0 && senha.length < SENHA_MINIMA;
const podeSalvar = nome.trim() && email.trim() && (!novo || senha.length >= SENHA_MINIMA);
const submeter = () => {
if (!podeSalvar || busy) return;
// RF-USUARIOS-13: um administrador nunca rebaixa nem desativa a si mesmo —
// o backend recusa com 403 de todo modo; aqui só evitamos enviar o campo
// que já sabemos que será rejeitado.
const dados = novo
? { nome: nome.trim(), email: email.trim(), perfil, ativo, senha }
: { nome: nome.trim(), email: email.trim(), perfil, ativo };
onSalvar(dados);
};
return (
{erro && {mensagemDeErro(erro)}}
{souEu && (
Perfil e atividade não podem ser alterados por você mesmo — peça a outro administrador.
)}
{novo && (
{/* RF-AUTH-07: o sistema não envia e-mail. A comunicação é externa e
deliberadamente fora do escopo do software. */}
O sistema não envia e-mail. A senha é provisória: o usuário será obrigado
a trocá-la no primeiro acesso.