1
+ import { DocumentNode } from 'graphql'
2
+ import { ClientError } from 'graphql-request'
1
3
import { BaseQueryFn , createApi } from '@reduxjs/toolkit/query/react'
2
- import { request , gql } from " graphql-request" ;
4
+ import { request , gql } from ' graphql-request'
3
5
4
6
export const postStatuses = [ 'draft' , 'published' , 'pending_review' ] as const
5
7
@@ -22,7 +24,7 @@ export interface Pagination {
22
24
23
25
export interface GetPostsResponse extends Pagination {
24
26
data : {
25
- posts : Post [ ] ;
27
+ posts : Post [ ]
26
28
}
27
29
}
28
30
@@ -32,48 +34,64 @@ interface PostResponse {
32
34
}
33
35
}
34
36
35
- const graphqlBaseQuery = ( { baseUrl } : { baseUrl : string ; } = { baseUrl : '' } ) : BaseQueryFn < any , unknown , any > => async ( { body, variables } ) => {
36
- const result = await request ( baseUrl , body , variables ) ;
37
- return { data : result } ;
38
- } ;
37
+ export const graphqlBaseQuery = ( {
38
+ baseUrl,
39
+ } : {
40
+ baseUrl : string
41
+ } ) : BaseQueryFn <
42
+ { document : string | DocumentNode ; variables ?: any } ,
43
+ unknown ,
44
+ ClientError
45
+ > => async ( { document, variables } ) => {
46
+ try {
47
+ return { data : await request ( baseUrl , document , variables ) }
48
+ } catch ( error ) {
49
+ if ( error instanceof ClientError ) {
50
+ return { error }
51
+ }
52
+ throw error
53
+ }
54
+ }
39
55
40
56
export const api = createApi ( {
41
57
baseQuery : graphqlBaseQuery ( {
42
- baseUrl : " /graphql"
58
+ baseUrl : ' /graphql' ,
43
59
} ) ,
44
60
endpoints : ( builder ) => ( {
45
- getPosts : builder . query < GetPostsResponse , { page ?: number ; per_page ?: number ; } > ( {
61
+ getPosts : builder . query <
62
+ GetPostsResponse ,
63
+ { page ?: number ; per_page ?: number }
64
+ > ( {
46
65
query : ( { page, per_page } ) => ( {
47
- body : gql `
66
+ document : gql `
48
67
query GetPosts($page: Int = 1, $per_page: Int = 10) {
49
68
posts(page: $page, per_page: $per_page) {
50
69
id
51
70
title
52
- },
71
+ }
53
72
}
54
73
` ,
55
74
variables : {
56
75
page,
57
- per_page
58
- }
76
+ per_page,
77
+ } ,
59
78
} ) ,
60
79
} ) ,
61
80
getPost : builder . query < Post , string > ( {
62
81
query : ( id ) => ( {
63
- body : gql `
82
+ document : gql `
64
83
query GetPost($id: ID!) {
65
84
post(id: ${ id } ) {
66
85
id
67
86
title
68
87
body
69
88
}
70
89
}
71
- `
90
+ ` ,
72
91
} ) ,
73
- transformResponse : ( response : PostResponse ) => response . data . post
74
- } )
75
- } )
76
- } ) ;
77
-
92
+ transformResponse : ( response : PostResponse ) => response . data . post ,
93
+ } ) ,
94
+ } ) ,
95
+ } )
78
96
79
- export const { useGetPostsQuery, useGetPostQuery } = api
97
+ export const { useGetPostsQuery, useGetPostQuery } = api
0 commit comments