import type { Ref } from 'vue' import type { FetchContext, FetchOptions } from 'ofetch' import ApiRequestService from '~/services/data/apiRequestService' /** * Retourne une instance de ApiRequestService configurée pour interroger l'api Maestro * * @see https://github.com/unjs/ohmyfetch/blob/main/README.md#%EF%B8%8F-create-fetch-with-default-options */ let apiRequestServiceClass: null | ApiRequestService = null export const useMaestroRequestService = () => { const runtimeConfig = useRuntimeConfig() const baseURL = runtimeConfig.apiBaseUrl ?? runtimeConfig.public.apiBaseUrl const pending: Ref = ref(false) /** * Peuple les headers avant l'envoi de la requête * * @param request * @param options */ const onRequest = function ({ request, options }: FetchContext) { // @ts-ignore if (options && options.noXaccessId) { return } pending.value = true console.log('Request : ' + request + ' (SSR: ' + process.server + ')') } const onResponse = function (_: FetchContext) { pending.value = false } /** * Gère les erreurs retournées par l'api * * @param request * @param response * @param error */ const config: FetchOptions = { baseURL, onRequest, onResponse, } // Avoid memory leak if (apiRequestServiceClass === null) { // Utilise la fonction `create` d'ohmyfetch pour générer un fetcher dédié à l'interrogation de Ap2i const fetcher = $fetch.create(config) // @ts-ignore apiRequestServiceClass = new ApiRequestService(fetcher) } return { apiRequestService: apiRequestServiceClass, pending } }