Pular para o conteúdo principal

Frontend - Stack Tecnológico

O frontend do Módulo Empreendedorismo é uma Single Page Application (SPA) construída com React e TypeScript, utilizando ferramentas modernas de desenvolvimento.

Tecnologias Principais

TecnologiaVersãoFunção
React19.1.2Biblioteca UI
TypeScript5.xTipagem estática
Vite7.1.2Build tool
MUI7.3.1Componentes UI
Zustand5.0.7State management
React Query5.85.3Server state
React Router7.8Roteamento
Axios1.13.2HTTP client

Dependências

package.json
{
"dependencies": {
// Core
"react": "^19.1.2",
"react-dom": "^19.1.2",
"react-router-dom": "^7.8",

// UI Components
"@mui/material": "^7.3.1",
"@mui/icons-material": "^7.3.1",
"@mui/x-data-grid": "^8.10.1",
"@mui/x-date-pickers": "^8.10.0",
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.0",

// State Management
"zustand": "^5.0.7",
"@tanstack/react-query": "^5.85.3",

// Forms & Validation
"react-hook-form": "^7.62",
"zod": "^4.0.17",
"@hookform/resolvers": "^5.0.1",

// HTTP
"axios": "^1.13.2",

// Rich Text Editor
"@tiptap/react": "^3.2.0",
"@tiptap/starter-kit": "^3.2.0",

// Charts
"recharts": "^3.5.1",

// Drag & Drop
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",

// Utils
"dayjs": "^1.11.13"
},
"devDependencies": {
"@vitejs/plugin-react": "^4.5.2",
"typescript": "~5.8.3",
"eslint": "^9.33.0",
"prettier": "^3.6.2",
"vite": "^7.1.2"
}
}

Estrutura do Projeto

frontend/src/
├── application/ # Lógica de negócio
│ ├── auth/ # Contexto de autenticação
│ ├── profile/ # Lógica de perfil
│ ├── queries/ # React Query hooks
│ └── register/ # Lógica de registro

├── infrastructure/ # Integração externa
│ └── api/ # Clientes HTTP
│ ├── auth/
│ ├── business-plans/
│ ├── profile/
│ └── structuring-agent/

├── presentation/ # UI Components
│ ├── pages/ # Páginas da aplicação
│ │ ├── login/
│ │ ├── register/
│ │ └── private/
│ │ ├── admin/
│ │ ├── agent/
│ │ └── user/
│ ├── components/ # Componentes reutilizáveis
│ │ ├── common/
│ │ ├── graphs/
│ │ └── KanbanBoard/
│ └── theme/ # Tema e layouts

├── store/ # Estado global (Zustand)
│ ├── auth/
│ ├── user/
│ └── onboarding/

├── routes/ # Configuração de rotas
├── types/ # TypeScript types
├── schemas/ # Zod schemas
├── utils/ # Funções utilitárias
├── assets/ # Recursos estáticos
└── lib/ # Bibliotecas customizadas

Configuração

Vite Config

vite.config.ts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

export default defineConfig({
plugins: [react()],
server: {
port: 9501,
host: true,
},
build: {
outDir: 'dist',
sourcemap: true,
},
})

TypeScript Config

tsconfig.json
{
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"module": "ESNext",
"skipLibCheck": true,
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}
},
"include": ["src"]
}

Scripts

# Desenvolvimento
npm run dev # Inicia servidor de desenvolvimento

# Build
npm run build # Build de produção
npm run preview # Preview do build

# Qualidade de código
npm run lint # Executar ESLint
npm run format # Formatar com Prettier

Padrões de Código

Componentes Funcionais

import { FC } from 'react';
import { Box, Typography } from '@mui/material';

interface CardProps {
title: string;
children: React.ReactNode;
}

export const Card: FC<CardProps> = ({ title, children }) => {
return (
<Box sx={{ p: 2, border: 1, borderRadius: 2 }}>
<Typography variant="h6">{title}</Typography>
{children}
</Box>
);
};

Hooks Customizados

import { useQuery } from '@tanstack/react-query';
import { getBusinessPlans } from '@/infrastructure/api/business-plans';

export const useBusinessPlans = () => {
return useQuery({
queryKey: ['business-plans'],
queryFn: getBusinessPlans,
});
};

Zustand Store

import { create } from 'zustand';

interface AuthState {
accessToken: string | null;
refreshToken: string | null;
setTokens: (access: string, refresh: string) => void;
clearTokens: () => void;
}

export const useAuthStore = create<AuthState>((set) => ({
accessToken: null,
refreshToken: null,
setTokens: (access, refresh) =>
set({ accessToken: access, refreshToken: refresh }),
clearTokens: () =>
set({ accessToken: null, refreshToken: null }),
}));

Validação com Zod

import { z } from 'zod';

export const loginSchema = z.object({
email: z.string().email('Email inválido'),
password: z.string().min(8, 'Mínimo 8 caracteres'),
});

export type LoginForm = z.infer<typeof loginSchema>;