Pular para o conteúdo

React e Next.js

Primitivas headless poderosas e componentes pré-estilizados para o seu frontend React.

Instalação

Verifique se você instalou o pacote no seu projeto.

npm install @flouviahq/elements

O provider: <CordProvider>

Para usar qualquer componente ou hook de React fornecido pelo SDK, a sua aplicação (ou a parte do seu app que usa o gerador de orçamentos) precisa estar envolvida em um CordProvider.

Existem dois modos de segurança para inicializar o provider: Publishable e Proxy. Esses modos são mutuamente exclusivos; você não pode passar as duas propriedades ao mesmo tempo.

Modo Publishable (frontend direto)

Use este modo se quiser que o cliente React se comunique diretamente com a API do Cord. As chaves publicáveis (pk_live_... / pk_test_...) são bastante limitadas por segurança: podem criar orçamentos e ler o catálogo de produtos (omitindo o seu custo), mas nunca poderão ler o seu cadastro de clientes do CRM.

// app/layout.tsx
import { CordProvider } from '@flouviahq/elements/react';

export default function Layout({ children }) {
  return (
    <CordProvider publishableKey={process.env.NEXT_PUBLIC_CORD_PUBLISHABLE_KEY!}>
      {children}
    </CordProvider>
  );
}

Modo Proxy (backend intermediário)

Use este modo se não quiser expor nenhuma chave no seu cliente ou se precisar de funcionalidades que exigem chaves secretas (como ler o CRM). O SDK enviará as requisições para a rota de proxy que você indicar, e o seu backend se encarregará de reencaminhá-las para a API do Cord com a chave secreta (sk_live_...).

<CordProvider proxyUrl="/api/cord/proxy">
  {children}
</CordProvider>

<CordCotizador>: visualizador em iframe

Se você já tem o token de um orçamento e só quer mostrá-lo para que o cliente o aprove e o pague, use o visualizador nativo. Este componente renderiza com segurança um iframe injetado com a sua marca.

Importante: <CordCotizador> é o único componente que não precisa estar dentro de um CordProvider, já que o token do orçamento fornece o seu próprio contexto de autenticação.

import { CordCotizador } from '@flouviahq/elements/react';

function QuotePage({ token }: { token: string }) {
  return (
    <CordCotizador
      token={token}
      onApproved={(detail) => console.log('Approved by', detail.signed_by)}
      onPay={(detail) => console.log('Payment opened at', detail.url)}
    />
  );
}

<CordInvoice>

O mesmo para uma fatura (/i/{token}). Aceita as mesmas props e acrescenta onPaid:

import { CordInvoice } from '@flouviahq/elements/react';

<CordInvoice token={invoiceToken} onPaid={(d) => console.log('Paid', d.folio)} />

No Vue, CordInvoice de @flouviahq/elements/vue emite paid.


<CordBuilder>: criador de orçamentos (compound)

Se você quer construir uma interface para montar novos orçamentos e aproveitar a interface padronizada do SDK, use o CordBuilder. Ele usa um padrão de componentes compostos (compound pattern), então você pode reordenar ou dispensar partes do formulário.

import { CordBuilder } from '@flouviahq/elements/react';

function NewQuote() {
  return (
    <CordBuilder onQuoteCreated={(q) => console.log('Created:', q.folio)}>
      <CordBuilder.Header />
      <CordBuilder.Items className="my-tailwind-class" />
      <CordBuilder.Summary />
      <CordBuilder.SubmitButton className="btn btn-primary" />
    </CordBuilder>
  );
}

Os componentes injetam classes CSS estáveis (.cord-*) para facilitar a sua modificação. No entanto, o Cord nunca aplica inline styles, garantindo que o seu CSS personalizado (como Tailwind ou CSS Modules) sempre tenha precedência sem precisar usar !important.


useQuoteBuilder: UI headless

Se o <CordBuilder> não se adaptar às necessidades exatas de design da sua interface, você pode extrair todo o motor de estado com o hook useQuoteBuilder e renderizar os botões, inputs e tabelas inteiramente por conta própria.

import { useQuoteBuilder } from '@flouviahq/elements/react';

function MyOwnBuilder() {
  const {
    items, updateItem, removeItem, subtotal, iva, total,
    cliente, setCliente, notas, setNotas,
    handleSubmit, isLoading
  } = useQuoteBuilder({
    catalog: myLocalProducts, 
    onQuoteCreated: (q) => console.log('Link:', q.link_publico),
  });

  return (
    <form onSubmit={handleSubmit}>
      {/* Construa uma interface 100% sua usando o estado do Cord */}
      <h2>Total: ${total}</h2>
      <button type="submit" disabled={isLoading}>Create</button>
    </form>
  );
}

ivaPct é obrigatório, não um ajuste opcional. O SDK não presume mais 16% (México) em silêncio se você não o configurar — useQuoteBuilder (e, portanto, <CordBuilder>) lança um erro assim que é montado se não encontrar uma alíquota explícita, nem por prop nem por <CordProvider>. Configure-a uma única vez em nível global — <CordProvider ivaPct={0.16}> — em vez de repeti-la em cada instância do Builder: assim o total que o seu cliente vê nunca diverge do que o servidor valida para a sua organização. Uma empresa fora do México deve passar a SUA própria alíquota (ou 0 se a venda dela não tiver imposto) — nunca presuma 0.16 por padrão.