import axios from 'axios' import { NextPageContext } from 'next' export interface IResponseItems { items: T[] nextPage: number prevPage: number } export async function requestGet(url: string, defaultResponse: T): Promise { try { const res = await axios.get(url) return res.data } catch (e) { return defaultResponse } } /** * This wrapper prevents fetching api request in static export mode and production environment * because nextjs call getInitialProps on the client side * * @param {*} fn */ export function wrapInitialProps(fn: (ctx: NextPageContext) => void) { return async (ctx: NextPageContext) => { if (process.env.NODE_ENV === 'production' && process.browser) { return window['__NEXT_DATA__'].props.pageProps; } return fn(ctx) } } export function createApiUrl(path: string) { return `https://api.tmshv.com/hudozka${path}` } export type FactoryFunction = | ((response: I) => O) | ((response: I) => Promise) export type ApiDefaultResponse = () => O export function apiGet(factory: FactoryFunction) { return async (url: string, getDefaultResponse: ApiDefaultResponse) => { const res = await fetch(url) if (res.ok) { const data = await res.json() as I return factory(data) } return getDefaultResponse() } }