@@ -254,29 +254,42 @@ const parseResponse = (accept: undefined | string, json: undefined | boolean) =>
254
254
return accept === "application/json" ? res . json ( ) : res
255
255
}
256
256
257
+ type OverrideParams = { resource ?: RequestInfo } & Partial < RequestInit >
258
+
257
259
interface FetchRun < T > extends Omit < AbstractState < T > , "run" > {
258
- run ( overrideInit : ( init : RequestInit ) => RequestInit ) : void
259
- run ( overrideInit : Partial < RequestInit > ) : void
260
+ run ( overrideParams : ( params ?: OverrideParams ) => OverrideParams ) : void
261
+ run ( overrideParams : OverrideParams ) : void
260
262
run ( ignoredEvent : React . SyntheticEvent ) : void
261
263
run ( ignoredEvent : Event ) : void
262
264
run ( ) : void
263
265
}
264
266
267
+ type FetchRunArgs =
268
+ | [ ( params ?: OverrideParams ) => OverrideParams ]
269
+ | [ OverrideParams ]
270
+ | [ React . SyntheticEvent ]
271
+ | [ Event ]
272
+ | [ ]
273
+
274
+ function isEvent ( e : FetchRunArgs [ 0 ] ) : e is Event | React . SyntheticEvent {
275
+ return typeof e === "object" && "preventDefault" in e
276
+ }
277
+
265
278
/**
266
279
*
267
- * @param {RequestInfo } input
280
+ * @param {RequestInfo } resource
268
281
* @param {RequestInit } init
269
282
* @param {FetchOptions } options
270
283
* @returns {AsyncState<T, FetchRun<T>> }
271
284
*/
272
285
const useAsyncFetch = < T extends { } > (
273
- input : RequestInfo ,
286
+ resource : RequestInfo ,
274
287
init : RequestInit ,
275
288
{ defer, json, ...options } : FetchOptions < T > = { }
276
289
) : AsyncState < T , FetchRun < T > > => {
277
- const method = ( input as Request ) . method || ( init && init . method )
290
+ const method = ( resource as Request ) . method || ( init && init . method )
278
291
const headers : Headers & Record < string , any > =
279
- ( input as Request ) . headers || ( init && init . headers ) || { }
292
+ ( resource as Request ) . headers || ( init && init . headers ) || { }
280
293
const accept : string | undefined =
281
294
headers [ "Accept" ] || headers [ "accept" ] || ( headers . get && headers . get ( "accept" ) )
282
295
const doFetch = ( input : RequestInfo , init : RequestInit ) =>
@@ -285,38 +298,27 @@ const useAsyncFetch = <T extends {}>(
285
298
typeof defer === "boolean" ? defer : [ "POST" , "PUT" , "PATCH" , "DELETE" ] . indexOf ( method ! ) !== - 1
286
299
const fn = isDefer ? "deferFn" : "promiseFn"
287
300
const identity = JSON . stringify ( {
288
- input ,
301
+ resource ,
289
302
init,
290
303
isDefer,
291
304
} )
292
305
const promiseFn = useCallback (
293
306
( _ : AsyncOptions < T > , { signal } : AbortController ) => {
294
- return doFetch ( input , {
295
- signal,
296
- ...init ,
297
- } )
307
+ return doFetch ( resource , { signal, ...init } )
298
308
} ,
299
309
[ identity ] // eslint-disable-line react-hooks/exhaustive-deps
300
310
)
301
311
const deferFn = useCallback (
302
- ( [ override ] : any [ ] , _ : AsyncOptions < T > , { signal } : AbortController ) => {
303
- if ( typeof override === "object" && "preventDefault" in override ) {
304
- // Don't spread Events or SyntheticEvents
305
- return doFetch ( input , {
306
- signal ,
307
- ...init ,
308
- } )
312
+ function ( [ override ] : FetchRunArgs , _ : AsyncOptions < T > , { signal } : AbortController ) {
313
+ if ( ! override || isEvent ( override ) ) {
314
+ return doFetch ( resource , { signal , ... init } )
315
+ }
316
+ if ( typeof override === "function" ) {
317
+ const { resource : runResource , ...runInit } = override ( { resource , signal , ... init } )
318
+ return doFetch ( runResource || resource , { signal , ... runInit } )
309
319
}
310
- return typeof override === "function"
311
- ? doFetch ( input , {
312
- signal,
313
- ...override ( init ) ,
314
- } )
315
- : doFetch ( input , {
316
- signal,
317
- ...init ,
318
- ...override ,
319
- } )
320
+ const { resource : runResource , ...runInit } = override
321
+ return doFetch ( runResource || resource , { signal, ...init , ...runInit } )
320
322
} ,
321
323
[ identity ] // eslint-disable-line react-hooks/exhaustive-deps
322
324
)
0 commit comments