import React, { useState, useEffect } from "react"; import { Button } from "./Button"; import { Input } from "./Input"; import { getFunctions } from "../services/apiService"; interface ProfessionalFormProps { onSubmit: (data: ProfessionalData) => void; onCancel: () => void; isLoading?: boolean; } export interface ProfessionalData { nome: string; email: string; senha: string; confirmarSenha: string; avatar?: File | null; funcaoId: string; funcoesIds: string[]; // New cep: string; rua: string; numero: string; complemento: string; bairro: string; cidade: string; uf: string; whatsapp: string; cpfCnpj: string; banco: string; agencia: string; conta: string; pix: string; carroDisponivel: string; possuiEstudio: string; qtdEstudios: string; tipoCartao: string; equipamentos: string; observacao: string; funcaoLabel?: string; regiao: string; // New field } export const ProfessionalForm: React.FC = ({ onSubmit, onCancel, isLoading = false, }) => { const [functions, setFunctions] = useState< Array<{ id: string; nome: string }> >([]); const [isLoadingFunctions, setIsLoadingFunctions] = useState(false); const [functionsError, setFunctionsError] = useState(false); const [isLoadingCep, setIsLoadingCep] = useState(false); const [avatarPreview, setAvatarPreview] = useState(null); const [formData, setFormData] = useState({ nome: "", email: "", senha: "", confirmarSenha: "", avatar: null, funcaoId: "", funcoesIds: [], cep: "", rua: "", numero: "", complemento: "", bairro: "", cidade: "", uf: "", whatsapp: "", cpfCnpj: "", banco: "", agencia: "", conta: "", pix: "", carroDisponivel: "nao", possuiEstudio: "nao", qtdEstudios: "0", tipoCartao: "", equipamentos: "", observacao: "", regiao: "SP", // Default to SP }); useEffect(() => { const loadFunctions = async () => { setIsLoadingFunctions(true); setFunctionsError(false); try { const result = await getFunctions(); if (result.data) { setFunctions(result.data); } else { setFunctionsError(true); } } catch (error) { setFunctionsError(true); } setIsLoadingFunctions(false); }; loadFunctions(); }, []); const handleChange = (field: keyof ProfessionalData, value: string) => { setFormData((prev) => ({ ...prev, [field]: value })); }; const handleAvatarChange = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { setFormData((prev) => ({ ...prev, avatar: file })); // Create preview URL const reader = new FileReader(); reader.onloadend = () => { setAvatarPreview(reader.result as string); }; reader.readAsDataURL(file); } }; const handleCpfBlur = async () => { const cpf = formData.cpfCnpj.replace(/\D/g, ""); if (cpf.length < 11) return; try { const response = await fetch(`${import.meta.env.VITE_API_URL || "http://localhost:8080"}/api/profissionais/check?cpf=${cpf}`); if (response.ok) { const data = await response.json(); if (data.exists) { if (data.claimed) { alert(`O CPF ${cpf} já está cadastrado e possui um usuário associado. Por favor, faça login.`); window.location.href = "/entrar"; } else { alert(`Encontramos um cadastro para o CPF ${cpf} (${data.name}). Continue para criar seu acesso.`); // Optional: Autofill name? setFormData(prev => ({ ...prev, nome: data.name || prev.nome })); } } } } catch (error) { console.error("Erro ao verificar CPF:", error); } }; const handleCepBlur = async () => { const cep = formData.cep.replace(/\D/g, ""); if (cep.length !== 8) return; setIsLoadingCep(true); try { const response = await fetch( `https://viacep.com.br/ws/${cep}/json/` ); if (!response.ok) throw new Error("CEP não encontrado"); const data = await response.json(); if (data.erro) throw new Error("CEP não encontrado"); setFormData((prev) => ({ ...prev, rua: data.logradouro || prev.rua, bairro: data.bairro || prev.bairro, cidade: data.localidade || prev.cidade, uf: data.uf || prev.uf, })); } catch (error) { console.error("Erro ao buscar CEP:", error); // Opcional: mostrar erro para usuário } finally { setIsLoadingCep(false); } }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (isLoading) return; // Validação de foto de perfil if (!formData.avatar) { alert("A foto de perfil é obrigatória!"); return; } // Validação de senha if (formData.senha !== formData.confirmarSenha) { alert("As senhas não coincidem!"); return; } if (formData.senha.length < 6) { alert("A senha deve ter pelo menos 6 caracteres!"); return; } const selectedFunction = functions.find(f => f.id === formData.funcaoId); onSubmit({ ...formData, funcaoLabel: selectedFunction?.nome }); }; const ufs = [ "AC", "AL", "AP", "AM", "BA", "CE", "DF", "ES", "GO", "MA", "MT", "MS", "MG", "PA", "PB", "PR", "PE", "PI", "RJ", "RN", "RS", "RO", "RR", "SC", "SP", "SE", "TO", ]; return (
{/* Logo dentro do card */}
Photum Formaturas
Cadastro de Profissional

Crie sua conta profissional

Já tem uma conta?{" "}

{/* Seleção de Função (Movido para o topo) */}

Função e Região

{/* Region Selector */}

Selecione a região onde você prestará serviços principalmente.

{isLoadingFunctions ? (

Carregando funções...

) : functionsError ? (

❌ Erro ao carregar funções. Verifique se o backend está rodando.

) : (
{functions.map((func) => ( ))}
)}
{/* Informações Pessoais */}

Informações Pessoais

handleChange("nome", e.target.value)} /> {/* Conditional CPF Display */} {(!formData.funcoesIds?.every(id => functions.find(f => f.id === id)?.nome.toLowerCase().includes("pesquisa")) || (formData.funcoesIds?.length === 0)) && (
{ const value = e.target.value.replace(/\D/g, ""); let formatted = ""; if (value.length <= 11) { // CPF: 000.000.000-00 formatted = value.replace( /(\d{3})(\d{3})(\d{3})(\d{0,2})/, "$1.$2.$3-$4" ); } else { // CNPJ: 00.000.000/0000-00 formatted = value .slice(0, 14) .replace( /(\d{2})(\d{3})(\d{3})(\d{4})(\d{0,2})/, "$1.$2.$3/$4-$5" ); } handleChange("cpfCnpj", formatted); }} onBlur={handleCpfBlur} className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#B9CF33] focus:border-transparent" placeholder="000.000.000-00 ou 00.000.000/0000-00" />

Informe seu CPF para verificarmos se você já possui cadastro.

)}
{avatarPreview ? (
Preview
) : (
)}

PNG, JPG ou JPEG até 5MB

handleChange("email", e.target.value)} /> handleChange("senha", e.target.value)} /> handleChange("confirmarSenha", e.target.value)} />
{/* Endereço */} {(!formData.funcoesIds?.every(id => functions.find(f => f.id === id)?.nome.toLowerCase().includes("pesquisa")) || (formData.funcoesIds?.length === 0)) && (

Endereço

{ const value = e.target.value.replace(/\D/g, ""); const formatted = value.replace(/^(\d{5})(\d)/, "$1-$2"); handleChange("cep", formatted); }} onBlur={handleCepBlur} maxLength={9} /> {isLoadingCep && (

Buscando endereço...

)}
handleChange("rua", e.target.value)} />
{ const value = e.target.value.replace(/\D/g, ""); handleChange("numero", value); }} />
handleChange("complemento", e.target.value)} /> handleChange("bairro", e.target.value)} />
handleChange("cidade", e.target.value)} />
)} {/* Contato */}

Contato

handleChange("whatsapp", e.target.value)} mask="phone" />
{/* Dados Bancários */} {(!formData.funcoesIds?.every(id => functions.find(f => f.id === id)?.nome.toLowerCase().includes("pesquisa")) || (formData.funcoesIds?.length === 0)) && ( <>

Dados Bancários

handleChange("banco", e.target.value)} /> { const value = e.target.value.replace(/\D/g, ""); handleChange("agencia", value); }} />
handleChange("conta", e.target.value)} /> handleChange("pix", e.target.value)} />
{/* Informações Profissionais - Resources */}

Informações Profissionais

{formData.possuiEstudio === "sim" && ( handleChange("qtdEstudios", e.target.value)} /> )}