cra-template-pi
Version:
A quick start Create React App with many auto implemented features
54 lines (45 loc) • 1.48 kB
text/typescript
import { BaseAPI, Configuration, ResponseContext } from './generated'
const AUTH_STORAGE_KEY = 'apiKey'
const AUTH_HEADER_KEY = 'Authorization'
interface IApiContext {
[key: string]: BaseAPI
}
const apiContext: IApiContext = {}
/**
* Creates or retrieves a given api {@code GenericApi} based on the flag {@code forceRecreate}
* The role of this wrapper is create a single point of creation/configuration of existing apis
* that are defined with Open API Generator
*
* {@example}
* const calculatorApi = injectApi(CalculatorApi);
*
* calculatorApi.calculate({a: 1, b: 2})
*
* @param GenericApi
* @param forceRecreate
*/
export function injectApi<T extends BaseAPI>(
GenericApi: new (config: Configuration) => T,
forceRecreate = false
) {
const requestedApiInstance = GenericApi.name
if (!forceRecreate && requestedApiInstance in apiContext) {
return apiContext[requestedApiInstance] as T
}
apiContext[requestedApiInstance] = new GenericApi(
getDefaultConfiguration()
).withPostMiddleware(refreshApiKey)
return apiContext[requestedApiInstance] as T
}
function getDefaultConfiguration() {
return new Configuration({
apiKey: () => localStorage.getItem(AUTH_STORAGE_KEY) || '',
})
}
const refreshApiKey = (context: ResponseContext) => {
const maybeAuthHeader = context.response.headers.get(AUTH_HEADER_KEY)
if (maybeAuthHeader) {
localStorage.setItem(AUTH_STORAGE_KEY, maybeAuthHeader)
}
return Promise.resolve()
}