saveinmed/frontend/MARKETPLACE.md
2026-03-07 07:04:27 -06:00

365 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

> 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