- Cria README.md na raiz com visão global e diagrama de arquitetura - Adiciona/atualiza README.md em todos os componentes: - backend (API Go) - backoffice (NestJS) - marketplace (React/Vite) - saveinmed-bff (Python/FastAPI) - saveinmed-frontend (Next.js) - website (Fresh/Deno) - Atualiza .gitignore em todos os componentes com regras abrangentes - Cria .gitignore na raiz do projeto - Renomeia pastas para melhor organização: - backend-go → backend - backend-nest → backoffice - marketplace-front → marketplace - Documenta arquitetura, tecnologias, setup e fluxo de desenvolvimento
297 lines
6.9 KiB
Markdown
297 lines
6.9 KiB
Markdown
# SaveInMed Marketplace Frontend
|
|
|
|
Interface do usuário do marketplace B2B farmacêutico SaveInMed, desenvolvida com React e Vite.
|
|
|
|
## 🎯 Propósito
|
|
|
|
Este é o frontend do marketplace SaveInMed, onde farmácias e distribuidoras podem:
|
|
- Navegar e pesquisar produtos farmacêuticos
|
|
- Adicionar produtos ao carrinho
|
|
- Realizar pedidos e checkout
|
|
- Gerenciar perfil e histórico de compras
|
|
- Acompanhar status de pedidos
|
|
- Processar pagamentos via Mercado Pago
|
|
|
|
## 🚀 Tecnologias
|
|
|
|
- **React 18** - Biblioteca UI
|
|
- **TypeScript** - Tipagem estática
|
|
- **Vite 5** - Build tool e dev server ultra-rápido
|
|
- **React Router DOM 6** - Roteamento
|
|
- **TailwindCSS 3** - Framework CSS utility-first
|
|
- **Zustand 4** - Gerenciamento de estado
|
|
- **Axios** - Cliente HTTP
|
|
- **Mercado Pago SDK React** - Integração de pagamentos
|
|
- **React Window** - Virtualização de listas para performance
|
|
|
|
## 📋 Funcionalidades
|
|
|
|
### Catálogo de Produtos
|
|
- Listagem de produtos com virtualização
|
|
- Busca e filtros avançados
|
|
- Detalhes de produtos
|
|
- Informações de lote e validade
|
|
|
|
### Carrinho de Compras
|
|
- Adicionar/remover produtos
|
|
- Atualizar quantidades
|
|
- Persistência local com Zustand
|
|
- Cálculo automático de totais
|
|
|
|
### Checkout e Pagamentos
|
|
- Fluxo de checkout simplificado
|
|
- Integração com Mercado Pago
|
|
- Múltiplas formas de pagamento
|
|
- Confirmação de pedido
|
|
|
|
### Autenticação
|
|
- Login de usuários
|
|
- Rotas protegidas
|
|
- Contexto de autenticação
|
|
- Persistência de sessão
|
|
|
|
### Dashboard
|
|
- Visão geral de pedidos
|
|
- Histórico de compras
|
|
- Estatísticas de uso
|
|
|
|
### Perfil
|
|
- Gerenciamento de dados pessoais
|
|
- Endereços de entrega
|
|
- Preferências
|
|
|
|
## 🏗️ Arquitetura
|
|
|
|
```
|
|
marketplace/
|
|
├── src/
|
|
│ ├── components/
|
|
│ │ └── ProtectedRoute.tsx # Componente de rota protegida
|
|
│ ├── context/
|
|
│ │ └── AuthContext.tsx # Contexto de autenticação
|
|
│ ├── hooks/
|
|
│ │ └── usePersistentFilters.ts # Hook para filtros persistentes
|
|
│ ├── layouts/
|
|
│ │ └── Shell.tsx # Layout principal
|
|
│ ├── pages/
|
|
│ │ ├── Cart.tsx # Página do carrinho
|
|
│ │ ├── Checkout.tsx # Página de checkout
|
|
│ │ ├── Dashboard.tsx # Dashboard do usuário
|
|
│ │ ├── Login.tsx # Página de login
|
|
│ │ └── Profile.tsx # Página de perfil
|
|
│ ├── services/
|
|
│ │ └── apiClient.ts # Cliente API configurado
|
|
│ ├── stores/
|
|
│ │ └── cartStore.ts # Store Zustand do carrinho
|
|
│ ├── types/
|
|
│ │ └── product.ts # Tipos TypeScript
|
|
│ ├── App.tsx # Componente raiz
|
|
│ ├── main.tsx # Entry point
|
|
│ └── index.css # Estilos globais
|
|
├── index.html
|
|
├── vite.config.ts
|
|
├── tailwind.config.ts
|
|
├── tsconfig.json
|
|
└── README.md
|
|
```
|
|
|
|
## 🔧 Configuração
|
|
|
|
### Variáveis de Ambiente
|
|
|
|
Crie um arquivo `.env` na raiz do projeto:
|
|
|
|
```bash
|
|
# API Backend
|
|
VITE_API_URL=http://localhost:8080
|
|
|
|
# Mercado Pago
|
|
VITE_MERCADOPAGO_PUBLIC_KEY=your-public-key-here
|
|
|
|
# Ambiente
|
|
VITE_ENV=development
|
|
```
|
|
|
|
### Pré-requisitos
|
|
|
|
- Node.js 20+
|
|
- npm ou yarn
|
|
|
|
## 🏃 Execução Local
|
|
|
|
```bash
|
|
# Instalar dependências
|
|
npm install
|
|
|
|
# Modo desenvolvimento
|
|
npm run dev
|
|
|
|
# Aplicação estará disponível em http://localhost:5173
|
|
```
|
|
|
|
## 🏗️ Build e Produção
|
|
|
|
```bash
|
|
# Build para produção
|
|
npm run build
|
|
|
|
# Preview do build
|
|
npm run preview
|
|
|
|
# Arquivos de produção estarão em ./dist
|
|
```
|
|
|
|
## 🎨 Estilização
|
|
|
|
O projeto utiliza TailwindCSS para estilização. Principais recursos:
|
|
|
|
- **Utility-first**: Classes utilitárias para estilização rápida
|
|
- **Responsivo**: Design mobile-first
|
|
- **Dark mode**: Suporte a tema escuro (se implementado)
|
|
- **Customização**: Configuração em `tailwind.config.ts`
|
|
|
|
### Exemplo de Componente
|
|
|
|
```tsx
|
|
export function ProductCard({ product }: { product: Product }) {
|
|
return (
|
|
<div className="bg-white rounded-lg shadow-md p-4 hover:shadow-lg transition-shadow">
|
|
<h3 className="text-lg font-semibold text-gray-900">{product.name}</h3>
|
|
<p className="text-gray-600 mt-2">{product.description}</p>
|
|
<div className="mt-4 flex justify-between items-center">
|
|
<span className="text-xl font-bold text-green-600">
|
|
R$ {product.price.toFixed(2)}
|
|
</span>
|
|
<button className="bg-blue-600 text-white px-4 py-2 rounded hover:bg-blue-700">
|
|
Adicionar
|
|
</button>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
```
|
|
|
|
## 🔐 Autenticação
|
|
|
|
O sistema de autenticação utiliza Context API:
|
|
|
|
```tsx
|
|
import { useAuth } from './context/AuthContext';
|
|
|
|
function MyComponent() {
|
|
const { user, login, logout } = useAuth();
|
|
|
|
return (
|
|
<div>
|
|
{user ? (
|
|
<button onClick={logout}>Sair</button>
|
|
) : (
|
|
<button onClick={() => login(email, password)}>Entrar</button>
|
|
)}
|
|
</div>
|
|
);
|
|
}
|
|
```
|
|
|
|
## 🛒 Gerenciamento de Estado (Zustand)
|
|
|
|
O carrinho de compras é gerenciado com Zustand:
|
|
|
|
```tsx
|
|
import { useCartStore } from './stores/cartStore';
|
|
|
|
function ProductPage() {
|
|
const addItem = useCartStore(state => state.addItem);
|
|
|
|
return (
|
|
<button onClick={() => addItem(product)}>
|
|
Adicionar ao Carrinho
|
|
</button>
|
|
);
|
|
}
|
|
```
|
|
|
|
## 🧪 Testes
|
|
|
|
```bash
|
|
# Executar testes (quando configurados)
|
|
npm test
|
|
|
|
# Coverage
|
|
npm run test:coverage
|
|
```
|
|
|
|
## 📱 Responsividade
|
|
|
|
O marketplace é totalmente responsivo, com breakpoints:
|
|
|
|
- **Mobile**: < 640px
|
|
- **Tablet**: 640px - 1024px
|
|
- **Desktop**: > 1024px
|
|
|
|
## ⚡ Performance
|
|
|
|
Otimizações implementadas:
|
|
|
|
- **Virtualização de listas**: React Window para listas longas
|
|
- **Code splitting**: Lazy loading de rotas
|
|
- **Vite**: Build ultra-rápido
|
|
- **Zustand**: State management leve e performático
|
|
- **Memoização**: React.memo e useMemo onde apropriado
|
|
|
|
## 🔗 Integração com APIs
|
|
|
|
### Backend Go API
|
|
```typescript
|
|
import apiClient from './services/apiClient';
|
|
|
|
// Buscar produtos
|
|
const products = await apiClient.get('/api/v1/products');
|
|
|
|
// Criar pedido
|
|
const order = await apiClient.post('/api/v1/orders', orderData);
|
|
```
|
|
|
|
### Mercado Pago
|
|
```tsx
|
|
import { initMercadoPago, Wallet } from '@mercadopago/sdk-react';
|
|
|
|
initMercadoPago(import.meta.env.VITE_MERCADOPAGO_PUBLIC_KEY);
|
|
|
|
function CheckoutButton({ preferenceId }: { preferenceId: string }) {
|
|
return <Wallet initialization={{ preferenceId }} />;
|
|
}
|
|
```
|
|
|
|
## 🚀 Deploy
|
|
|
|
### Vercel
|
|
```bash
|
|
npm install -g vercel
|
|
vercel
|
|
```
|
|
|
|
### Netlify
|
|
```bash
|
|
npm run build
|
|
# Fazer upload da pasta dist/
|
|
```
|
|
|
|
### Docker
|
|
```bash
|
|
# Build
|
|
docker build -t saveinmed-marketplace:latest .
|
|
|
|
# Run
|
|
docker run -p 80:80 saveinmed-marketplace:latest
|
|
```
|
|
|
|
## 🔗 Integração com Outros Componentes
|
|
|
|
- **Backend (Go API)**: Consome endpoints de produtos, pedidos e pagamentos
|
|
- **Backoffice (NestJS)**: Consome endpoints administrativos
|
|
- **SaveInMed BFF**: Pode usar como proxy para múltiplas APIs
|
|
|
|
## 📝 Licença
|
|
|
|
MIT
|