Eitri-Apps permitem que você utilize várias dependências disponíveis na plataforma Eitri para estender a funcionalidade da sua aplicação. Este guia explica como declarar e usar essas dependências.

Dependências Suportadas e Versões

Eitri-Apps suportam uma lista curada de bibliotecas de terceiros com controle de versão rigoroso para garantir estabilidade e compatibilidade. Sempre consulte a documentação oficial ou seu eitri-app.conf.js para as versões exatas suportadas.

Aqui está uma amostra de dependências comumente usadas:

Biblioteca Versão Biblioteca Versão
dayjs 1.11.19 eitri-i18n 14.1.2
qs 6.13.0 uuid 11.1.0
@fnando/cpf 1.0.2 @fnando/cnpj 1.0.2
@apollo/client 4.1.3 recaptcha 2
react-icons 5.5.0 liveshop 1.0.0
google-map-react 2.2.5
@tanstack/react-query 4.41.0

Declarando Dependências (eitri-app.conf.js)

Todas as dependências, sejam Eitri-Apps compartilhados ou bibliotecas padrão, devem ser declaradas no seu arquivo eitri-app.conf.js.

Estrutura

Cada dependência é definida como um objeto dentro da seção "eitri-app-dependencies", especificando sua version. Para Eitri-Apps compartilhados, você também deve incluir isEitriAppShared: true.

module.exports = {
  version: "1.0.1",
  "eitri-app-dependencies": {
    // Exemplo de um Eitri-App Compartilhado
    "eitri-shopping-vtex-shared": { isEitriAppShared: true, version: "2.0.0" },

    // Exemplos de Bibliotecas Opcionais Padrão
    dayjs: { version: "1.11.19" },
    "@tanstack/react-query": { version: "4.41.0" },
    "react-icons": { version: "5.5.0" },
  },
};

Usando Dependências no Seu Código

Uma vez declaradas em eitri-app.conf.js, você pode importar e usar essas dependências em seus componentes React como faria normalmente.

Exemplo com dayjs:

import dayjs from "dayjs";
import { Text } from "eitri-luminus";

export default function MyComponent() {
  const formattedDate = dayjs().format("YYYY-MM-DD");

  return <Text>Data de Hoje: {formattedDate}</Text>;
}

Exemplo com react-icons:

import { FaBeer } from "react-icons/fa";
import { View } from "eitri-luminus";

export default function IconDisplay() {
  return (
    <View>
      <FaBeer size={24} color="gold" />
    </View>
  );
}

Seguindo estas diretrizes, você pode gerenciar e utilizar efetivamente dependências externas em seus Eitri-Apps.

Integração com Apollo Client

O Eitri fornece uma implementação personalizada do Apollo Link que permite que requisições GraphQL sejam processadas através da camada nativa do dispositivo. Essa integração é essencial para Eitri-Apps que precisam se comunicar com APIs GraphQL usando a infraestrutura de rede do Super App, garantindo comportamento consistente e aproveitando as capacidades nativas.

Benefícios Principais

  • Aproveita a pilha HTTP nativa para melhor desempenho e confiabilidade
  • Permite acesso a recursos nativos como pinning de certificado e gerenciamento de cookies
  • Compartilha a mesma sessão de rede do Super App hospedeiro
  • Fornece integração perfeita com o ecossistema Eitri

Configuração Básica

Para usar o Apollo Client com o Eitri, você precisará configurá-lo com a função personalizada createEitriLink:

import { createEitriLink } from "@eitri-helper/apollo";
import { ApolloClient, InMemoryCache } from "@apollo/client";

const client = new ApolloClient({
  link: createEitriLink({
    uri: "https://api.exemplo.com/graphql",
    headers: {
      Authorization: "Bearer seu-token-aqui",
      "Content-Type": "application/json",
    },
  }),
  cache: new InMemoryCache(),
});

Integração com Provedores da Aplicação

O Apollo Client deve ser integrado à hierarquia de provedores da sua aplicação. O arquivo src/providers/__main__.tsx serve como o invólucro principal do provedor para toda a aplicação. Você pode ler mais sobre provedores na documentação de provedores.

