import { AxiosResponse } from "axios"; import { useContext } from "@nuxtjs/composition-api"; import { NuxtAxiosInstance } from "@nuxtjs/axios"; import { AdminAPI, Api } from "~/api"; import { ApiRequestInstance, RequestResponse } from "~/types/api"; const request = { async safe(funcCall: (url: string, data: U) => Promise>, url: string, data: U): Promise> { let error = null; const response = await funcCall(url, data).catch(function (e) { console.log(e); // Insert Generic Error Handling Here error = e; return null; }); return { response, error, data: response?.data ?? null }; }, }; function getRequests(axiosInstance: NuxtAxiosInstance): ApiRequestInstance { return { async get(url: string, params = {}): Promise> { let error = null; const response = await axiosInstance.get(url, params).catch((e) => { error = e; }); if (response != null) { return { response, error, data: response?.data }; } return { response: null, error, data: null }; }, async post(url: string, data: U) { // eslint-disable-next-line @typescript-eslint/unbound-method return await request.safe(axiosInstance.post, url, data); }, async put(url: string, data: U) { // eslint-disable-next-line @typescript-eslint/unbound-method return await request.safe(axiosInstance.put, url, data); }, async patch>(url: string, data: U) { // eslint-disable-next-line @typescript-eslint/unbound-method return await request.safe(axiosInstance.patch, url, data); }, async delete(url: string) { // eslint-disable-next-line @typescript-eslint/unbound-method return await request.safe(axiosInstance.delete, url, undefined); }, }; } export const useAdminApi = function (): AdminAPI { const { $axios } = useContext(); const requests = getRequests($axios); return new AdminAPI(requests); }; export const useUserApi = function (): Api { const { $axios } = useContext(); const requests = getRequests($axios); return new Api(requests); };