First commit - backup RDOC
This commit is contained in:
323
src/config/routes.tsx
Normal file
323
src/config/routes.tsx
Normal file
@@ -0,0 +1,323 @@
|
||||
import { lazy } from 'react';
|
||||
import type { ComponentType } from 'react';
|
||||
|
||||
// Lazy loading otimizado com preload para rotas críticas
|
||||
const Dashboard = lazy(() => import('@/pages/Dashboard'));
|
||||
const Cadastros = lazy(() => import('@/pages/Cadastros'));
|
||||
const CreateRDO = lazy(() => import('@/pages/CreateRDO'));
|
||||
const ObraDetails = lazy(() => import('@/pages/ObraDetails'));
|
||||
const RDODetails = lazy(() => import('@/pages/RDODetails'));
|
||||
const Configuracoes = lazy(() => import('@/pages/Configuracoes'));
|
||||
const ObraTasks = lazy(() => import('@/pages/ObraTasks'));
|
||||
const CreateTask = lazy(() => import('@/pages/CreateTask'));
|
||||
const ManualInstrucoes = lazy(() => import('@/pages/ManualInstrucoes'));
|
||||
const Reports = lazy(() => import('@/pages/Reports'));
|
||||
const DatabaseTest = lazy(() => import('@/pages/DatabaseTest'));
|
||||
const Auth = lazy(() => import('@/pages/Auth'));
|
||||
const CreateObra = lazy(() => import('@/pages/CreateObra'));
|
||||
const AuthCallback = lazy(() => import('@/pages/AuthCallback').then(m => ({ default: m.AuthCallback })));
|
||||
const SelectOrganization = lazy(() => import('@/pages/SelectOrganization'));
|
||||
|
||||
// Preload de rotas críticas para melhor UX
|
||||
export const preloadCriticalRoutes = () => {
|
||||
// Preload das rotas mais utilizadas
|
||||
import('@/pages/Dashboard');
|
||||
import('@/pages/CreateRDO');
|
||||
import('@/pages/ObraDetails');
|
||||
};
|
||||
|
||||
// Tipos para configuração de rotas
|
||||
export interface RouteConfig {
|
||||
path: string;
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
component: ComponentType<any>;
|
||||
requireAuth?: boolean;
|
||||
useLayout?: boolean;
|
||||
title?: string;
|
||||
description?: string;
|
||||
preload?: boolean; // Indica se deve fazer preload
|
||||
category?: 'auth' | 'main' | 'obra' | 'admin'; // Categoria da rota
|
||||
}
|
||||
|
||||
// Configuração declarativa das rotas
|
||||
export const routeConfig: RouteConfig[] = [
|
||||
// Rotas públicas (autenticação)
|
||||
{
|
||||
path: '/login',
|
||||
component: Auth,
|
||||
requireAuth: false,
|
||||
useLayout: false,
|
||||
title: 'Login',
|
||||
description: 'Página de login do sistema RDO',
|
||||
preload: true,
|
||||
category: 'auth'
|
||||
},
|
||||
{
|
||||
path: '/register',
|
||||
component: Auth,
|
||||
requireAuth: false,
|
||||
useLayout: false,
|
||||
title: 'Cadastro',
|
||||
description: 'Página de cadastro de usuário',
|
||||
preload: false,
|
||||
category: 'auth'
|
||||
},
|
||||
{
|
||||
path: '/cadastro',
|
||||
component: Auth,
|
||||
requireAuth: false,
|
||||
useLayout: false,
|
||||
title: 'Cadastro',
|
||||
description: 'Página de cadastro de usuário',
|
||||
preload: false,
|
||||
category: 'auth'
|
||||
},
|
||||
{
|
||||
path: '/auth/callback',
|
||||
component: AuthCallback,
|
||||
requireAuth: false,
|
||||
useLayout: false,
|
||||
title: 'Callback OAuth',
|
||||
description: 'Processamento de retorno OAuth',
|
||||
preload: false,
|
||||
category: 'auth'
|
||||
},
|
||||
{
|
||||
path: '/selecionar-organizacao',
|
||||
component: SelectOrganization,
|
||||
requireAuth: false,
|
||||
useLayout: false,
|
||||
title: 'Selecionar Organização',
|
||||
description: 'Seleção de organização via código de convite',
|
||||
preload: false,
|
||||
category: 'auth'
|
||||
},
|
||||
|
||||
// Rotas protegidas com layout principal
|
||||
{
|
||||
path: '/',
|
||||
component: Dashboard,
|
||||
requireAuth: true,
|
||||
useLayout: true,
|
||||
title: 'Dashboard',
|
||||
description: 'Painel principal do sistema RDO',
|
||||
preload: true,
|
||||
category: 'main'
|
||||
},
|
||||
{
|
||||
path: '/dashboard',
|
||||
component: Dashboard,
|
||||
requireAuth: true,
|
||||
useLayout: true,
|
||||
title: 'Dashboard',
|
||||
description: 'Painel principal do sistema RDO',
|
||||
preload: true,
|
||||
category: 'main'
|
||||
},
|
||||
{
|
||||
path: '/cadastros',
|
||||
component: Cadastros,
|
||||
requireAuth: true,
|
||||
useLayout: true,
|
||||
title: 'Cadastros',
|
||||
description: 'Gerenciamento de cadastros',
|
||||
preload: false,
|
||||
category: 'admin'
|
||||
},
|
||||
{
|
||||
path: '/cadastros/obras',
|
||||
component: Cadastros,
|
||||
requireAuth: true,
|
||||
useLayout: true,
|
||||
title: 'Cadastro de Obras',
|
||||
description: 'Gerenciamento de obras',
|
||||
preload: false,
|
||||
category: 'admin'
|
||||
},
|
||||
{
|
||||
path: '/cadastros/obras/new',
|
||||
component: CreateObra,
|
||||
requireAuth: true,
|
||||
useLayout: false,
|
||||
title: 'Nova Obra',
|
||||
description: 'Cadastro de nova obra',
|
||||
preload: false,
|
||||
category: 'admin'
|
||||
},
|
||||
{
|
||||
path: '/reports',
|
||||
component: Reports,
|
||||
requireAuth: true,
|
||||
useLayout: true,
|
||||
title: 'Relatórios',
|
||||
description: 'Relatórios e análises do sistema',
|
||||
preload: false,
|
||||
category: 'admin'
|
||||
},
|
||||
{
|
||||
path: '/database-test',
|
||||
component: DatabaseTest,
|
||||
requireAuth: true,
|
||||
useLayout: true,
|
||||
title: 'Teste de Banco',
|
||||
description: 'Página de teste do banco de dados',
|
||||
preload: false,
|
||||
category: 'admin'
|
||||
},
|
||||
|
||||
// Rotas protegidas sem layout (tela cheia)
|
||||
{
|
||||
path: '/obra/:id',
|
||||
component: ObraDetails,
|
||||
requireAuth: true,
|
||||
useLayout: false,
|
||||
title: 'Detalhes da Obra',
|
||||
description: 'Visualização detalhada da obra',
|
||||
preload: true,
|
||||
category: 'obra'
|
||||
},
|
||||
{
|
||||
path: '/obra/:id/tarefas',
|
||||
component: ObraTasks,
|
||||
requireAuth: true,
|
||||
useLayout: false,
|
||||
title: 'Tarefas da Obra',
|
||||
description: 'Gerenciamento de tarefas da obra',
|
||||
preload: false,
|
||||
category: 'obra'
|
||||
},
|
||||
{
|
||||
path: '/obra/:id/tarefa/nova',
|
||||
component: CreateTask,
|
||||
requireAuth: true,
|
||||
useLayout: false,
|
||||
title: 'Nova Tarefa',
|
||||
description: 'Criação de nova tarefa',
|
||||
preload: false,
|
||||
category: 'obra'
|
||||
},
|
||||
{
|
||||
path: '/obra/:id/rdo/novo',
|
||||
component: CreateRDO,
|
||||
requireAuth: true,
|
||||
useLayout: false,
|
||||
title: 'Novo RDO',
|
||||
description: 'Criação de novo RDO',
|
||||
preload: true,
|
||||
category: 'obra'
|
||||
},
|
||||
{
|
||||
path: '/obra/:obraId/rdo/:rdoId',
|
||||
component: RDODetails,
|
||||
requireAuth: true,
|
||||
useLayout: false,
|
||||
title: 'Detalhes do RDO',
|
||||
description: 'Visualização detalhada do RDO',
|
||||
preload: false,
|
||||
category: 'obra'
|
||||
},
|
||||
{
|
||||
path: '/rdo/novo',
|
||||
component: CreateRDO,
|
||||
requireAuth: true,
|
||||
useLayout: false,
|
||||
title: 'Novo RDO',
|
||||
description: 'Criação de novo RDO',
|
||||
preload: true,
|
||||
category: 'obra'
|
||||
},
|
||||
{
|
||||
path: '/configuracoes',
|
||||
component: Configuracoes,
|
||||
requireAuth: true,
|
||||
useLayout: false,
|
||||
title: 'Configurações',
|
||||
description: 'Configurações do sistema',
|
||||
preload: false,
|
||||
category: 'admin'
|
||||
},
|
||||
{
|
||||
path: '/manual',
|
||||
component: ManualInstrucoes,
|
||||
requireAuth: true,
|
||||
useLayout: false,
|
||||
title: 'Manual de Instruções',
|
||||
description: 'Manual de uso do sistema',
|
||||
preload: false,
|
||||
category: 'admin'
|
||||
}
|
||||
];
|
||||
|
||||
// Utilitários para trabalhar com rotas
|
||||
export const routeUtils = {
|
||||
// Encontrar rota por path
|
||||
findRoute: (path: string): RouteConfig | undefined => {
|
||||
return routeConfig.find(route => route.path === path);
|
||||
},
|
||||
|
||||
// Obter rotas públicas
|
||||
getPublicRoutes: (): RouteConfig[] => {
|
||||
return routeConfig.filter(route => !route.requireAuth);
|
||||
},
|
||||
|
||||
// Obter rotas protegidas
|
||||
getProtectedRoutes: (): RouteConfig[] => {
|
||||
return routeConfig.filter(route => route.requireAuth);
|
||||
},
|
||||
|
||||
// Obter rotas com layout
|
||||
getLayoutRoutes: (): RouteConfig[] => {
|
||||
return routeConfig.filter(route => route.useLayout);
|
||||
},
|
||||
|
||||
// Obter rotas sem layout
|
||||
getFullScreenRoutes: (): RouteConfig[] => {
|
||||
return routeConfig.filter(route => route.requireAuth && !route.useLayout);
|
||||
},
|
||||
|
||||
// Obter rotas para preload
|
||||
getPreloadRoutes: (): RouteConfig[] => {
|
||||
return routeConfig.filter(route => route.preload);
|
||||
},
|
||||
|
||||
// Obter rotas por categoria
|
||||
getRoutesByCategory: (category: RouteConfig['category']): RouteConfig[] => {
|
||||
return routeConfig.filter(route => route.category === category);
|
||||
},
|
||||
|
||||
// Executar preload das rotas críticas
|
||||
preloadRoutes: async (): Promise<void> => {
|
||||
const preloadRoutes = routeUtils.getPreloadRoutes();
|
||||
const preloadPromises = preloadRoutes.map(route => {
|
||||
// Preload baseado no componente
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
if ((route.component as any) === Dashboard) return import('@/pages/Dashboard');
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
if ((route.component as any) === CreateRDO) return import('@/pages/CreateRDO');
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
if ((route.component as any) === ObraDetails) return import('@/pages/ObraDetails');
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
if ((route.component as any) === Auth) return import('@/pages/Auth');
|
||||
return Promise.resolve();
|
||||
});
|
||||
|
||||
await Promise.allSettled(preloadPromises);
|
||||
},
|
||||
|
||||
// Gerar breadcrumbs baseado na rota atual
|
||||
generateBreadcrumbs: (currentPath: string): Array<{ label: string, path?: string }> => {
|
||||
const route = routeUtils.findRoute(currentPath);
|
||||
if (!route) return [];
|
||||
|
||||
const breadcrumbs = [{ label: 'Home', path: '/' }];
|
||||
|
||||
if (route.category === 'obra') {
|
||||
breadcrumbs.push({ label: 'Obras', path: '/obras' });
|
||||
} else if (route.category === 'admin') {
|
||||
breadcrumbs.push({ label: 'Administração', path: '/cadastros' });
|
||||
}
|
||||
|
||||
breadcrumbs.push({ label: route.title || 'Página', path: currentPath });
|
||||
return breadcrumbs;
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user