import { createContext } from "react";
import UserProvider from "./User";
import { ApolloClient, InMemoryCache } from "@apollo/client";
import { ApolloProvider } from "@apollo/client/react";
import { createEitriLink } from "@eitri-helper/apollo";

type MainContextType = {};

const MainContext = createContext({} as MainContextType);

export default function MainProvider({ children }) {
  const client = new ApolloClient({
    cache: new InMemoryCache(),
    link: createEitriLink({
      uri: "https://sua-api-graphql.com/graphql",
      headers: {
        // Adicione quaisquer cabeçalhos adicionais exigidos pela sua API
        "X-API-Key": "sua-chave-de-api",
        Authorization: "Bearer seu-token-de-acesso",
      },
    }),
  });

  return (
    <MainContext.Provider value={{}}>
      <ApolloProvider client={client}>
        <UserProvider>{children}</UserProvider>
      </ApolloProvider>
    </MainContext.Provider>
  );
}

Opções de Configuração

A função createEitriLink aceita um objeto de opções com as seguintes propriedades:

export interface EitriLinkOptions {
  /** A URL do endpoint GraphQL */
  uri: string;
  /** Cabeçalhos HTTP adicionais para incluir nas requisições */
  headers?: Record<string, string>;
}

Propriedades Obrigatórias:

  • uri (string): A URL do endpoint GraphQL. Este campo é obrigatório e especifica onde seu servidor GraphQL está localizado.

Propriedades Opcionais:

  • headers (Record, opcional): Um objeto contendo cabeçalhos HTTP adicionais para incluir em todas as requisições GraphQL. Cabeçalhos comuns incluem tokens de autorização, chaves de API e especificações de tipo de conteúdo.

Fazendo Consultas GraphQL

Uma vez configurado, você pode usar os hooks do Apollo Client para fazer consultas GraphQL em seus componentes:

import { gql, useQuery } from "@apollo/client";
import { View, Text } from "eitri-luminus";

const GET_USER_QUERY = gql`
  query GetUser($id: ID!) {
    user(id: $id) {
      id
      name
      email
    }
  }
`;

export default function UserProfile({ userId }: { userId: string }) {
  const { loading, error, data } = useQuery(GET_USER_QUERY, {
    variables: { id: userId },
  });

  if (loading) return <Text>Carregando...</Text>;
  if (error) return <Text>Erro: {error.message}</Text>;

  return (
    <View>
      <Text>Usuário: {data.user.name}</Text>
      <Text>Email: {data.user.email}</Text>
    </View>
  );
}

Essa configuração garante que suas requisições GraphQL sejam roteadas corretamente através da camada nativa do Eitri, aproveitando a infraestrutura de rede e os recursos de segurança do Super App.

Trabalhando com Arquivos GraphQL

O Eitri suporta as extensões de arquivo .gql e .graphql para organizar suas queries e mutações GraphQL. Você pode importar esses arquivos diretamente em seus componentes:

import { GET_CART } from "../queries/get-cart.gql";

Quando você define queries nesses arquivos, elas são importadas como strings que podem ser usadas com o Apollo Client:

query GET_CART($cartId: ID!) {
  cart(id: $cartId) {
    id
    totalQuantity
  }
}

query GET_CART_QUANTITY($cartId: ID!) {
  cart(id: $cartId) {
    id
    totalQuantity
  }
}

Você pode então usar a query importada diretamente com a tag gql do Apollo ou em seus hooks:

import { GET_CART } from "../queries/get-cart.gql";
import { gql, useQuery } from "@apollo/client";

// Usando a query importada com gql
const { loading, error, data } = useQuery(gql(GET_CART), {
  variables: { cartId: "algum-id" },
});

Essa abordagem permite que você organize suas operações GraphQL em arquivos separados, mantendo seu código de componente limpo e mantendo uma separação clara de responsabilidades. Você pode criar um diretório dedicado para todas as suas queries e mutações, tornando-as fáceis de gerenciar e reutilizar em toda a sua aplicação.