refactor: otimização e refatoração do app
- Lazy loading de rotas com React.lazy + Suspense (code-splitting) - main.tsx reduzido de 378 para ~55 linhas (roteamento data-driven) - Novo routeConfig.ts e AppRoutes.tsx para configuração centralizada - 601 console.logs dos componentes core migrados para logger centralizado - Logger aprimorado com nível debug e tipagem melhorada - Imports mal posicionados corrigidos (OptimizedCache, PerformanceMonitor) - process.env.NODE_ENV substituído por import.meta.env.DEV (padrão Vite) - QueryClient com retry backoff exponencial, gcTime e refetchOnWindowFocus - Toaster duplicado removido do Layout.tsx (mantido no main.tsx) - Vite build: chunks adicionais para date-fns, jspdf, lucide-react - Dead code removido em ProtectedRouteByResource (branch unreachable) - Nenhuma lógica de negócios alterada
This commit is contained in:
@@ -0,0 +1,270 @@
|
||||
import { ComponentType, lazy } from 'react';
|
||||
|
||||
// ============================================================================
|
||||
// Definição de tipos para o sistema de rotas
|
||||
// ============================================================================
|
||||
|
||||
export type RouteGuard = 'public' | 'protected' | 'admin' | 'resource';
|
||||
|
||||
export interface RouteDefinition {
|
||||
path: string;
|
||||
component: () => Promise<{ default: ComponentType<any> }>;
|
||||
guard: RouteGuard;
|
||||
resourceKey?: string;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Configuração centralizada de todas as rotas do aplicativo
|
||||
// ============================================================================
|
||||
|
||||
export const routeConfig: RouteDefinition[] = [
|
||||
// ── Pública ──────────────────────────────────────────────
|
||||
{
|
||||
path: '/auth',
|
||||
component: () => import('@/pages/Auth'),
|
||||
guard: 'public',
|
||||
},
|
||||
|
||||
// ── Dashboard ────────────────────────────────────────────
|
||||
{
|
||||
path: '/',
|
||||
component: () => import('@/pages/Dashboard'),
|
||||
guard: 'protected',
|
||||
},
|
||||
{
|
||||
path: '/dashboard',
|
||||
component: () => import('@/pages/Dashboard'),
|
||||
guard: 'protected',
|
||||
},
|
||||
|
||||
// ── Cadastro ─────────────────────────────────────────────
|
||||
{
|
||||
path: '/cadastro-of',
|
||||
component: () => import('@/pages/CadastroOF'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'cadastro-of',
|
||||
},
|
||||
{
|
||||
path: '/seletor-of',
|
||||
component: () => import('@/pages/SeletorOF'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'cadastro-pecas',
|
||||
},
|
||||
{
|
||||
path: '/cadastro-pecas/:ofNumber',
|
||||
component: () => import('@/pages/CadastroPecasFiltrado'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'cadastro-pecas',
|
||||
},
|
||||
|
||||
// ── Equipamentos ─────────────────────────────────────────
|
||||
{
|
||||
path: '/equipamentos',
|
||||
component: () => import('@/pages/Equipamentos'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'equipamentos',
|
||||
},
|
||||
|
||||
// ── Ferramentas ──────────────────────────────────────────
|
||||
{
|
||||
path: '/ferramentas/conversores',
|
||||
component: () => import('@/pages/ConversoresDados'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'ferramentas-conversores',
|
||||
},
|
||||
{
|
||||
path: '/ferramentas/inconsistencias',
|
||||
component: () => import('@/pages/VerInconsistencias'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'ferramentas-inconsistencias',
|
||||
},
|
||||
{
|
||||
path: '/ferramentas/webclone',
|
||||
component: () => import('@/pages/WebClone'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'ferramentas-webclone',
|
||||
},
|
||||
|
||||
// ── Estoque ──────────────────────────────────────────────
|
||||
{
|
||||
path: '/estoque',
|
||||
component: () => import('@/pages/Estoque'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'estoque',
|
||||
},
|
||||
{
|
||||
path: '/estoque/solicitacao-compras',
|
||||
component: () => import('@/pages/SolicitacaoCompras'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'estoque-solicitacao-compras',
|
||||
},
|
||||
|
||||
// ── OFs ──────────────────────────────────────────────────
|
||||
{
|
||||
path: '/ofs',
|
||||
component: () => import('@/pages/OrdensFabricacao'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'ofs-lista',
|
||||
},
|
||||
{
|
||||
path: '/ofs/cronograma',
|
||||
component: () => import('@/pages/CronogramaOF'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'ofs-cronograma',
|
||||
},
|
||||
{
|
||||
path: '/cadastro/ofs-concluidas',
|
||||
component: () => import('@/pages/OFsConcluidas'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'ofs-concluidas',
|
||||
},
|
||||
|
||||
// ── Produção ─────────────────────────────────────────────
|
||||
{
|
||||
path: '/producao',
|
||||
component: () => import('@/pages/Producao'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'producao-visao',
|
||||
},
|
||||
{
|
||||
path: '/diario-producao',
|
||||
component: () => import('@/pages/DiarioProducao'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'diario-producao',
|
||||
},
|
||||
{
|
||||
path: '/apontamento-producao',
|
||||
component: () => import('@/pages/ApontamentoProducao'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'producao-apontamento',
|
||||
},
|
||||
{
|
||||
path: '/dashboard-producao',
|
||||
component: () => import('@/pages/DashboardProducao'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'producao-dashboard',
|
||||
},
|
||||
|
||||
// ── Painel Industrial ────────────────────────────────────
|
||||
{
|
||||
path: '/painel-industrial',
|
||||
component: () => import('@/pages/PainelIndustrial'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'painel-industrial',
|
||||
},
|
||||
|
||||
// ── Expedição ────────────────────────────────────────────
|
||||
{
|
||||
path: '/expedicao',
|
||||
component: () => import('@/pages/Expedicao'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'expedicao',
|
||||
},
|
||||
|
||||
// ── Obra ─────────────────────────────────────────────────
|
||||
{
|
||||
path: '/obra',
|
||||
component: () => import('@/pages/Obra'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'obra-dashboard',
|
||||
},
|
||||
{
|
||||
path: '/obra/configuracoes',
|
||||
component: () => import('@/pages/ObraConfiguracoes'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'obra-configuracoes',
|
||||
},
|
||||
|
||||
// ── Tarefas ──────────────────────────────────────────────
|
||||
{
|
||||
path: '/tarefas',
|
||||
component: () => import('@/pages/Tarefas'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'tarefas-lista',
|
||||
},
|
||||
{
|
||||
path: '/tarefas/historico',
|
||||
component: () => import('@/pages/TarefasHistorico'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'tarefas-historico',
|
||||
},
|
||||
|
||||
// ── Biblioteca ───────────────────────────────────────────
|
||||
{
|
||||
path: '/biblioteca/catalogos',
|
||||
component: () => import('@/pages/Catalogos'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'biblioteca-catalogos',
|
||||
},
|
||||
{
|
||||
path: '/biblioteca/normas',
|
||||
component: () => import('@/pages/BibliotecaNormas'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'biblioteca-normas',
|
||||
},
|
||||
{
|
||||
path: '/biblioteca/referencias',
|
||||
component: () => import('@/pages/BibliotecaReferencias'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'biblioteca-referencias',
|
||||
},
|
||||
|
||||
// ── Sistema ──────────────────────────────────────────────
|
||||
{
|
||||
path: '/sistema',
|
||||
component: () => import('@/pages/Sistema'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'sistema',
|
||||
},
|
||||
|
||||
// ── Sugestões ────────────────────────────────────────────
|
||||
{
|
||||
path: '/sugestoes',
|
||||
component: () => import('@/pages/Sugestoes'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'sugestoes',
|
||||
},
|
||||
|
||||
// ── Configurações ────────────────────────────────────────
|
||||
{
|
||||
path: '/configuracoes',
|
||||
component: () => import('@/pages/Configuracoes'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'configuracoes-gerais',
|
||||
},
|
||||
{
|
||||
path: '/admin/theme-customization',
|
||||
component: () => import('@/pages/ThemeCustomizationPage'),
|
||||
guard: 'resource',
|
||||
resourceKey: 'theme-customization',
|
||||
},
|
||||
|
||||
// ── Admin ────────────────────────────────────────────────
|
||||
{
|
||||
path: '/admin',
|
||||
component: () => import('@/pages/Admin'),
|
||||
guard: 'admin',
|
||||
},
|
||||
{
|
||||
path: '/user-management',
|
||||
component: () => import('@/pages/UserManagement'),
|
||||
guard: 'admin',
|
||||
},
|
||||
{
|
||||
path: '/mapa-interativo',
|
||||
component: () => import('@/pages/MapaInterativo'),
|
||||
guard: 'admin',
|
||||
},
|
||||
{
|
||||
path: '/atribuicoes',
|
||||
component: () => import('@/pages/Atribuicoes'),
|
||||
guard: 'admin',
|
||||
},
|
||||
|
||||
// ── Prioridades (Protected simples) ──────────────────────
|
||||
{
|
||||
path: '/prioridades-fabricacao',
|
||||
component: () => import('@/pages/PrioridadesFabricacao'),
|
||||
guard: 'protected',
|
||||
},
|
||||
];
|
||||
Reference in New Issue
Block a user