Skip to content

Instantly share code, notes, and snippets.

@createdbymahmood
Last active September 13, 2020 06:36
Show Gist options
  • Select an option

  • Save createdbymahmood/90637e0400882468eaae390de0879f5a to your computer and use it in GitHub Desktop.

Select an option

Save createdbymahmood/90637e0400882468eaae390de0879f5a to your computer and use it in GitHub Desktop.
Making a get request using axios & SWR
import useSWR, { ConfigInterface, responseInterface } from "swr";
// you can import the next line from your axios instance repository
import axios, { AxiosRequestConfig, AxiosResponse, AxiosError } from "axios";
export type GetRequest = AxiosRequestConfig | null;
interface Return<Data, Error>
extends Pick<
responseInterface<AxiosResponse<Data>, AxiosError<Error>>,
"isValidating" | "revalidate" | "error" | "mutate"
> {
data: Data | undefined;
response: AxiosResponse<Data> | undefined;
}
export interface Config<Data = unknown, Error = unknown>
extends Omit<
ConfigInterface<AxiosResponse<Data>, AxiosError<Error>>,
"initialData"
> {
initialData?: Data;
}
export function useRequest<Data = unknown, Error = unknown>(
request: GetRequest,
{ initialData, ...config }: Config<Data, Error> = {}
): Return<Data, Error> {
const { data: response, error, isValidating, revalidate, mutate } = useSWR<
AxiosResponse<Data>,
AxiosError<Error>
>(
request && JSON.stringify(request),
/**
* NOTE: Typescript thinks `request` can be `null` here, but the fetcher
* function is actually only called by `useSWR` when it isn't.
*/
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
() => axios(request!),
{
...config,
initialData: initialData && {
status: 200,
statusText: "InitialData",
config: request,
headers: {},
data: initialData,
},
}
);
return {
data: response && response.data,
response,
error,
isValidating,
revalidate,
mutate,
};
}
// this component is copied from the SWR repository, I'm just centralizing them for myself here
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment