rtk-query-graphql
Version:
It helps you to make queries to a server that is using graphql
48 lines (43 loc) • 1.48 kB
text/typescript
import { BaseQueryFn } from "@reduxjs/toolkit/query/react";
import { DocumentNode } from "graphql";
import { GraphQLClient, ClientError } from "graphql-request";
type P = Parameters<GraphQLClient["request"]>;
export type Document = P[0];
export type Variables = P[1];
export type ReturnRequestHeaders = P[2];
export type RequestHeaders = (
setHeaders: (headers: RequestInit["headers"] | undefined) => GraphQLClient,
setHeader: (key: string, value: string) => GraphQLClient
) => ReturnRequestHeaders;
export const graphqlFetch = (
options:
| {
url: string;
prepareHeaders?: RequestHeaders;
}
| {
client: GraphQLClient;
prepareHeaders: undefined;
}
): BaseQueryFn<
{ document: string | DocumentNode; variables?: any },
unknown,
Pick<ClientError, "name" | "message" | "stack">,
Partial<Pick<ClientError, "request" | "response">>
> => {
const client =
"client" in options ? options.client : new GraphQLClient(options.url);
!!options.prepareHeaders &&
options.prepareHeaders(client.setHeaders, client.setHeader);
return async ({ document, variables }) => {
try {
return { data: await client.request(document, variables), meta: {} };
} catch (error) {
if (error instanceof ClientError) {
const { name, message, stack, request, response } = error;
return { error: { name, message, stack }, meta: { request, response } };
}
throw error;
}
};
};