Client

Firebolt Client

Uma biblioteca react que faz parte da stack Firebolt e tem como objetivos:

  • Integrar-se automaticamente com o serviço do Firebolt onde os dados dos passos dos formulários são processados;
  • Fornecer uma série de componentes que permitem a criação desses formulários em aplicações front-end de forma modular.

Instalação

# npm
npm install @iq-firebolt/client --save

# yarn
yarn add @iq-firebolt/client

Configuração

Para começarmos a usar o Firebolt client, precisamos configurar o Provider, ele é responsável por gerenciar o estado atual do formulário:

import { createFireboltProvider } from "@iq-firebolt/client";

const withFirebolt = createFireboltProvider({
  formAccess: {
    root: "https://firebolt-api-endpoint",
    formName: "sample",
  },
  withHistory: true,
  stepQueryParam: "step",
  debug: true,
});

Props Provider

Propriedade
Valor Padrão
Descrição
formAccess null Acesso da api do Firebolt, formName é o form que queremos consumir.
withHistory false Com essa propriedade, cada transição de passo resultará em um push no history do browser do usuário, isso também permite o uso das setas do browser para navegação no formulário.
stepQueryParam "step" Durante a navegação do formulário a url da página conterá um parâmetro que indica o slug do passo atual, exemplo ?step=personal_data.
debug false Nos permite usar o parâmetro debug-step na url da página, com isso, podemos debugar um passo especifico do formulário, exemplo: ?debug-step=personal_data.

Para usarmos o Provider, devemos encapsular a aplicação ou o componente da página que queremos renderizar o formulário:

const App = () => {
  return <div> my app </div>;
};

export default withFirebolt(App);

Componentes

Wizard

O Wizard é semelhante ao Switch do react-router, ele define qual componente renderizar a cada passo do formulário e também é possível definir um componente padrão para ser utilizado. Além disso, possui características importantes como:

  • Rodar callbacks em situações especificas do formulário, por exemplo, na mudança de passo, caso haja um erro de conexão ou quando o formulário for finalizado;
  • Definir um componente de fallback, ou seja, renderizar um componente durante a transição de passos, por exemplo um loader.
import { Wizard, createFireboltProvider } from "@iq-firebolt/client";

const withFirebolt = createFireboltProvider();

const App = () => {
  return (
    <div>
      <h1>My form</h1>
      <Wizard
        fallback={<MyLoader />}
        onFinishForm={(payload) => {}}
        onConnectionError={(err) => {}}
        onBeforeChangeStep={(proceed, { leavingStep, enteringStep }) => {}}
        onChangeStep={({ sentStep, currentStep }) => {}}
      ></Wizard>
    </div>
  );
};

export default withFirebolt(App);

Props Wizard

Propriedade
Descrição
fallback Recebe um componente ou marcação que deve ser renderizada durante a requisição de transição de passos .
onFinishForm Callback que roda ao avançar o último passo, a função recebe um payload como argumento (ultima resposta da Firebolt api).
onConnectionError Esse callback deve rodar quando ocorre algum problema de conexão entre o Firebolt client e a API.
onBeforeChangeStep Quando o client recebe os dados de um novo passo da api, a transição não ocorre instantaneamente, esse callback pode ser utilizado para rodar algo antes que a transição ocorra, ou seja: Client requisita novo passo -> api retorna novo passo -> onBeforeChangeStep -> mudança de passo no estado atual do client, isso permite por exemplo redirecionar o usuário para algum site externo antes de renderizar o próximo passo do formulário.
onChangeStep Podemos usar esse callback para rodar algo após a transição de um passo para outro.

O Wizard renderiza/monta apenas um componente por vez, ou seja, se o formulário avançar para o próximo passo, o componente do template do passo atual será desmontado e o fallback ocupará o seu lugar.

Wizard.Step

O Wizard.Step funciona de forma similar ao Route do React router, ele fica responsável por atribuir a renderização de um componente especifico (template de passo/ step template) para um passo especifico do formulário. Com ele podemos definir utilizar um template padrão para os passos utilizando o pattern *:

import { Wizard, createFireboltProvider } from "@iq-firebolt/client";

// template components
import DefaultTemplate from "components/StepTemplates/Default";
import SummaryTemplate from "components/StepTemplates/Summary";

const withFirebolt = createFireboltProvider();

const App = () => {
  return (
    <div>
      <h1>My form</h1>
      <Wizard fallback={<MyLoader />}>
        {/* Default step template: */}
        <Wizard.Step match="*" component={DefaultTemplate} />
        {/* Custom template */}
        <Wizard.Step
          match={{ slug: "summary_step" }}
          component={SummaryTemplate}
        />
      </Wizard>
    </div>
  );
};

