import { createFileRoute, useNavigate } from "@tanstack/react-router"; import { useEffect, useState } from "react"; import { toast } from "sonner"; import { Boxes, Eye, EyeOff, KeyRound, Loader2, LogIn, UserPlus } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { criarConta, entrar, obterSessaoAtual, normalizarNome, recuperarSenha } from "@/lib/auth"; export const Route = createFileRoute("/auth")({ head: () => ({ meta: [ { title: "Entrar | Coleta de Caixas" }, { name: "description", content: "Acesse sua conta para registrar o início e o fim das coletas de caixas. Novas contas precisam de aprovação de um administrador.", }, { property: "og:title", content: "Entrar | Coleta de Caixas" }, { property: "og:description", content: "Acesse sua conta para registrar o início e o fim das coletas de caixas. Novas contas precisam de aprovação de um administrador.", }, { property: "og:type", content: "website" }, { name: "twitter:card", content: "summary" }, ], }), component: AuthPage, }); function AuthPage() { const navigate = useNavigate(); const [modo, setModo] = useState<"entrar" | "criar" | "recuperar">("entrar"); const [nome, setNome] = useState(""); const [senha, setSenha] = useState(""); const [confirmarSenha, setConfirmarSenha] = useState(""); const [mostrarSenha, setMostrarSenha] = useState(false); const [carregando, setCarregando] = useState(false); const [verificando, setVerificando] = useState(true); const precisaConfirmarSenha = modo !== "entrar"; useEffect(() => { let cancelado = false; void obterSessaoAtual().then((sessao) => { if (cancelado) return; if (sessao) void navigate({ to: "/coleta", replace: true }); else setVerificando(false); }); return () => { cancelado = true; }; }, [navigate]); async function handleSubmit(e: React.FormEvent) { e.preventDefault(); const usuario = normalizarNome(nome); if (usuario.length < 3 || senha.length < 6) { toast.error("Informe um nome com pelo menos 3 caracteres e senha com 6 ou mais."); return; } if (precisaConfirmarSenha && senha !== confirmarSenha) { toast.error("As senhas digitadas não coincidem."); return; } setCarregando(true); try { if (modo === "criar") { const resultado = await criarConta({ data: { nome: usuario, senha } }); toast.success( resultado.aprovado ? "Conta criada e liberada. Faça login." : "Conta criada! Aguarde a liberação de um administrador.", ); } else if (modo === "recuperar") { await recuperarSenha({ data: { nome: usuario, senha } }); toast.success("Senha redefinida. Aguarde a aprovação de um administrador."); setModo("entrar"); } else { await entrar({ data: { nome: usuario, senha } }); void navigate({ to: "/coleta", replace: true }); } } catch (error) { console.error(error); const msg = (error as { message?: string })?.message ?? ""; toast.error( msg.includes("incorretos") ? "Nome de usuário ou senha incorretos." : msg.includes("não encontrado") ? "Nome de usuário não encontrado." : msg.includes("já existe") ? "Este nome de usuário já existe. Faça login." : "Não foi possível concluir. Tente novamente.", ); } finally { setCarregando(false); } } if (verificando) { return (
{modo === "entrar" ? "Entre com seu nome de usuário e senha." : modo === "criar" ? "Crie sua conta — o acesso é liberado por um administrador." : "Defina uma nova senha. Depois disso, a conta volta para aprovação do administrador."}