/* Troca obrigatória de senha — RF-AUTH-11 e RF-AUTH-12 (ESP-0001). Abre imediatamente após o login e **não tem caminho de dispensa**: sem `Esc`, sem clique fora, sem "Cancelar". Não é rigor de interface — enquanto a senha estiver provisória, o backend recusa toda requisição com 403 `troca_de_senha_obrigatoria`, de modo que o portal atrás do diálogo não funcionaria de qualquer forma. Depois da troca, o token corrente está morto (RF-AUTH-12): quem chama precisa deslogar e mandar a pessoa entrar de novo com a senha nova. Não basta atualizar o estado em memória. */ function PasswordChangeModal({ onTrocada }) { const [atual, setAtual] = React.useState(""); const [nova, setNova] = React.useState(""); const [repetida, setRepetida] = React.useState(""); const [busy, setBusy] = React.useState(false); const [erro, setErro] = React.useState(null); const curta = nova.length > 0 && nova.length < SENHA_MINIMA; const divergem = repetida.length > 0 && nova !== repetida; const podeTrocar = atual && nova.length >= SENHA_MINIMA && nova === repetida && !busy; const mensagem = () => { if (!erro) return null; if (erro.code === "senha_atual_incorreta") return "A senha atual informada está incorreta."; if (erro.code === "senha_nao_alterada") return "A nova senha deve ser diferente da atual."; if (erro.code === "senha_fraca") return `A senha deve ter no mínimo ${SENHA_MINIMA} caracteres.`; return erro.message || "Não foi possível trocar a senha."; }; const submeter = () => { if (!podeTrocar) return; setBusy(true); setErro(null); window.API.changeOwnPassword(atual, nova) .then(() => { setBusy(false); onTrocada(); }) .catch(problema => { setBusy(false); setErro(problema); }); }; return ( {busy ? "Trocando..." : "Trocar senha e entrar novamente"} } > Ela foi definida por um administrador ou gerada na implantação, e não pode ser usada para operar o portal. Ao trocá-la, você será levado ao login para entrar com a senha nova. {erro && {mensagem()}} ); } Object.assign(window, { PasswordChangeModal });