export default withFirebolt(App);

Props Wizard.Step

Propriedade
Descrição
match Utilizado como identificador. O pattern * pode ser utilizado para definir um template padrão. Ou podemos definir o slug do passo passando um objeto tipo: {slug: "step_slug"}.
component Componente que deve ser utilizado como template de passo.

Toda prop passada para o Wizard.Step é repassada para o componente que ele deve renderizar.

Template de passo

Todo componente que for utilizado como template de passo recebe uma prop chamada fireboltStep, ela contem algumas informações sobre o passo atual e alguns métodos para a navegação no formulário. Esses valores também podem ser obtidos utilizando o hook useFirebolt.

const DefaultStepTemplate = ({ fireboltStep }) => {
  function goToNextStep() {
    fireboltStep.goNextStep({ cpf: "030.136.450-83" });
  }

  return (
    <div>
      <h1 className="default-step">Step title</h1>
      <button onClick={goToNextStep}>Próximo</button>
    </div>
  );
};

export default DefaultStepTemplate;

Conteúdo da prop fireboltStep

Propriedade
Descrição
capturedData Objeto que contém toda informação preenchida pelo usuário nos passos anteriores.
clearSession Função para limpar a sessão do formulário e cancelar a progressão da experiência.
fields Sessão do JSON schema que descreve os campos necessários para o passo atual do formulário.
formFlowMetadata Dados gerais sobre o formulário (total de passos, nome e slug dos passos e etc).
friendlyName Nome amigável do passo atual. Utilizado para UI (Definido no JSON schema).
goNextStep Função que dispara a transição para o próximo passo. Recebe como argumento um payload, ou seja um mapa chave-valor do slug do campo e o valor que deve ser enviado para a firebolt api.
goPreviousStep Função que dispara a transição para o passo anterior do formulário.
position Numero da posição do passo atual em relação ao total de passos, pode ser usado para renderizar um contador na tela como “passo 2/4” (Inicia em 1).
remoteErrors Erros validação de campo da api.
slug Slug identificador do passo atual, o mesmo utilizado no Wizard.Step.
type Tipo do passo atual (form ou custom).
webhookResult Resultado da chamada de webhook que pode ter ocorrido entre o passo anterior e o passo atual, ele pode conter qualquer dado que tenha vindo de uma api terceira.

FireboltForm

A função do FireboltForm é transformar a parte do JSON Schema que descreve os campos necessários, em um formulário real. Ele mapeia e renderiza os campos, combinando eles com as inserções de conteúdo (Se necessário). exemplo:

import { FireboltForm } from "@iq-firebolt/client";

const DefaultStepTemplate = ({ fireboltStep }) => {
  return (
    <div>
      <h1 className="default-step">Step title</h1>
      <FireboltForm
        onSubmit={fireboltStep.goNextStep}
        schema={fireboltStep.fields}
        onGoBack={fireboltStep.goPreviousStep}
      />
    </div>
  );
};

export default DefaultStepTemplate;

Prop FireboltForm

Propriedade
Descrição
autofill Recebe um objeto chave-valor (slug do campo e valor) que automaticamente preenche o payload do formulário, ou seja, se o objeto {"name": "Marty Mcfly"} for passado para essa prop, o campo de nome deve ser automaticamente preenchido no formulário.
className Adiciona uma classe customizada ao elemento form.
customActionsChild Permite passar um componente para lidar com o envio ou regressão do formulário. Geralmente são passados botões customizados.
onChange Esse callback roda sempre que ocorre alguma alteração nos dados do formulário, ele passa o payload atualizado do formulário como argumento do callback.
onFocusField Recebe uma função de callback que retorna informações a respeito do campo em foco (slug do campo e valor).
onGoBack Função que deve rodar ao clicar no botão de voltar do passo.
onSubmit Função que deve rodar ao clicar no botão de submeter o passo.
previousBtnText Texto que deve ser renderizado no botão padrão de voltar.
remoteErrors Erros de validação de campo definidos por prop, pode ser usado para forçar um erro ou passa erros que vieram da firebolt api.
schema Parte do JSON Schema responsável por descrever os campos necessários para o passo.
submitBtnText Texto que deve ser renderizado no botão padrão de submeter.
theme Tema customizado para utilizar componentes diferentes para a renderização de campos. Exemplos de temas são o firebolt-blueberry e o padrão material. Um tema pode também implementar campos customizados.

FireboltForm.Insert

