11import React , { useMemo , createContext , useContext } from "react" ;
22
3+ import { createBatchingExecutor } from "@graphql-tools/batch-execute" ;
4+ import { AsyncExecutor , ExecutionResult } from "@graphql-tools/utils" ;
35import { TypedDocumentNode } from "@graphql-typed-document-node/core" ;
46import { create , windowedFiniteBatchScheduler , Batcher } from "@yornaath/batshit" ;
57import { request } from "graphql-request" ;
68
79import { debounceErrorToast } from "utils/debounceErrorToast" ;
810import { getGraphqlUrl } from "utils/getGraphqlUrl" ;
9-
1011interface IGraphqlBatcher {
1112 graphqlBatcher : Batcher < any , IQuery > ;
1213}
@@ -21,19 +22,35 @@ interface IQuery {
2122
2223const Context = createContext < IGraphqlBatcher | undefined > ( undefined ) ;
2324
25+ const executor : AsyncExecutor = async ( { document, variables, extensions } ) => {
26+ try {
27+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
28+ //@ts -ignore
29+ const result = request ( extensions . url , document , variables ) . then ( ( res ) => ( {
30+ data : res ,
31+ } ) ) as Promise < ExecutionResult > ;
32+
33+ return result ;
34+ } catch ( error ) {
35+ console . error ( "Graph error: " , { error } ) ;
36+ debounceErrorToast ( "Graph query error: failed to fetch data." ) ;
37+ return { data : { } } ;
38+ }
39+ } ;
40+
41+ const batchExec = createBatchingExecutor ( executor ) ;
42+
2443const fetcher = async ( queries : IQuery [ ] ) => {
25- const promises = queries . map ( async ( { id, document, variables, isDisputeTemplate, chainId } ) => {
26- const url = getGraphqlUrl ( isDisputeTemplate ?? false , chainId ) ;
27- try {
28- return request ( url , document , variables ) . then ( ( result ) => ( { id, result } ) ) ;
29- } catch ( error ) {
30- console . error ( "Graph error: " , { error } ) ;
31- debounceErrorToast ( "Graph query error: failed to fetch data." ) ;
32- return { id, result : { } } ;
33- }
34- } ) ;
35- const data = await Promise . all ( promises ) ;
36- return data ;
44+ const batchdata = await Promise . all (
45+ queries . map ( ( { document, variables, isDisputeTemplate, chainId } ) =>
46+ batchExec ( { document, variables, extensions : { url : getGraphqlUrl ( isDisputeTemplate ?? false , chainId ) } } )
47+ )
48+ ) ;
49+
50+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
51+ //@ts -ignore
52+ const processedData = batchdata . map ( ( data , index ) => ( { id : queries [ index ] . id , result : data . data } ) ) ;
53+ return processedData ;
3754} ;
3855
3956const GraphqlBatcherProvider : React . FC < { children ?: React . ReactNode } > = ( { children } ) => {
0 commit comments