|
1 |
| -import { BaseQueryFn } from "@reduxjs/toolkit/query/react"; |
2 |
| -import { DocumentNode } from "graphql"; |
3 |
| -import { GraphQLClient, ClientError } from "graphql-request"; |
| 1 | +import { isPlainObject } from '@reduxjs/toolkit' |
| 2 | +import type { BaseQueryFn } from '@reduxjs/toolkit/query' |
| 3 | +import type { DocumentNode } from 'graphql' |
| 4 | +import { GraphQLClient, ClientError } from 'graphql-request' |
| 5 | +import type { |
| 6 | + GraphqlRequestBaseQueryArgs, |
| 7 | + RequestHeaders, |
| 8 | +} from './GraphqlBaseQueryTypes' |
4 | 9 |
|
5 |
| -type P = Parameters<GraphQLClient["request"]>; |
6 |
| -export type Document = P[0]; |
7 |
| -export type Variables = P[1]; |
8 |
| -export type RequestHeaders = P[2]; |
9 |
| - |
10 |
| -export const graphqlRequestBaseQuery = ( |
11 |
| - options: |
12 |
| - | { url: string; requestHeaders?: RequestHeaders } |
13 |
| - | { client: GraphQLClient } |
14 |
| -): BaseQueryFn< |
| 10 | +export const graphqlRequestBaseQuery = ({ |
| 11 | + options, |
| 12 | + prepareHeaders = (x) => x, |
| 13 | +}: GraphqlRequestBaseQueryArgs): BaseQueryFn< |
15 | 14 | { document: string | DocumentNode; variables?: any },
|
16 | 15 | unknown,
|
17 |
| - Pick<ClientError, "name" | "message" | "stack">, |
18 |
| - Partial<Pick<ClientError, "request" | "response">> |
| 16 | + Pick<ClientError, 'name' | 'message' | 'stack'>, |
| 17 | + Partial<Pick<ClientError, 'request' | 'response'>> |
19 | 18 | > => {
|
20 | 19 | const client =
|
21 |
| - "client" in options ? options.client : new GraphQLClient(options.url); |
22 |
| - if ("requestHeaders" in options) { |
23 |
| - client.setHeaders(options.requestHeaders); |
24 |
| - } |
25 |
| - return async ({ document, variables }) => { |
| 20 | + 'client' in options ? options.client : new GraphQLClient(options.url) |
| 21 | + const requestHeaders: RequestHeaders = |
| 22 | + 'requestHeaders' in options ? options.requestHeaders : {} |
| 23 | + |
| 24 | + return async ( |
| 25 | + { document, variables }, |
| 26 | + { getState, endpoint, forced, type } |
| 27 | + ) => { |
26 | 28 | try {
|
27 |
| - return { data: await client.request(document, variables), meta: {} }; |
| 29 | + const headers = new Headers(stripUndefined(requestHeaders)) |
| 30 | + |
| 31 | + client.setHeaders( |
| 32 | + await prepareHeaders(headers, { getState, endpoint, forced, type }) |
| 33 | + ) |
| 34 | + return { data: await client.request(document, variables), meta: {} } |
28 | 35 | } catch (error) {
|
29 | 36 | if (error instanceof ClientError) {
|
30 |
| - const { name, message, stack, request, response } = error; |
31 |
| - return { error: { name, message, stack }, meta: { request, response } }; |
| 37 | + const { name, message, stack, request, response } = error |
| 38 | + return { error: { name, message, stack }, meta: { request, response } } |
32 | 39 | }
|
33 |
| - throw error; |
| 40 | + throw error |
34 | 41 | }
|
35 |
| - }; |
36 |
| -}; |
| 42 | + } |
| 43 | +} |
| 44 | + |
| 45 | +function stripUndefined(obj: any) { |
| 46 | + if (!isPlainObject(obj)) { |
| 47 | + return obj |
| 48 | + } |
| 49 | + const copy: Record<string, any> = { ...obj } |
| 50 | + for (const [k, v] of Object.entries(copy)) { |
| 51 | + if (typeof v === 'undefined') delete copy[k] |
| 52 | + } |
| 53 | + return copy |
| 54 | +} |
0 commit comments