365 lines
16 KiB
Markdown
365 lines
16 KiB
Markdown
> Nota de atualização
|
||
>
|
||
> Este documento contém referências históricas a BFF, Appwrite ou papéis legados. No fluxo ativo do frontend, a referência correta é API direta e os papéis válidos são `admin`, `owner`, `employee` e `delivery`.
|
||
# SaveInMed Marketplace Frontend
|
||
|
||
## Status (pronto x faltando)
|
||
|
||
**Pronto**
|
||
- Conteúdo descrito neste documento.
|
||
|
||
**Faltando**
|
||
- Confirmar no código o estado real das funcionalidades e atualizar esta seção conforme necessário.
|
||
|
||
**Referencia atual**
|
||
- Arquitetura vigente: [docs/arquitetura-atual.md](./docs/arquitetura-atual.md)
|
||
|
||
|
||
|
||
---
|
||
|
||
|
||
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
|
||
ââ€Â‚ ââ€Â‚ ââ€Âωâ€Âۉâ€Â€ Company.tsx # Perfil da empresa [NEW]
|
||
ââ€Â‚ ââ€Â‚ ââ€Âωâ€Âۉâ€Â€ Dashboard.tsx # Dashboard do usuário
|
||
ââ€Â‚ ââ€Â‚ ââ€Âωâ€Âۉâ€Â€ Inventory.tsx # Gestão de estoque [NEW]
|
||
ââ€Â‚ ââ€Â‚ ââ€Âωâ€Âۉâ€Â€ Login.tsx # Página de login
|
||
ââ€Â‚ ââ€Â‚ ââ€Âωâ€Âۉâ€Â€ Orders.tsx # Pedidos [NEW]
|
||
ââ€Â‚ ââ€Â‚ ââ€Âωâ€Âۉâ€Â€ Profile.tsx # Página de perfil
|
||
ââ€Â‚ ââ€Â‚ ââ€Ââ€Âââ€Âۉâ€Â€ SellerDashboard.tsx # Dashboard vendedor [NEW]
|
||
ââ€Â‚ ââ€Âωâ€Âۉâ€Â€ services/
|
||
ââ€Â‚ ââ€Â‚ ââ€Ââ€Âââ€Âۉâ€Â€ apiClient.ts # Cliente API configurado
|
||
ââ€Â‚ ââ€Âωâ€Âۉâ€Â€ stores/
|
||
ââ€Â‚ ââ€Â‚ ââ€Ââ€Âââ€Âۉâ€Â€ cartStore.ts # Store Zustand do carrinho
|
||
ââ€Â‚ ââ€Âωâ€Âۉâ€Â€ test/
|
||
ââ€Â‚ ââ€Â‚ ââ€Ââ€Âââ€Âۉâ€Â€ setup.ts # Setup Vitest
|
||
ââ€Â‚ ââ€Âωâ€Âۉâ€Â€ types/
|
||
ââ€Â‚ ââ€Â‚ ââ€Ââ€Âââ€Âۉâ€Â€ product.ts # Tipos TypeScript
|
||
ââ€Â‚ ââ€Âωâ€Âۉâ€Â€ App.tsx # Componente raiz
|
||
ââ€Â‚ ââ€Âωâ€Âۉâ€Â€ main.tsx # Entry point
|
||
ââ€Â‚ ââ€Ââ€Âââ€Âۉâ€Â€ index.css # Estilos globais
|
||
ââ€Âωâ€Âۉâ€Â€ index.html
|
||
ââ€Âωâ€Âۉâ€Â€ vite.config.ts
|
||
ââ€Âωâ€Âۉâ€Â€ vitest.config.ts # Config de testes
|
||
ââ€Âωâ€Âۉâ€Â€ tailwind.config.ts
|
||
ââ€Âωâ€Âۉâ€Â€ tsconfig.json
|
||
ââ€Ââ€Âââ€Âۉâ€Â€ README.md
|
||
```
|
||
|
||
## 🎨 Assets
|
||
|
||
Os arquivos de assets estão em `src/assets/`:
|
||
|
||
| Arquivo | Descrição |
|
||
|---------|-----------|
|
||
| `logo.png` | Logo oficial SaveInMed |
|
||
|
||
### Cores da Marca (Tailwind)
|
||
|
||
```typescript
|
||
// tailwind.config.ts
|
||
colors: {
|
||
healthGreen: '#2D9CDB', // Azul claro
|
||
medicalBlue: '#0F4C81' // Azul escuro (cor principal)
|
||
}
|
||
```
|
||
|
||
## 🧪 Testes
|
||
|
||
O projeto utiliza **Vitest** para testes unitários:
|
||
|
||
```bash
|
||
# Executar testes
|
||
npm test
|
||
|
||
# Executar testes com coverage
|
||
npm run test:coverage
|
||
|
||
# Executar testes uma vez (CI)
|
||
npm test -- --run
|
||
```
|
||
|
||
### Cobertura Atual
|
||
|
||
| Categoria | Testes |
|
||
|-----------|--------|
|
||
| `cartStore` | 15 ✅ |
|
||
| `apiClient` | 7 ✅ |
|
||
| `usePersistentFilters` | 5 ✅ |
|
||
| **Total** | **27** ✅ |
|
||
|
||
## ðŸâ€Â§ 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
|
||
- **Camada historica**: referencias a BFF/Appwrite neste documento devem ser tratadas como legado, nao como arquitetura vigente
|
||
|
||
## 📠Licença
|
||
|
||
MIT
|