|
| 1 | +Anotacoes sobre os arquivos do projeto |
| 2 | +Wellington - Desafio Flugo |
| 3 | +--- |
| 4 | + |
| 5 | +Vou descrevendo cada arquivo conforme fui entendendo o que cada um faz. |
| 6 | +Escrevi isso pra me ajudar a explicar na entrevista sem travar. |
| 7 | + |
| 8 | + |
| 9 | +RAIZ DO PROJETO |
| 10 | +--------------- |
| 11 | + |
| 12 | +package.json |
| 13 | + Define todas as dependencias do projeto. As principais sao: |
| 14 | + React 19 (interface), Material UI 7 (componentes visuais prontos), |
| 15 | + Firebase 12 (banco de dados na nuvem), TanStack Query 5 (gerenciar |
| 16 | + requisicoes e cache), React Hook Form (formularios), Zod (validacao). |
| 17 | + Tambem tem os scripts de desenvolvimento, build e testes. |
| 18 | + |
| 19 | +vite.config.ts |
| 20 | + Configuracao do Vite, que e o bundler que compila e serve o projeto. |
| 21 | + Defini um alias "@" apontando pra src/ pra nao ficar com caminho relativo |
| 22 | + feio no import. Tambem configurei o build pra separar os pacotes grandes |
| 23 | + (React, MUI, Firebase) em arquivos diferentes, o que ajuda o browser |
| 24 | + a fazer cache melhor. |
| 25 | + |
| 26 | +vitest.config.ts |
| 27 | + Configuracao do Vitest, que roda os testes unitarios. Usei jsdom como |
| 28 | + ambiente pra simular o browser. Tambem aponta pro arquivo de setup que |
| 29 | + mocka o localStorage. |
| 30 | + |
| 31 | +playwright.config.ts |
| 32 | + Configuracao do Playwright, que roda os testes E2E (de ponta a ponta). |
| 33 | + Timeout de 60 segundos porque as operacoes com Firebase podem demorar. |
| 34 | + Em desenvolvimento sobe o servidor local automaticamente. |
| 35 | + |
| 36 | +firestore.rules |
| 37 | + Regras de seguranca do Firestore. Por enquanto ta aberto (allow all) |
| 38 | + porque o desafio nao pediu autenticacao. Em producao real teria que |
| 39 | + restringir por usuario autenticado. |
| 40 | + |
| 41 | +Dockerfile |
| 42 | + Build em dois estagios: primeiro compila o app com Node 22, depois |
| 43 | + copia o resultado pra uma imagem enxuta do nginx. Isso reduz o tamanho |
| 44 | + final da imagem. |
| 45 | + |
| 46 | +docker-compose.yml |
| 47 | + Sobe o app com Docker sem precisar instalar nada. Aponta as variaveis |
| 48 | + de ambiente e mapeia a porta 8080 do host pra porta 80 do container. |
| 49 | + |
| 50 | +nginx.conf |
| 51 | + Configuracao do nginx dentro do container. Habilita gzip pra comprimir |
| 52 | + os arquivos antes de mandar pro browser, e tem o fallback de HTML5 |
| 53 | + history (index.html pra qualquer rota) que e necessario em SPA. |
| 54 | + Assets estaticos ficam em cache por 1 ano. |
| 55 | + |
| 56 | +.github/workflows/ci.yml |
| 57 | + Pipeline de CI no GitHub Actions. Roda em todo push e PR na main. |
| 58 | + Faz build, roda os testes unitarios, e roda os smoke tests contra |
| 59 | + a URL de producao no Vercel pra garantir que o deploy funcionou. |
| 60 | + |
| 61 | + |
| 62 | +SRC/MAIN.TSX E SRC/APP.TSX |
| 63 | +--------------------------- |
| 64 | + |
| 65 | +main.tsx |
| 66 | + Ponto de entrada do app. Aqui e onde tudo e inicializado junto: |
| 67 | + o React Query (cache de dados), o tema do MUI, o error boundary |
| 68 | + (captura erros), o analytics da Vercel, e o router. Qualquer |
| 69 | + provider que precise envolver o app inteiro fica aqui. |
| 70 | + |
| 71 | +App.tsx |
| 72 | + Layout principal da aplicacao. Define a estrutura visual que aparece |
| 73 | + em todas as paginas: sidebar esquerda, header no topo, breadcrumb |
| 74 | + de navegacao, e o "Outlet" que e onde o React Router renderiza |
| 75 | + a pagina atual. |
| 76 | + |
| 77 | + |
| 78 | +SRC/ROUTES |
| 79 | +---------- |
| 80 | + |
| 81 | +routes/app-router.tsx |
| 82 | + Define as rotas da aplicacao usando React Router v7. Cada pagina |
| 83 | + e carregada de forma lazy (so quando o usuario navega ate ela), |
| 84 | + o que melhora o tempo de carregamento inicial. Rotas: |
| 85 | + / -> lista de colaboradores |
| 86 | + /colaboradores/novo -> formulario de criacao |
| 87 | + /colaboradores/:id/editar -> formulario de edicao |
| 88 | + /debug -> painel de diagnostico (oculto) |
| 89 | + * -> pagina 404 |
| 90 | + |
| 91 | + |
| 92 | +SRC/LIBS |
| 93 | +-------- |
| 94 | + |
| 95 | +libs/firebase.ts |
| 96 | + Inicializa a conexao com o Firebase. Le as variaveis de ambiente |
| 97 | + (VITE_FIREBASE_*) e cria a instancia do Firestore com persistencia |
| 98 | + local habilitada, o que significa que o app funciona mesmo offline |
| 99 | + e sincroniza quando a conexao volta. Exporta o db e um booleano |
| 100 | + isConfigured pra checar se as variaveis estao preenchidas. |
| 101 | + |
| 102 | +libs/mui-theme.ts |
| 103 | + Tema visual do Material UI. Defini o verde como cor primaria pra |
| 104 | + combinar com a identidade da Flugo. Tambem ajustei tipografia e |
| 105 | + alguns detalhes de componentes. |
| 106 | + |
| 107 | +libs/tanstack-query.ts |
| 108 | + Configuracao do React Query. Defini que dados ficam "frescos" por |
| 109 | + 5 minutos antes de buscar de novo, nao refaz requisicao quando a |
| 110 | + janela ganha foco (pra nao spammar o Firebase), e tenta de novo |
| 111 | + 1 vez em caso de erro. |
| 112 | + |
| 113 | + |
| 114 | +SRC/FEATURES/STAFF |
| 115 | +------------------ |
| 116 | + |
| 117 | +features/staff/types.ts |
| 118 | + Define os tipos TypeScript do projeto. O tipo Staff tem: id, name, |
| 119 | + email, department, status (Ativo/Inativo), createdAt, e dois campos |
| 120 | + de controle interno: _pendingSync (true quando ainda nao foi pro |
| 121 | + Firebase) e _localId (identificador temporario no localStorage). |
| 122 | + |
| 123 | +features/staff/validation.ts |
| 124 | + Schema de validacao com Zod. Define as regras de cada campo: |
| 125 | + nome obrigatorio e maximo 80 caracteres, email valido, departamento |
| 126 | + tem que ser um dos valores validos, status tem que ser Ativo ou Inativo. |
| 127 | + Todos os erros sao em portugues. |
| 128 | + |
| 129 | +features/staff/hooks.ts |
| 130 | + Hooks do React Query que conectam os componentes com o servico. |
| 131 | + useStaffs: busca a lista completa com cache |
| 132 | + useCreateStaff: cria colaborador com update otimista (aparece na lista |
| 133 | + antes de confirmar no servidor, e remove automaticamente se der erro) |
| 134 | + useUpdateStaff: atualiza colaborador |
| 135 | + useDeleteStaff: exclui colaborador |
| 136 | + useSyncPending: tenta sincronizar com Firebase os itens que ficaram |
| 137 | + salvos so no localStorage |
| 138 | + |
| 139 | +features/staff/validation.test.ts |
| 140 | + Testes da validacao. Cobre casos como nome vazio, email invalido, |
| 141 | + departamento que nao existe na lista, status errado. |
| 142 | + |
| 143 | + |
| 144 | +SRC/SERVICES |
| 145 | +------------ |
| 146 | + |
| 147 | +services/staffs.ts |
| 148 | + Camada que faz de fato as operacoes no Firebase. Todo acesso ao |
| 149 | + Firestore passa por aqui. Funcoes principais: |
| 150 | + listStaffs: busca todos os colaboradores e mescla com os pendentes |
| 151 | + do localStorage |
| 152 | + createStaff: salva no Firebase; se der erro, salva no localStorage |
| 153 | + pra tentar depois (fallback silencioso) |
| 154 | + updateStaff e deleteStaff: operacoes diretas no Firebase |
| 155 | + syncPendingStaffs: percorre o localStorage e tenta salvar cada |
| 156 | + pendente no Firebase |
| 157 | + logRemoteError: salva erros na colecao app_logs do Firestore |
| 158 | + pra diagnostico remoto |
| 159 | + withTimeout: wrapper que cancela a operacao se demorar mais de 30s |
| 160 | + |
| 161 | +services/local-storage.ts |
| 162 | + Gerencia a chave "flugo_pending_staffs" no localStorage. Funcoes: |
| 163 | + getPendingStaffs: retorna a lista atual |
| 164 | + addPendingStaff: adiciona um item com _pendingSync:true e _localId unico |
| 165 | + removePendingStaffById: remove pelo _localId |
| 166 | + removePendingStaffByEmail: remove pelo email (usado na sincronizacao) |
| 167 | + A deduplicacao por email evita salvar o mesmo colaborador duas vezes. |
| 168 | + |
| 169 | +services/local-storage.test.ts |
| 170 | + Testes do servico de localStorage. Cobre adicionar, remover, deduplicar. |
| 171 | + |
| 172 | + |
| 173 | +SRC/COMPONENTS |
| 174 | +-------------- |
| 175 | + |
| 176 | +components/staff-list.tsx |
| 177 | + Tabela principal que mostra todos os colaboradores. Tem paginacao, |
| 178 | + ordenacao por coluna, e indicador "Pendente" quando o item ainda |
| 179 | + nao foi sincronizado com o Firebase. Filtros e botoes de editar/excluir |
| 180 | + estao no codigo mas ocultos da interface por ora (nao faziam parte |
| 181 | + do escopo original do desafio). |
| 182 | + |
| 183 | +components/staff-form.tsx |
| 184 | + Formulario em dois passos para criar colaborador: |
| 185 | + Passo 1: nome e email (com validacao de email duplicado em tempo real) |
| 186 | + Passo 2: departamento e status |
| 187 | + Salva rascunho no localStorage enquanto o usuario preenche, e limpa |
| 188 | + o rascunho depois que salva com sucesso. O botao de avancar so |
| 189 | + aparece quando o passo atual esta valido. |
| 190 | + |
| 191 | +components/staff-edit-page.tsx |
| 192 | + Pagina de edicao. Carrega o colaborador pelo ID da URL e passa os |
| 193 | + dados para o StaffForm no modo de edicao. |
| 194 | + |
| 195 | +components/breadcrumb.tsx |
| 196 | + Barra de navegacao no topo mostrando onde o usuario esta. Exemplo: |
| 197 | + Colaboradores > Novo Colaborador. Gera os links automaticamente |
| 198 | + baseado na URL atual. |
| 199 | + |
| 200 | +components/sidebar.tsx |
| 201 | + Menu lateral fixo com o logo da Flugo e o link para Colaboradores. |
| 202 | + |
| 203 | +components/header.tsx |
| 204 | + Barra de topo com um avatar no canto direito. |
| 205 | + |
| 206 | +components/not-found.tsx |
| 207 | + Pagina 404 com mensagem simples e link pra voltar pra lista. |
| 208 | + |
| 209 | +components/error-boundary.tsx |
| 210 | + Componente de classe que captura erros do React e mostra uma mensagem |
| 211 | + amigavel ao inves de travar a tela. Tem um botao pra recarregar. |
| 212 | + |
| 213 | +components/delete-confirm-dialog.tsx |
| 214 | + Dialog de confirmacao antes de excluir um colaborador. Mostra o |
| 215 | + nome da pessoa e tem botao cancelar/confirmar. |
| 216 | + |
| 217 | +components/debug-sync.tsx |
| 218 | + Painel de diagnostico oculto na rota /debug. Mostra a config do |
| 219 | + Firebase, lista os pendentes no localStorage, e tem botao pra |
| 220 | + forcar a sincronizacao manualmente. |
| 221 | + |
| 222 | +components/theme-provider.tsx |
| 223 | + Envolve o app com o tema do MUI e o CssBaseline (que aplica um |
| 224 | + reset CSS consistente em todos os browsers). |
| 225 | + |
| 226 | + |
| 227 | +SRC/HOOKS E SRC/HELPERS |
| 228 | +----------------------- |
| 229 | + |
| 230 | +hooks/use-sort-table.ts |
| 231 | + Hook que gerencia o estado de ordenacao da tabela: qual coluna e |
| 232 | + em qual direcao (asc ou desc). Retorna o estado atual e uma funcao |
| 233 | + pra criar handlers de clique por coluna. |
| 234 | + |
| 235 | +hooks/use-sort-table.test.ts |
| 236 | + Testes do hook de ordenacao. |
| 237 | + |
| 238 | +helpers/table-sorting.ts |
| 239 | + Funcao utilitaria que compara dois objetos por um campo especificado, |
| 240 | + usada para ordenar os dados da tabela. |
| 241 | + |
| 242 | +helpers/table-sorting.test.ts |
| 243 | + Testes da funcao de comparacao. |
| 244 | + |
| 245 | + |
| 246 | +SRC/TEST |
| 247 | +-------- |
| 248 | + |
| 249 | +test/setup.ts |
| 250 | + Arquivo que roda antes de cada suite de testes. Cria um mock do |
| 251 | + localStorage do browser, porque o jsdom nao implementa tudo que |
| 252 | + o localStorage real tem. |
| 253 | + |
| 254 | + |
| 255 | +TESTS/ (E2E) |
| 256 | +------------ |
| 257 | + |
| 258 | +tests/e2e/smoke.spec.ts |
| 259 | + Teste que roda em CI. Acessa a URL de producao, confere se a pagina |
| 260 | + carrega, se a tabela aparece, e se o formulario abre. Nao salva |
| 261 | + nada, so verifica que o deploy nao quebrou nada visivel. |
| 262 | + |
| 263 | +tests/e2e/staff.spec.ts (nao roda no CI) |
| 264 | + Testes completos de criacao de colaborador via Playwright. Esses |
| 265 | + nao rodam no CI porque gravam dados reais no Firebase de producao. |
| 266 | + |
| 267 | +tests/e2e/sync-validation.spec.ts (nao roda no CI) |
| 268 | + Testa o fluxo de validacao e sincronizacao offline/online. |
| 269 | + |
| 270 | +tests/e2e/forge-prod-save.spec.ts (nao roda no CI) |
| 271 | + Teste rapido para forcar um salvamento em producao durante o debug. |
0 commit comments