GQLEndpoint
GQLEndpoints são para protocolos baseados em GraphQL.
GQLEndpoint estende Endpoint
Uso
import { UserResource } from './resources'; export default function ProfileEdit({ id }: { id: number }) { const { user } = useSuspense(UserResource.get, { id }); const controller = useController(); const handleChange = ({ currentTarget: { value: name } }) => controller.fetch(UserResource.update, { id, name }); return ( <TextInput label="Name" value={user.name} onChange={handleChange} /> ); }
query(gql, schema)
import { GQLEndpoint } from '@data-client/graphql';
import User from 'schema/User';
const gql = new GQLEndpoint('/');
export const getUser = gql.query(
(v: { name: string }) => `query getUser($name: String!) {
user(name: $name) {
id
name
email
}
}`,
{ user: User },
);
getUser({ name: 'bob' });
mutate(gql, schema)
import { GQLEndpoint } from '@data-client/graphql';
import User from 'schema/User';
const gql = new GQLEndpoint('/');
export const updateUser = gql.mutate(
(v: Partial<User>) => `query updateUser($user: User!) {
user(name: $user) {
id
name
email
}
}`,
{ user: User },
);
Ciclo de vida do fetch
O GQLEndpoint acrescenta ao Endpoint personalizações para um método de fetch fornecido.
- Preparar o fetch
- Executar o fetch
async function fetch(variables) {
return this.fetchResponse(
this.url,
this.getRequestInit(variables),
).then(res => this.process(res, variables));
}
Preparar o fetch
Os membros também funcionam como opções (segundo argumento do construtor). Embora nenhum seja obrigatório, os primeiros têm valores padrão.
url: string
O GraphQL usa uma única url para todas as operações.
getRequestInit(body): RequestInit
Prepara o RequestInit usado no fetch. Ele é enviado para fetchResponse
getQuery(variables): string
Prepara a query, que será enviada como parte do corpo da requisição.
getHeaders(headers: HeadersInit): HeadersInit
Chamado por getRequestInit para determinar os Headers HTTP
Isso costuma ser útil para autenticação
Não use hooks aqui.
Tratar o fetch
fetchResponse(input, init): Promise
Executa a chamada de fetch
parseResponse(response): Promise
Recebe a Response e faz o parse via .text() ou .json()
process(value, ...args): any
Aplica quaisquer transformações ao resultado do parse. O padrão é a função identidade.
Ciclos de vida do Endpoint
schema: Schema
Definição declarativa de como processar as respostas
Não informar esta opção significa que nenhuma entity será extraída.
import { GQLEntity, GQLEndpoint } from '@data-client/graphql';
const gql = new GQLEndpoint('https://nosy-baritone.glitch.me');
class User extends GQLEntity {
username = '';
}
export const getUser = gql.query(
(v: { name: string }) => `query GetUser($name: String!) {
user(name: $name) {
id
name
email
}
}`,
{ user: User },
);
dataExpiryLength?: number
Tempo de vida personalizado, no cache, dos dados do recurso buscado. Substitui o valor definido no NetworkManager.
Saiba mais sobre o tempo de expiração
errorExpiryLength?: number
Tempo de vida personalizado dos erros de dados do recurso buscado. Substitui o valor definido no NetworkManager.
errorPolicy?: (error: any) => 'soft' | undefined
'soft' usará dados desatualizados (se existirem) em caso de erro; undefined, ou não informar a opção, resultará em erro.
errorPolicy(error) {
return error.status >= 500 ? 'soft' : undefined;
}
invalidIfStale: boolean
Indica que dados desatualizados devem ser considerados inutilizáveis e, portanto, não ser retornados do cache. Isso significa que useSuspense() vai suspender quando os dados estiverem desatualizados, mesmo que já existam no cache.
pollFrequency: number
Frequência, em milissegundos, do polling. Requer o uso de useSubscription() ou useLive() para ter efeito.
getOptimisticResponse: (snap, ...args) => fakePayload
Quando informado, qualquer fetch com este endpoint se comportará como se o valor de retorno fakePayload
desta função fosse uma resposta de rede bem-sucedida. Quando o fetch real for concluído (com falha
ou com sucesso), a atualização otimista será substituída pela resposta real da rede.
extend(options): Endpoint
Pode ser usado para personalizar ainda mais a definição do endpoint
const gql = new GQLEndpoint('https://nosy-baritone.glitch.me');
const authGQL = gql.extend({
getHeaders(headers: HeadersInit): HeadersInit {
return {
...headers,
'Access-Token': getAuth(),
};
},
});