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

16 KiB
Raw Permalink Blame History

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


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)

// tailwind.config.ts
colors: {
  healthGreen: '#2D9CDB',  // Azul claro
  medicalBlue: '#0F4C81'   // Azul escuro (cor principal)
}

🧪 Testes

O projeto utiliza Vitest para testes unitÃÆÃ¡rios:

# 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:

# 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

# Instalar depend̮̻ncias
npm install

# Modo desenvolvimento
npm run dev

# Aplica̮̤̮̣o estarÃÆÃ¡ disponÃÆÃ­vel em http://localhost:5173

🏗️ Build e Produ̮̤̮̣o

# 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

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:

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:

import { useCartStore } from './stores/cartStore';

function ProductPage() {
  const addItem = useCartStore(state => state.addItem);
  
  return (
    <button onClick={() => addItem(product)}>
      Adicionar ao Carrinho
    </button>
  );
}

🧪 Testes

# 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

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

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

npm install -g vercel
vercel

Netlify

npm run build
# Fazer upload da pasta dist/

Docker

# 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