O FireboltForm.Insert nos permite inserir componentes entre campos que são gerados pelo FireboltForm, ele precisa apenas de uma referencia de onde deve ser inserido e o que ele deve renderizar:

import { FireboltForm } from "@iq-firebolt/client";

const DefaultStepTemplate = ({ fireboltStep }) => {
  return (
    <div>
      <h1 className="default-step">Step title</h1>
      <FireboltForm
        onSubmit={fireboltStep.goNextStep}
        schema={fireboltStep.fields}
        onGoBack={fireboltStep.goPreviousStep}
      >
        {/* Irá renderizar "something" depois do ultimo campo */}
        <FireboltForm.Insert after="last" render={<p>something</p>} />
        {/* Irá renderizar "something" antes do primeiro campo */}
        <FireboltForm.Insert before="first" render={<p>something</p>} />
        {/* Irá renderizar "something" antes do campo de cpf */}
        <FireboltForm.Insert
          before={{ fieldSlug: "cpf_field" }}
          render={<p>something</p>}
        />
      </FireboltForm>
    </div>
  );
};
export default DefaultStepTemplate;

A referencia pode ser last , first ou um objeto {fieldSlug: "field_slug"}

Propriedade
Descrição
after Renderiza a marcação antes da referência.
before Renderiza a marcação depois da referência.
render Componente ou marcação que deve ser renderizada.

StepForm

A função do StepForm é simplificar a escrita dos templates de passo. Ao encapsular o FireboltForm, todas as suas propriedades passam a ser igualmente suportadas no StepForm e o resultado será o mesmo, tanto utilizando o StepForm quanto o FireboltForm. A diferença está na forma com que ele é utilizado, pois muitas dessas propriedades não precisam ser informadas no StepForm , deixando o código menor.

Exemplo de template de passo com FireboltForm

import { FireboltForm } from "@iq-firebolt/client";
import fireboltBlueberry from "firebolt-blueberry"; // tema
import { ActionButtons } from "components/ActionButtons";

const DefaultStepTemplate = ({ fireboltStep }) => {
  const autofill = { cpf: "123.232.523.23" };
  return (
    <div>
      <h1>my step template</h1>
      <FireboltForm
        schema={fireboltStep?.fields}
        onSubmit={fireboltStep?.goNextStep}
        remoteErrors={fireboltStep?.remoteErrors}
        theme={fireboltBlueberry}
        autoFill={autofill}
        customActionsChild={({ formData }) => (
          <ActionButtons
            formData={formData}
            onGoBack={handleGoBackform}
            beforeSubmitStep={runBeforeChangeStep}
          />
        )}
      />
    </div>
  );
};

export default DefaultStepTemplate;

Exemplo de template de passo com StepForm

import { StepForm } from "@iq-firebolt/client";
import { ActionButtons } from "components/ActionButtons";

const DefaultStepTemplate = ({ fireboltStep }) => {
  const autofill = { cpf: "123.232.523.23" };
  return (
    <div>
      <h1>my step template</h1>
      <StepForm
        autoFill={autofill}
        customActionsChild={({ formData }) => (
          <ActionButtons
            formData={formData}
            onGoBack={handleGoBackform}
            beforeSubmitStep={runBeforeChangeStep}
          />
        )}
      />
    </div>
  );
};

export default DefaultStepTemplate;

StepForm.Insert

Como o StepForm encapsula o FireboltForm, precisamos de um Insert também para o StepForm. O StepForm.Insert funciona exatamente igual o FireboltForm.Insert, nos permitindo inserir componentes nos espaços entre campos que são gerados pelo FireboltForm, que aqui, está dentro StepForm .

import { StepForm } from "@iq-firebolt/client";

const DefaultStepTemplate = ({ fireboltStep }) => {
  return (
    <div>
      <h1 className="default-step">Step title</h1>
      <StepForm>
        {/* Irá renderizar "something" depois do ultimo campo */}
        <StepForm.Insert after="last" render={<p>something</p>} />
        {/* Irá renderizar "something" antes do primeiro campo */}
        <StepForm.Insert before="first" render={<p>something</p>} />
        {/* Irá renderizar "something" antes do campo de cpf */}
        <StepForm.Insert
          before={{ fieldSlug: "cpf_field" }}
          render={<p>something</p>}
        />
      </StepForm>
    </div>
  );
};

export default DefaultStepTemplate;

A referencia pode ser last , first ou um objeto {fieldSlug: "field_slug"}

Propriedade
Descrição
after Renderiza a marcação antes da referência.
before Renderiza a marcação depois da referência.
render Componente ou marcação que deve ser renderizada.