Skip to content

Commit bf9d08a

Browse files
committed
1 parent e73b0e0 commit bf9d08a

File tree

1 file changed

+30
-28
lines changed

1 file changed

+30
-28
lines changed

packages/react-async/src/useAsync.tsx

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -254,29 +254,42 @@ const parseResponse = (accept: undefined | string, json: undefined | boolean) =>
254254
return accept === "application/json" ? res.json() : res
255255
}
256256

257+
type OverrideParams = { resource?: RequestInfo } & Partial<RequestInit>
258+
257259
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
260262
run(ignoredEvent: React.SyntheticEvent): void
261263
run(ignoredEvent: Event): void
262264
run(): void
263265
}
264266

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+
265278
/**
266279
*
267-
* @param {RequestInfo} input
280+
* @param {RequestInfo} resource
268281
* @param {RequestInit} init
269282
* @param {FetchOptions} options
270283
* @returns {AsyncState<T, FetchRun<T>>}
271284
*/
272285
const useAsyncFetch = <T extends {}>(
273-
input: RequestInfo,
286+
resource: RequestInfo,
274287
init: RequestInit,
275288
{ defer, json, ...options }: FetchOptions<T> = {}
276289
): AsyncState<T, FetchRun<T>> => {
277-
const method = (input as Request).method || (init && init.method)
290+
const method = (resource as Request).method || (init && init.method)
278291
const headers: Headers & Record<string, any> =
279-
(input as Request).headers || (init && init.headers) || {}
292+
(resource as Request).headers || (init && init.headers) || {}
280293
const accept: string | undefined =
281294
headers["Accept"] || headers["accept"] || (headers.get && headers.get("accept"))
282295
const doFetch = (input: RequestInfo, init: RequestInit) =>
@@ -285,38 +298,27 @@ const useAsyncFetch = <T extends {}>(
285298
typeof defer === "boolean" ? defer : ["POST", "PUT", "PATCH", "DELETE"].indexOf(method!) !== -1
286299
const fn = isDefer ? "deferFn" : "promiseFn"
287300
const identity = JSON.stringify({
288-
input,
301+
resource,
289302
init,
290303
isDefer,
291304
})
292305
const promiseFn = useCallback(
293306
(_: AsyncOptions<T>, { signal }: AbortController) => {
294-
return doFetch(input, {
295-
signal,
296-
...init,
297-
})
307+
return doFetch(resource, { signal, ...init })
298308
},
299309
[identity] // eslint-disable-line react-hooks/exhaustive-deps
300310
)
301311
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 })
309319
}
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 })
320322
},
321323
[identity] // eslint-disable-line react-hooks/exhaustive-deps
322324
)

0 commit comments

Comments
 (0)