photum/frontend/services/apiService.ts
João Vitor 3178207353 feat: Sistema completo de Gestão FOT e melhorias no dashboard
- Sistema FOT (Formatura Operations Tracking):
  * Tela de Gestão FOT (/cursos) com tabela Excel-style
  * Modal CourseForm com 10 campos (FOT, Empresa, Instituição, etc)
  * Validação de FOT (5 dígitos numéricos)
  * Edição de turmas ao clicar na linha
  * Integração com API backend (empresas, níveis educacionais, universidades)

- Dashboard renovado (/painel):
  * Tabela com 8 colunas (FOT, Data, Curso, Instituição, Ano, Empresa, Tipo, Status)
  * Filtros avançados: FOT (busca numérica), Data, Tipo de Evento
  * Removidos filtros de Estado e Cidade
  * Página de detalhes com tabela vertical (12 informações)
  * Botão Aprovar redireciona para modal de equipe

- Sistema de Aprovação Dupla (/aprovacao):
  * 2 tabelas separadas por abas (Usuários Normais e Profissionais)
  * Coluna Universidade renomeada para Empresa
  * Coluna Função nos profissionais
  * Workflow de aprovação com atribuição de equipe

- Cadastro Profissional (/cadastro-profissional):
  * Formulário específico para fotógrafos
  * Dropdown de Função Profissional da API
  * Tratamento de erro quando backend offline

- Modal de Criar Evento:
  * Tipo de Evento como primeiro campo
  * Nome do Evento (Opcional) como segundo campo

- Componentes novos:
  * EventTable.tsx - Tabela de eventos com ordenação
  * EventFiltersBar.tsx - Filtros avançados (3 filtros)
  * CourseForm.tsx - Formulário FOT completo
  * ProfessionalForm.tsx - Cadastro profissional

- API Service:
  * Integração com backend Go
  * Endpoints: /api/empresas, /api/funcoes, /api/niveis-educacionais, /api/universidades, /graduation-years

- Documentação:
  * README.md principal atualizado
  * frontend/README.md atualizado
  * Documentação completa de componentes e features
2025-12-11 16:02:39 -03:00

156 lines
3.1 KiB
TypeScript

// Serviço para comunicação com o backend
const API_BASE_URL =
import.meta.env.VITE_API_URL || "http://localhost:3000/api";
interface ApiResponse<T> {
data: T | null;
error: string | null;
isBackendDown: boolean;
}
// Função auxiliar para fazer requisições
async function fetchFromBackend<T>(endpoint: string): Promise<ApiResponse<T>> {
try {
const response = await fetch(`${API_BASE_URL}${endpoint}`, {
method: "GET",
headers: {
"Content-Type": "application/json",
},
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
return {
data,
error: null,
isBackendDown: false,
};
} catch (error) {
console.error(`Error fetching ${endpoint}:`, error);
return {
data: null,
error: error instanceof Error ? error.message : "Erro desconhecido",
isBackendDown: true,
};
}
}
// Funções específicas para cada endpoint
/**
* Busca as funções profissionais disponíveis
*/
export async function getProfessionalRoles(): Promise<ApiResponse<string[]>> {
return fetchFromBackend<string[]>("/professional-roles");
}
/**
* Busca as empresas disponíveis
*/
export async function getCompanies(): Promise<
ApiResponse<
Array<{
id: string;
nome: string;
}>
>
> {
return fetchFromBackend("/api/empresas");
}
/**
* Busca as funções profissionais disponíveis do backend
*/
export async function getFunctions(): Promise<
ApiResponse<
Array<{
id: string;
nome: string;
}>
>
> {
return fetchFromBackend("/api/funcoes");
}
export interface EventTypeResponse {
id: string;
nome: string;
precos: any[];
}
/**
* Busca os tipos de eventos disponíveis
*/
export async function getEventTypes(): Promise<
ApiResponse<EventTypeResponse[]>
> {
return fetchFromBackend<EventTypeResponse[]>("/api/tipos-eventos");
}
/**
* Busca os cursos/turmas disponíveis
*/
export async function getCourses(): Promise<
ApiResponse<
Array<{
id: string;
name: string;
institution: string;
year: number;
}>
>
> {
return fetchFromBackend("/courses");
}
/**
* Busca as instituições/empresas disponíveis
*/
export async function getInstitutions(): Promise<
ApiResponse<
Array<{
id: string;
name: string;
}>
>
> {
return fetchFromBackend("/institutions");
}
/**
* Busca os anos de formatura disponíveis
*/
export async function getGraduationYears(): Promise<ApiResponse<number[]>> {
return fetchFromBackend<number[]>("/graduation-years");
}
/**
* Busca os níveis educacionais disponíveis (EF I / EF II)
*/
export async function getEducationLevels(): Promise<
ApiResponse<
Array<{
id: string;
nome: string;
}>
>
> {
return fetchFromBackend("/api/niveis-educacionais");
}
/**
* Busca as universidades cadastradas
*/
export async function getUniversities(): Promise<
ApiResponse<
Array<{
id: string;
nome: string;
}>
>
> {
return fetchFromBackend("/api/universidades");
}