From d10cbe416a943f2ff190c5ed4d1eb7d0e06bd9d5 Mon Sep 17 00:00:00 2001 From: Fabien BERNARD Date: Thu, 12 Dec 2019 15:50:19 +0100 Subject: [PATCH] Make request options asyncable --- src/Context.tsx | 6 +++--- src/Get.tsx | 9 +++++---- src/Mutate.tsx | 2 +- src/Poll.tsx | 6 +++--- src/useGet.tsx | 4 ++-- src/useMutate.tsx | 4 ++-- 6 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/Context.tsx b/src/Context.tsx index 3e5e454b..ae1e84d7 100644 --- a/src/Context.tsx +++ b/src/Context.tsx @@ -18,7 +18,7 @@ export interface RestfulReactProviderProps { /** * Options passed to the fetch request. */ - requestOptions?: (() => Partial) | Partial; + requestOptions?: (() => Partial | Promise>) | Partial; /** * Trigger on each error. * For `Get` and `Mutation` calls, you can also call `retry` to retry the exact same request. @@ -48,7 +48,7 @@ export interface InjectedProps { } export default class RestfulReactProvider extends React.Component> { - static displayName = "RestfulProviderContext"; + public static displayName = "RestfulProviderContext"; public render() { const { children, ...value } = this.props; @@ -69,4 +69,4 @@ export default class RestfulReactProvider extends React.Component extends React.Component< this.abortController.abort(); } - public getRequestOptions = ( + public getRequestOptions = async ( extraOptions?: Partial, extraHeaders?: boolean | { [key: string]: string }, ) => { const { requestOptions } = this.props; if (typeof requestOptions === "function") { + const options = (await requestOptions()) || {}; return { ...extraOptions, - ...requestOptions(), + ...options, headers: new Headers({ ...(typeof extraHeaders !== "boolean" ? extraHeaders : {}), ...(extraOptions || {}).headers, - ...(requestOptions() || {}).headers, + ...options.headers, }), }; } @@ -254,7 +255,7 @@ class ContextlessGet extends React.Component< return url; }; - const request = new Request(makeRequestPath(), this.getRequestOptions(thisRequestOptions)); + const request = new Request(makeRequestPath(), await this.getRequestOptions(thisRequestOptions)); try { const response = await fetch(request, { signal: this.signal }); const { data, responseError } = await processResponse(response); diff --git a/src/Mutate.tsx b/src/Mutate.tsx index d1f50995..417cd312 100644 --- a/src/Mutate.tsx +++ b/src/Mutate.tsx @@ -166,7 +166,7 @@ class ContextlessMutate extends React headers: { "content-type": typeof body === "object" ? "application/json" : "text/plain", ...(typeof providerRequestOptions === "function" - ? providerRequestOptions().headers + ? (await providerRequestOptions()).headers : (providerRequestOptions || {}).headers), ...(mutateRequestOptions ? mutateRequestOptions.headers : {}), }, diff --git a/src/Poll.tsx b/src/Poll.tsx index a7e234f2..56921632 100644 --- a/src/Poll.tsx +++ b/src/Poll.tsx @@ -219,7 +219,7 @@ class ContextlessPoll extends React.Component< // If we should keep going, const { base, path, interval, wait } = this.props; const { lastPollIndex } = this.state; - const requestOptions = this.getRequestOptions(); + const requestOptions = await this.getRequestOptions(); let url = composeUrl(base!, "", path); @@ -343,13 +343,13 @@ function Poll( // Compose Contexts to allow for URL nesting return ( - {contextProps => { + {async contextProps => { const contextRequestOptions = typeof contextProps.requestOptions === "function" ? contextProps.requestOptions() : contextProps.requestOptions || {}; const propsRequestOptions = - typeof props.requestOptions === "function" ? props.requestOptions() : props.requestOptions || {}; + typeof props.requestOptions === "function" ? await props.requestOptions() : props.requestOptions || {}; return ( ( } const requestOptions = - (typeof props.requestOptions === "function" ? props.requestOptions() : props.requestOptions) || {}; + (typeof props.requestOptions === "function" ? await props.requestOptions() : props.requestOptions) || {}; const contextRequestOptions = - (typeof context.requestOptions === "function" ? context.requestOptions() : context.requestOptions) || {}; + (typeof context.requestOptions === "function" ? await context.requestOptions() : context.requestOptions) || {}; const request = new Request( resolvePath(base, path, { ...context.queryParams, ...queryParams }), diff --git a/src/useMutate.tsx b/src/useMutate.tsx index 5d94875e..b1b7ac2b 100644 --- a/src/useMutate.tsx +++ b/src/useMutate.tsx @@ -78,10 +78,10 @@ export function useMutate< const signal = abortController.current.signal; const propsRequestOptions = - (typeof props.requestOptions === "function" ? props.requestOptions() : props.requestOptions) || {}; + (typeof props.requestOptions === "function" ? await props.requestOptions() : props.requestOptions) || {}; const contextRequestOptions = - (typeof context.requestOptions === "function" ? context.requestOptions() : context.requestOptions) || {}; + (typeof context.requestOptions === "function" ? await context.requestOptions() : context.requestOptions) || {}; const options: RequestInit = { method: verb,