Skip to content

Commit 4a73059

Browse files
doc: anotacoes de estudo e visao geral do projeto
1 parent b2a3551 commit 4a73059

3 files changed

Lines changed: 709 additions & 0 deletions

File tree

doc/arquivos.txt

Lines changed: 271 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,271 @@
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

Comments
 (0)