# Frontend - Photum Formaturas Sistema de gerenciamento FOT (Formatura Operations Tracking) e eventos desenvolvido com React, TypeScript e Vite. ## 📋 Índice - [Tecnologias](#tecnologias) - [Estrutura do Projeto](#estrutura-do-projeto) - [Instalação](#instalação) - [Scripts Disponíveis](#scripts-disponíveis) - [Arquitetura](#arquitetura) - [Componentes](#componentes) - [Páginas](#páginas) - [Novidades e Features](#novidades-e-features) - [Contextos](#contextos) - [Serviços](#serviços) - [Tipos](#tipos) - [Configuração](#configuração) ## 🚀 Tecnologias - **React 19.2.0** - Biblioteca para construção de interfaces - **TypeScript 5.8.2** - Superset JavaScript com tipagem estática - **Vite 6.2.0** - Build tool e dev server de alta performance - **React Router DOM 7.9.6** - Navegação entre páginas - **Mapbox GL 3.16.0** - Mapas interativos - **Google GenAI 1.30.0** - Integração com IA generativa do Google - **Lucide React 0.554.0** - Ícones modernos - **TailwindCSS** - Framework CSS utility-first (via classes inline) ## 📁 Estrutura do Projeto ``` frontend/ ├── components/ # Componentes reutilizáveis │ ├── Button.tsx # Botão customizável │ ├── CourseForm.tsx # Formulário de cadastro FOT │ ├── EventCard.tsx # Card de exibição de eventos │ ├── EventForm.tsx # Formulário de criação/edição de eventos │ ├── EventTable.tsx # Tabela Excel-style (8 colunas) │ ├── EventFiltersBar.tsx # Filtros avançados (FOT, Data, Tipo) │ ├── Input.tsx # Input customizável │ ├── InstitutionForm.tsx # Formulário de instituições │ ├── MapboxMap.tsx # Componente de mapa interativo │ ├── Navbar.tsx # Barra de navegação │ └── ProfessionalForm.tsx # Formulário cadastro profissional │ ├── contexts/ # Context API para gerenciamento de estado │ ├── AuthContext.tsx # Autenticação e usuários │ └── DataContext.tsx # Eventos e instituições │ ├── pages/ # Páginas da aplicação │ ├── Calendar.tsx # Calendário de eventos │ ├── CourseManagement.tsx # Gestão FOT (Turmas) │ ├── Dashboard.tsx # Painel principal (Tabela de eventos) │ ├── Finance.tsx # Gestão financeira │ ├── Home.tsx # Página inicial/landing │ ├── Inspiration.tsx # Galeria de inspirações │ ├── LGPD.tsx # Página de conformidade LGPD │ ├── Login.tsx # Página de login │ ├── PrivacyPolicy.tsx # Política de privacidade │ ├── ProfessionalRegister.tsx # Cadastro profissional │ ├── Register.tsx # Cadastro de novos usuários │ ├── Settings.tsx # Configurações do sistema │ ├── Team.tsx # Gestão de equipe │ ├── TermsOfUse.tsx # Termos de uso │ └── UserApproval.tsx # Aprovação de cadastros (2 tabelas) │ ├── services/ # Serviços externos e APIs │ ├── apiService.ts # API REST do backend Go │ ├── genaiService.ts # Integração com Google GenAI │ ├── mapboxService.ts # Serviços do Mapbox │ └── mockGeoService.ts # Mock para testes de geolocalização │ ├── public/ # Arquivos estáticos ├── App.tsx # Componente raiz da aplicação ├── index.tsx # Ponto de entrada da aplicação ├── types.ts # Definições de tipos TypeScript ├── constants.ts # Constantes da aplicação ├── vite.config.ts # Configuração do Vite ├── tsconfig.json # Configuração do TypeScript └── package.json # Dependências e scripts ``` ## 🔧 Instalação ```bash # Instalar dependências npm install # Configurar variáveis de ambiente cp .env.example .env.local # Editar .env.local com suas credenciais # VITE_MAPBOX_TOKEN=seu_token_aqui # GEMINI_API_KEY=sua_chave_aqui ``` ## 📜 Scripts Disponíveis ```bash # Iniciar servidor de desenvolvimento (porta 3000) npm run dev # Build para produção npm run build # Preview da build de produção npm run preview ``` ## 🏗️ Arquitetura ### Gerenciamento de Estado O projeto utiliza **Context API** do React para gerenciar estado global: - **AuthContext**: Gerencia autenticação, usuários e permissões - **DataContext**: Gerencia eventos, instituições e dados relacionados ### Roteamento Navegação baseada em estados internos controlada pelo componente `App.tsx`, sem uso de React Router para simplicidade. ### Estilização Utiliza **Tailwind CSS** (via classes inline) com tema customizado: - Cores principais: roxo (`brand-purple`) e preto (`brand-black`) - Design responsivo mobile-first - Componentes reutilizáveis estilizados ## 🧩 Componentes ### Button.tsx Botão reutilizável com variantes de estilo e estados de carregamento. ### CourseForm.tsx Modal completo para cadastro e edição de FOTs (turmas) com 10 campos: - FOT ID (5 dígitos, validação numérica) - Empresa (dropdown da API) - Nível Educacional (dropdown da API) - Observações - Instituição (dropdown de universidades da API) - Ano Formatura (dropdown da API) - Cidade e Estado - Gastos Captação e Pré Venda **Features:** - Validação de FOT (apenas números, máximo 5 dígitos) - Carregamento automático de dados ao editar - Integração completa com backend ### EventTable.tsx Tabela Excel-style para exibição de eventos com **8 colunas**: 1. FOT 2. Data 3. Curso 4. Instituição 5. Ano Formatura 6. Empresa 7. Tipo Evento 8. Status 9. Ações (condicional para empresa) **Features:** - Ordenação por todas as colunas - Click na linha abre detalhes - Botão "Aprovar" abre modal de equipe - Design responsivo ### EventFiltersBar.tsx Barra de filtros avançados com **3 filtros**: - **FOT**: Campo de busca numérico (5 dígitos) - **Data**: Seletor de data - **Tipo de Evento**: Dropdown **Features:** - Busca em tempo real - Exibição de filtros ativos - Botão limpar filtros - Grid responsivo (3 colunas) ### EventCard.tsx Card para exibição visual de eventos com informações principais (data, tipo, status). ### EventForm.tsx Formulário completo para criar e editar eventos com validação de campos. **Nova ordem de campos:** 1. Tipo de Evento* (primeiro) 2. Nome do Evento (Opcional) 3. Data e horários 4. Demais campos... ### Input.tsx Input customizado com suporte a diferentes tipos e validação. ### InstitutionForm.tsx Formulário para cadastro e edição de instituições de ensino. ### MapboxMap.tsx Componente de mapa interativo usando Mapbox GL para visualização de localizações. ### Navbar.tsx Barra de navegação responsiva com menu e controle de autenticação. ### ProfessionalForm.tsx Formulário específico para cadastro de profissionais (fotógrafos). **Features:** - Campo "Função Profissional" com dropdown da API - Tratamento de erro quando backend não está rodando - Mensagem: "❌ Erro ao carregar funções. Verifique se o backend está rodando" ## 📄 Páginas ### Home.tsx Landing page com apresentação da empresa, serviços e informações de contato. ### Login.tsx / Register.tsx / ProfessionalRegister.tsx Páginas de autenticação para acesso ao sistema: - **Login**: Autenticação de usuários - **Register**: Cadastro de usuários normais - **ProfessionalRegister**: Cadastro específico para fotógrafos ### Dashboard.tsx (`/painel`) Painel principal com visualização e gerenciamento de eventos. **Features:** - Tabela Excel-style com 8 colunas - Filtros avançados (FOT, Data, Tipo) - Busca por nome - Filtros rápidos (Todos, Ativos, Pendentes) - Click na linha → Detalhes do evento - Página de detalhes com tabela vertical (12 informações) ### CourseManagement.tsx (`/cursos`) Gestão FOT - Cadastro e edição de turmas. **Features:** - Tabela Excel-style com todas as turmas - Botão "Cadastrar Turma" no header - Click na linha para editar - Modal CourseForm integrado - 11 colunas de informações ### UserApproval.tsx (`/aprovacao`) Aprovação de cadastros com **2 tabelas separadas**: **Aba "Usuários Normais":** - Filtra `role !== 'PHOTOGRAPHER'` - Colunas: Nome, Email, Telefone, Data, Status, Ações **Aba "Profissionais":** - Filtra profissionais fotógrafos - Colunas: Nome, Email, Telefone, **Função**, Data, Status, Ações ### Calendar.tsx Visualização de eventos em formato de calendário mensal. ### Team.tsx Gestão da equipe de fotógrafos e colaboradores. ### Finance.tsx Controle financeiro e relatórios de eventos. ### Settings.tsx Configurações do sistema e preferências do usuário. ### Inspiration.tsx Galeria de fotos e inspirações para clientes. ### PrivacyPolicy.tsx / TermsOfUse.tsx / LGPD.tsx Páginas legais e de conformidade. ## 🎯 Novidades e Features ### ✨ Sistema FOT Completo - Cadastro de turmas com 10 campos - Validação de FOT (5 dígitos numéricos) - Integração com API para dropdowns - Edição em modal ### ✨ Dashboard Renovado - Tabela de 8 colunas (FOT, Data, Curso, Instituição, Ano, Empresa, Tipo, Status) - Filtro de busca por FOT - Detalhes do evento em tabela vertical ### ✨ Sistema de Aprovação Dupla - 2 tabelas separadas (Normais e Profissionais) - Aprovação de eventos abre modal de equipe - Workflow completo de aprovação ### ✨ Cadastro Profissional - Formulário específico para fotógrafos - Dropdown de funções da API - Tratamento de erro quando backend offline ### ✨ Filtros Avançados - Busca por FOT (numérico, 5 dígitos) - Filtro por Data - Filtro por Tipo de Evento - Removidos filtros de Estado e Cidade ### ✨ Modal de Evento Reorganizado - "Tipo de Evento" como primeiro campo - "Nome do Evento" como opcional em segundo ## 🔄 Contextos ### AuthContext ```typescript interface AuthContextType { user: User | null; login: (email: string) => Promise; logout: () => void; availableUsers: User[]; // Para demo } ``` **Usuários Mock Disponíveis:** - SuperAdmin: `admin@photum.com` - Business Owner: `empresa@photum.com` - Fotógrafo: `foto@photum.com` - Cliente: `cliente@photum.com` ### DataContext ```typescript interface DataContextType { events: EventData[]; institutions: Institution[]; addEvent: (event: EventData) => void; updateEventStatus: (id: string, status: EventStatus) => void; assignPhotographer: (eventId: string, photographerId: string) => void; getEventsByRole: (userId: string, role: string) => EventData[]; addInstitution: (institution: Institution) => void; updateInstitution: (id: string, institution: Partial) => void; getInstitutionsByUserId: (userId: string) => Institution[]; getInstitutionById: (id: string) => Institution | undefined; } ``` ## 🛠️ Serviços ### genaiService.ts Integração com Google Gemini AI para funcionalidades de IA generativa. ### mapboxService.ts Serviços de mapeamento e geolocalização usando Mapbox API. ### mockGeoService.ts Serviço mock para testes de geolocalização sem consumir API externa. ## 📝 Tipos ### UserRole (Enum) - `SUPERADMIN`: Acesso total ao sistema - `BUSINESS_OWNER`: Proprietário do negócio - `EVENT_OWNER`: Cliente/dono do evento - `PHOTOGRAPHER`: Fotógrafo ### EventStatus (Enum) - `PENDING_APPROVAL`: Aguardando aprovação - `PLANNING`: Em planejamento - `CONFIRMED`: Confirmado - `IN_PROGRESS`: Em execução - `DELIVERED`: Entregue - `ARCHIVED`: Arquivado ### EventType (Enum) - `WEDDING`: Casamento - `CORPORATE`: Corporativo - `BIRTHDAY`: Aniversário - `DEBUTANTE`: Debutante - `OTHER`: Outro ### Interfaces Principais ```typescript interface User { id: string; name: string; email: string; role: UserRole; avatar?: string; institutionId?: string; } interface Institution { id: string; name: string; type: string; cnpj?: string; phone: string; email: string; address?: Address; description?: string; ownerId: string; } interface EventData { id: string; name: string; date: string; time: string; type: EventType; status: EventStatus; address: Address; contacts: Contact[]; checklist: ChecklistItem[]; briefing: string; coverImage: string; ownerId: string; photographerIds: string[]; institutionId?: string; } ``` ## ⚙️ Configuração ### vite.config.ts ```typescript - Porta padrão: 3000 - Host: 0.0.0.0 (acesso externo) - Variáveis de ambiente: GEMINI_API_KEY - Alias: '@' aponta para a raiz do frontend ``` ### Variáveis de Ambiente Crie um arquivo `.env.local`: ```env VITE_MAPBOX_TOKEN=seu_token_mapbox GEMINI_API_KEY=sua_chave_gemini ``` ## 🎨 Design System ### Cores Principais - **brand-purple**: Cor primária da marca - **brand-black**: Cor secundária/texto - Tons de cinza para backgrounds e bordas ### Breakpoints Responsivos - Mobile: < 640px - Tablet: 640px - 1024px - Desktop: > 1024px ## 📱 Funcionalidades - ✅ Autenticação multi-perfil (SuperAdmin, Owner, Photographer, Client) - ✅ CRUD completo de eventos - ✅ Gestão de instituições de ensino - ✅ Calendário visual de eventos - ✅ Mapas interativos com Mapbox - ✅ Sistema de checklists para eventos - ✅ Galeria de inspirações - ✅ Gestão de equipe - ✅ Controle financeiro - ✅ Páginas de conformidade legal (LGPD, Termos, Privacidade) ## 🔒 Segurança - Autenticação baseada em contexto - Validação de permissões por role - Proteção de rotas baseada em autenticação - Conformidade com LGPD ## 🚧 Desenvolvimento O projeto está configurado com: - Hot Module Replacement (HMR) - TypeScript strict mode - Linting automático - Path aliases ## 📞 Suporte Para dúvidas ou problemas: - Email: contato@photum.com.br - Tel: (19) 3405 5024 | (19) 3621 4621 --- **Desenvolvido por Photum Formaturas** © 2025