GQLEndpoint
Los GQLEndpoints son para protocolos basados en GraphQL.
GQLEndpoint extiende 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 del fetch
GQLEndpoint amplía Endpoint al ofrecer personalizaciones para un método fetch proporcionado.
- Preparar el fetch
- Ejecutar el fetch
async function fetch(variables) {
return this.fetchResponse(
this.url,
this.getRequestInit(variables),
).then(res => this.process(res, variables));
}
Preparar el fetch
Los miembros funcionan también como opciones (segundo argumento del constructor). Aunque ninguno es obligatorio, los primeros tienen valores por defecto.
url: string
GraphQL usa una sola url para todas las operaciones.
getRequestInit(body): RequestInit
Prepara el RequestInit que se usa en el fetch. Se envía a fetchResponse
getQuery(variables): string
Prepara la consulta (query), que se envía como parte del cuerpo de la petición.
getHeaders(headers: HeadersInit): HeadersInit
Lo llama getRequestInit para determinar los encabezados HTTP
Esto suele ser útil para la autenticación
No uses hooks aquí.
Manejar el fetch
fetchResponse(input, init): Promise
Realiza la llamada fetch
parseResponse(response): Promise
Toma la Response y la interpreta con .text() o .json()
process(value, ...args): any
Aplica cualquier transformación al resultado ya interpretado. Por defecto es la función identidad.
Ciclos de vida del Endpoint
schema: Schema
Definición declarativa de cómo procesar las respuestas
No proporcionar esta opción significa que no se extraerá ninguna entidad.
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
Tiempo de vida personalizado en la caché de los datos del recurso obtenido. Sobrescribirá el valor establecido en NetworkManager.
Más información sobre el tiempo de caducidad
errorExpiryLength?: number
Tiempo de vida personalizado de los errores de datos del recurso obtenido. Sobrescribirá el valor establecido en NetworkManager.
errorPolicy?: (error: any) => 'soft' | undefined
'soft' usará datos obsoletos (si existen) en caso de error; undefined o no proporcionar la opción resultará en un error.
Más información sobre errorPolicy
errorPolicy(error) {
return error.status >= 500 ? 'soft' : undefined;
}
invalidIfStale: boolean
Indica que los datos obsoletos deben considerarse inutilizables y, por tanto, no devolverse desde la caché. Esto significa que useSuspense() se suspenderá cuando los datos estén obsoletos, aunque ya existan en la caché.
pollFrequency: number
Frecuencia de sondeo (polling) en milisegundos. Requiere usar useSubscription() o useLive() para tener efecto.
getOptimisticResponse: (snap, ...args) => fakePayload
Cuando se proporciona, cualquier fetch con este endpoint se comportará como si el valor de retorno fakePayload
de esta función fuera una respuesta de red exitosa. Cuando el fetch real se completa (sea cual sea
su resultado, éxito o fallo), la actualización optimista se reemplaza por la respuesta de red real.
extend(options): Endpoint
Se puede usar para personalizar aún más la definición del endpoint
const gql = new GQLEndpoint('https://nosy-baritone.glitch.me');
const authGQL = gql.extend({
getHeaders(headers: HeadersInit): HeadersInit {
return {
...headers,
'Access-Token': getAuth(),
};
},
});