Last active
September 13, 2020 06:36
-
-
Save createdbymahmood/90637e0400882468eaae390de0879f5a to your computer and use it in GitHub Desktop.
Making a get request using axios & SWR
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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