import React, { useState, useEffect } from "react"; import { Course, Institution } from "../types"; import { Input, Select } from "./Input"; import { Button } from "./Button"; import { GraduationCap, X, Check, AlertCircle, AlertTriangle, } from "lucide-react"; import { getInstitutions, getGraduationYears, getCompanies, getEducationLevels, getUniversities, } from "../services/apiService"; interface CourseFormProps { onCancel: () => void; onSubmit: (data: Partial) => void; initialData?: Course; userId: string; institutions: Institution[]; } 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", ]; export const CourseForm: React.FC = ({ onCancel, onSubmit, initialData, userId, institutions, }) => { const currentYear = new Date().getFullYear(); const [formData, setFormData] = useState>( initialData || { name: "", institutionId: "", year: currentYear, semester: 1, graduationType: "", createdAt: new Date().toISOString(), createdBy: userId, isActive: true, } ); // Novos campos const [fotId, setFotId] = useState(""); const [empresaId, setEmpresaId] = useState(""); const [educationLevel, setEducationLevel] = useState(""); const [observacoes, setObservacoes] = useState(""); const [instituicao, setInstituicao] = useState(""); const [anoFormatura, setAnoFormatura] = useState(currentYear.toString()); const [cidade, setCidade] = useState(""); const [estado, setEstado] = useState(""); const [gastosCaptacao, setGastosCaptacao] = useState(""); const [preVenda, setPreVenda] = useState("nao"); const [showToast, setShowToast] = useState(false); const [error, setError] = useState(""); const [companies, setCompanies] = useState< Array<{ id: string; nome: string }> >([]); const [educationLevels, setEducationLevels] = useState< Array<{ id: string; nome: string }> >([]); const [universities, setUniversities] = useState< Array<{ id: string; nome: string }> >([]); const [graduationYears, setGraduationYears] = useState([]); const [isBackendDown, setIsBackendDown] = useState(false); const [isLoadingData, setIsLoadingData] = useState(true); // Buscar dados do backend useEffect(() => { const fetchBackendData = async () => { setIsLoadingData(true); const [ companiesResponse, yearsResponse, levelsResponse, universitiesResponse, ] = await Promise.all([ getCompanies(), getGraduationYears(), getEducationLevels(), getUniversities(), ]); if ( companiesResponse.isBackendDown || yearsResponse.isBackendDown || levelsResponse.isBackendDown || universitiesResponse.isBackendDown ) { setIsBackendDown(true); } else { setIsBackendDown(false); if (companiesResponse.data) { setCompanies(companiesResponse.data); } if (yearsResponse.data) { setGraduationYears(yearsResponse.data); } if (levelsResponse.data) { setEducationLevels(levelsResponse.data); } if (universitiesResponse.data) { setUniversities(universitiesResponse.data); } } setIsLoadingData(false); }; fetchBackendData(); }, []); // Popular campos quando estiver editando useEffect(() => { if (initialData) { setFotId((initialData as any).fotId || ""); setEmpresaId((initialData as any).empresaId || ""); setEducationLevel((initialData as any).educationLevel || ""); setObservacoes((initialData as any).observacoes || ""); setInstituicao((initialData as any).instituicaoId || ""); setAnoFormatura( (initialData as any).anoFormatura?.toString() || currentYear.toString() ); setCidade((initialData as any).cidade || ""); setEstado((initialData as any).estado || ""); setGastosCaptacao((initialData as any).gastosCaptacao || ""); setPreVenda((initialData as any).preVenda || "nao"); } }, [initialData]); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); // Validações if (!fotId || fotId.trim().length < 1) { setError("FOT é obrigatório"); return; } if (!empresaId) { setError("Selecione uma empresa"); return; } if (!educationLevel) { setError("Selecione o nível (EF I / EF II)"); return; } if (!instituicao) { setError("Selecione uma instituição"); return; } if (!anoFormatura) { setError("Selecione o ano de formatura"); return; } if (!cidade || cidade.trim().length < 2) { setError("Cidade é obrigatória"); return; } if (!estado) { setError("Selecione um estado"); return; } // Montar objeto de dados com os novos campos const submitData = { ...formData, fotId, empresaId, educationLevel, observacoes, instituicao, anoFormatura: parseInt(anoFormatura), cidade, estado, gastosCaptacao, preVenda, }; setShowToast(true); setTimeout(() => { onSubmit(submitData); }, 1000); }; const formatCurrency = (value: string) => { // Remove tudo que não for número const numbers = value.replace(/\D/g, ""); // Converte para número e formata const amount = parseFloat(numbers) / 100; return amount.toLocaleString("pt-BR", { style: "currency", currency: "BRL", }); }; const handleGastosCaptacaoChange = (value: string) => { if (value === "") { setGastosCaptacao(""); return; } setGastosCaptacao(formatCurrency(value)); }; return (
{/* Success Toast */} {showToast && (

Sucesso!

Curso cadastrado com sucesso.

)} {/* Form Header */}

{initialData ? "Editar Turma FOT" : "Cadastrar Turma FOT"}

Registre as informações da turma FOT

{/* Erro global */} {error && (

{error}

)} {/* Informações da Turma FOT */}

Informações da Turma FOT

{/* FOT ID */}
{ const value = e.target.value.replace(/\D/g, "").slice(0, 5); setFotId(value); setError(""); }} className="w-full px-4 py-3 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-brand-gold" placeholder="Digite o identificador FOT" maxLength={5} />
{/* Empresa */}
{isBackendDown && (
Backend não está rodando. Não é possível carregar empresas.
)} {isLoadingData && !isBackendDown && (
Carregando empresas...
)}
{/* EF I / EF II */}
{isBackendDown && (
Backend não está rodando. Não é possível carregar níveis.
)} {isLoadingData && !isBackendDown && (
Carregando níveis...
)}
{/* Observações */}