Auditoria: Code Splitting e Reestruturação
Status: 🟡 Parcialmente Resolvida — Fase A ✅ concluída (2026-04-09), Fases B-E pendentes
Data: 2026-04-08
Tipo: Auditoria de manutenibilidade e performance de contexto AI
Metodologia
Varredura completa de src/components/, src/hooks/, src/lib/, supabase/functions/ e supabase/functions/_shared/. Critérios:
- Linhas > 400 em arquivo único (candidato a split)
- Funções/helpers duplicados entre arquivos
- Código morto (exportado mas nunca importado)
- Hook > 500 linhas (candidato a split)
- Edge Function com > 10 actions (candidato a extrair handlers)
TIER 1 — Monólitos Críticos (>1000 linhas, impacto alto)
| # | Arquivo | Linhas | Estrutura | Recomendação |
|---|---|---|---|---|
| 1 | alunos-escola.tsx | 3486 | 7 componentes internos (TabAlunos, TabTurmas, TabResponsaveis, AlunoForm, ResponsavelForm, TabImportacao, BarraLimiteAlunos) + orquestrador | Split urgente → diretório src/components/alunos-escola/ com 7 arquivos |
| 2 | olimpiada-detalhes-especialista.tsx | 2786 | 1 componente com 5 TabsContent (informacoes, fases, cronograma, inscricao, links) — cada tab 300-600 linhas | Split → diretório com 5 tab-components + orquestrador + helpers |
| 3 | importacao-alunos/index.tsx | 2303 | 1 componente monolítico (diretório existe mas index absorveu tudo) | Split → extrair steps do wizard em componentes separados |
| 4 | admin-escola-detalhes.tsx | 1756 | 1 componente com 5 TabsContent (dados, endereco, usuarios, planos, faturas) | Split → diretório com 5 tabs + orquestrador |
| 5 | olimpiadas.tsx | 1643 | 6 componentes internos (ordenarSeries, SeriesTooltip, NiveisTooltip, FaseLinhaLeitura, FasesDetalhesBlock, FasesNiveisCard, Olimpiadas) | Split → diretório olimpiadas/ com helpers + subcomponentes |
| 6 | admin-assinaturas.tsx | 1357 | 1 componente com tabs | Split → diretório |
| 7 | turmas.tsx | 1309 | 1 componente | Split → integrar ao diretório turmas/ existente |
| 8 | usuarios-escola.tsx | 1225 | 1 componente com inline modal | Split → diretório |
| 9 | admin-escolas.tsx | 1211 | 2 componentes (EscolaCardItem + AdminEscolas) + hook inline useDebounceValue | Split + extrair useDebounceValue para src/hooks/ |
| 10 | admin-incidentes.tsx | 1130 | 10 componentes internos | Split → diretório com subcomponentes |
| 11 | login-unified.tsx | 1122 | 1 componente monolítico | Split → steps (identificação, OTP, seleção de perfil) |
| 12 | admin-cron-monitor.tsx | 1084 | 1 componente + helper inline | Split → diretório |
| 13 | configuracoes-sistema-especialista.tsx | 1023 | 1 componente | Split → seções de configuração |
TIER 2 — Arquivos Grandes (600-1000 linhas)
| Arquivo | Linhas | Recomendação |
|---|---|---|
admin-faturas.tsx | 987 | Split → diretório (lista + modal edição + filtros) |
banners-especialista.tsx | 983 | Split → lista + formulário + preview |
gerador-cartoes.tsx | 922 | Split → config + preview + geração |
dashboard-trial.tsx | 907 | Split → seções (calendário, eventos, stats) |
tutoriais-especialista.tsx | 880 | Split → lista + editor |
admin-usuarios.tsx | 866 | Split → lista + modal CRUD |
videos-clean.tsx | 857 | Split → lista + player + upload |
controle-aplicacoes.tsx | 828 | Split → lista + detalhes |
pagamentos-escola.tsx | 791 | Split → faturas + histórico |
leitor-cartoes.tsx | 777 | Split → scanner + resultados |
gerenciar-videos-curso.tsx | 771 | Split → lista + editor |
admin-feature-flags.tsx | 709 | Split → lista + detalhes + canary |
header-novidades-especialista.tsx | 664 | Split → lista + editor |
resultados-lista.tsx | 747 | Split → tabela + filtros + ações |
TIER 3 — Hooks Grandes
| Hook | Linhas | Recomendação |
|---|---|---|
useMuralPortal.ts | 752 | Split urgente — 33 hooks/effects. Separar em useMuralPortalAuth, useMuralPortalData, useMuralPortalNavigation |
useOlimpiadasData.ts | 552 | Extrair tipos/constantes para olimpiadas-types.ts |
useGestaoResultados.ts | 480 | Manter (coeso, RQ) |
useOlimpiadasCoordenador.ts | 454 | Manter (coeso, RQ) |
TIER 4 — Edge Functions Grandes
| Edge Function | Linhas | Actions | Recomendação |
|---|---|---|---|
admin-assinaturas | 1646 | 12 | Extrair handlers para _shared/assinaturas-handlers.ts |
mural-escola | 1499 | 16 | Split urgente — Extrair para _shared/mural-handlers.ts |
gestao-usuarios-escola | 1341 | 12 | Pode extrair mais handlers |
faturamento-cron | 1249 | 1 | Monolítico por natureza (cron), manter |
admin-cron-monitor | 1020 | 9 | Extrair handlers |
maintenance-cron | 1017 | — | Cron, manter |
diretor-dashboard | 1008 | 5 | Extrair para _shared/diretor-queries.ts |
TIER 5 — Código Morto ✅ Resolvido (2026-04-09)
| Arquivo | Linhas | Status |
|---|---|---|
controle-aplicacoes-novo.tsx | 606 | ✅ Deletado |
student-view.tsx | 56 | ✅ Deletado |
src/Index.tsx | 7 | ✅ Deletado |
login.tsx | 486 | ✅ Deletado |
Total removido: 1155 linhas
TIER 6 — Duplicação de Código
6.1 formatarDataHora — duplicada em 2 arquivos
src/components/admin-cron-monitor.tsx:158 (definida inline)
src/components/admin-incidentes.tsx:110 (definida inline)Ação: Extrair para src/lib/date-helpers.ts e importar em ambos.
6.2 toLocaleDateString('pt-BR') inline — 30+ ocorrências
Espalhado em 18 arquivos. Já existe formatarDataPtBR em role-helpers.ts mas não é usada consistentemente.
Ação: Criar src/lib/date-helpers.ts com formatarDataPtBR, formatarDataHoraPtBR, formatarDataCurta e migrar gradualmente.
6.3 useDebounceValue — definida inline
src/components/admin-escolas.tsx:38Ação: Extrair para src/hooks/useDebounceValue.ts (hook reutilizável).
Priorização Recomendada
Fase A — Quick wins ✅ Concluída (2026-04-09)
Deletar✅controle-aplicacoes-novo.tsx(606 linhas)Deletar✅student-view.tsx(56 linhas)Deletar✅src/Index.tsx(7 linhas)Deletar✅ — confirmado quelogin.tsx(486 linhas)login-unified.tsxé o substituto completo
Fase B — Extração de helpers compartilhados
- Criar
src/lib/date-helpers.ts(eliminar 2formatarDataHoraduplicadas + centralizartoLocaleDateString) - Extrair
useDebounceValueparasrc/hooks/useDebounceValue.ts
Fase C — Splits de alto impacto (os 5 maiores)
alunos-escola.tsx(3486 → ~7 arquivos) — maior monólitoolimpiada-detalhes-especialista.tsx(2786 → ~7 arquivos) — 5 tabs distintasimportacao-alunos/index.tsx(2303 → ~5 arquivos) — wizard stepsadmin-escola-detalhes.tsx(1756 → ~6 arquivos) — 5 tabsuseMuralPortal.ts(752 → ~3 hooks) — hook mais complexo
Fase D — Splits secundários
6-13. Restante do TIER 1 por ordem de linhas decrescente
Fase E — Edge Functions
mural-escola(16 actions → handlers extraídos)admin-assinaturas(12 actions → handlers)
Estimativa de Impacto
| Métrica | Antes | Após Fase A-C |
|---|---|---|
| Arquivos >1000 linhas (components) | 13 | 0 |
| Maior arquivo | 3486 | ~400 |
| Código morto removido | — | ~1155 linhas |
| Helpers duplicados eliminados | 3 | 0 |
| Hooks >500 linhas | 2 | 0 |