/home/vianto5/heredit.mx/wp-content/plugins/code-snippets/js/hooks
Edit: /home/vianto5/heredit.mx/wp-content/plugins/code-snippets/js/hooks/useRestAPI.tsx (2762B)
import React, { useMemo } from 'react'
import axios from 'axios'
import { createContextHook } from '../utils/bootstrap'
import { REST_API_AXIOS_CONFIG, applyMethodOverride, applyRestNonce, listenForNonceRefresh } from '../utils/restAPI'
import type { PropsWithChildren } from 'react'
import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'
export interface RestAPIContext {
api: RestAPI
axiosInstance: AxiosInstance
}
export interface RestAPI {
get:
(url: string) => Promise
getResponse: (url: string) => Promise>
post: (url: string, data?: D, config?: AxiosRequestConfig) => Promise
put: (url: string, data?: object) => Promise
del: (url: string) => Promise
}
const debugRequest = async (
method: 'GET' | 'POST' | 'PUT' | 'DELETE',
url: string,
doRequest: Promise>,
data?: D
): Promise> => {
if (window.CODE_SNIPPETS?.debug) {
console.debug(`${method} ${url}`, ...data ? [data] : [])
const response = await doRequest
console.debug('Response', response)
return response
} else {
return await doRequest
}
}
const buildRestAPI = (axiosInstance: AxiosInstance): RestAPI => ({
getResponse: (url: string): Promise> =>
debugRequest('GET', url, axiosInstance.get, never>(url)),
get: (url: string): Promise =>
debugRequest('GET', url, axiosInstance.get, never>(url))
.then(response => response.data),
post: (url: string, data?: D, config?: AxiosRequestConfig): Promise =>
debugRequest('POST', url, axiosInstance.post>(url, data, config), data)
.then(response => response.data),
del: (url: string): Promise =>
debugRequest('DELETE', url, axiosInstance.delete, never>(url))
.then(response => response.data),
put: (url: string, data?: object): Promise =>
debugRequest('PUT', url, axiosInstance.put>(url, data), data)
.then(response => response.data),
})
const [Context, useRestAPI] = createContextHook('useRestAPI')
export const WithRestAPIContext: React.FC = ({ children }) => {
const axiosInstance = useMemo(() => {
const instance = axios.create(REST_API_AXIOS_CONFIG)
instance.interceptors.request.use(applyRestNonce)
instance.interceptors.request.use(applyMethodOverride)
listenForNonceRefresh()
return instance
}, [])
const api = useMemo(() => buildRestAPI(axiosInstance), [axiosInstance])
const value: RestAPIContext = { api, axiosInstance }
return {children}
}
export { useRestAPI }