import React, { useState } from "react"; import { useAuth } from "../contexts/AuthContext"; import { Button } from "../components/Button"; import { UserRole } from "../types"; import { X } from "lucide-react"; import { verifyAccessCode } from "../services/apiService"; interface LoginProps { onNavigate?: (page: string) => void; } export const Login: React.FC = ({ onNavigate }) => { const { login, availableUsers } = useAuth(); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [showPassword, setShowPassword] = useState(false); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(""); // Registration Modal States const [showAccessCodeModal, setShowAccessCodeModal] = useState(false); const [accessCode, setAccessCode] = useState(""); const [showProfessionalPrompt, setShowProfessionalPrompt] = useState(false); const [codeError, setCodeError] = useState(""); // const MOCK_ACCESS_CODE = "PHOTUM2025"; // Removed mock const handleRegisterClick = () => { setShowProfessionalPrompt(true); setAccessCode(""); setCodeError(""); }; const handleVerifyCode = async () => { if (accessCode.trim() === "") { setCodeError("Por favor, digite o código de acesso"); return; } try { const res = await verifyAccessCode(accessCode.toUpperCase()); if (res.data && res.data.valid) { setShowAccessCodeModal(false); window.location.href = "/cadastro"; } else { setCodeError(res.data?.error || "Código de acesso inválido ou expirado"); } } catch (e) { setCodeError("Erro ao verificar código"); } }; const handleProfessionalChoice = (isProfessional: boolean) => { setShowProfessionalPrompt(false); if (isProfessional) { window.location.href = "/cadastro-profissional"; } else { setShowAccessCodeModal(true); } }; const handleLogin = async (e: React.FormEvent) => { e.preventDefault(); setIsLoading(true); setError(""); try { const success = await login(email, password); // If mock login returns true (it doesn't throw), we are good. // If real login throws, we catch it below. if (!success) { // Fallback for mock if it returns false without throwing setError( "Credenciais inválidas, tente novamente ou tente um dos e-mails de demonstração." ); } } catch (err: any) { setError(err.message || "Erro ao realizar login"); } setIsLoading(false); }; const fillCredentials = (userEmail: string) => { setEmail(userEmail); setPassword("123456"); // Dummy password to pass HTML5 validation }; const getRoleLabel = (role: UserRole) => { switch (role) { case UserRole.SUPERADMIN: return "Superadmin"; case UserRole.BUSINESS_OWNER: return "Empresa"; case UserRole.PHOTOGRAPHER: return "Fotógrafo"; case UserRole.EVENT_OWNER: return "Cliente"; default: return role; } }; return (
{/* Logo dentro do card */}
Photum Formaturas
Bem-vindo de volta

Acesse sua conta

Não tem uma conta?{" "}

setEmail(e.target.value)} className="w-full px-2.5 sm:px-3 md:px-4 py-2 sm:py-2.5 md:py-3 text-xs sm:text-sm md:text-base border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:border-transparent transition-all" style={{ focusRing: "2px solid #B9CF33" }} onFocus={(e) => (e.target.style.borderColor = "#B9CF33")} onBlur={(e) => (e.target.style.borderColor = "#d1d5db")} /> {error && ( {error} )}
setPassword(e.target.value)} className="w-full px-2.5 sm:px-3 md:px-4 py-2 sm:py-2.5 md:py-3 text-xs sm:text-sm md:text-base border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:border-transparent transition-all" style={{ focusRing: "2px solid #5A4B81" }} onFocus={(e) => (e.target.style.borderColor = "#5A4B81")} onBlur={(e) => (e.target.style.borderColor = "#d1d5db")} />
{/* Demo Users Quick Select */}

Usuários de Demonstração (Clique para preencher)

{[ { id: "1", name: "Dev Admin", email: "admin@photum.com", role: UserRole.SUPERADMIN }, { id: "2", name: "PHOTUM CEO", email: "empresa@photum.com", role: UserRole.BUSINESS_OWNER }, { id: "3", name: "COLABORADOR PHOTUM", email: "foto@photum.com", role: UserRole.PHOTOGRAPHER }, { id: "4", name: "CLIENTE TESTE", email: "cliente@photum.com", role: UserRole.EVENT_OWNER }, ].map((user) => ( ))}
{/* Modal de Código de Acesso */} { showAccessCodeModal && (
setShowAccessCodeModal(false)} >
e.stopPropagation()} >

Código de Acesso

Digite o código de acesso fornecido pela empresa para continuar com o cadastro.

{ setAccessCode(e.target.value.toUpperCase()); setCodeError(""); }} onKeyPress={(e) => e.key === "Enter" && handleVerifyCode()} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-[#B9CF33] focus:border-transparent uppercase" placeholder="Digite o código" autoFocus /> {codeError && (

{codeError}

)}

Atenção: O código de acesso é fornecido pela empresa e tem validade temporária.

) } {/* Modal de Escolha de Tipo de Cadastro */} { showProfessionalPrompt && (
setShowProfessionalPrompt(false)} >
e.stopPropagation()} >

Tipo de Cadastro

Você é um profissional (fotógrafo/cinegrafista) ou um cliente?

) }
); };