useMaestroRequestService.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import ApiRequestService from "~/services/data/apiRequestService";
  2. import type {Ref} from "@vue/reactivity";
  3. import type { FetchContext, FetchOptions } from "ofetch";
  4. /**
  5. * Retourne une instance de ApiRequestService configurée pour interroger l'api Maestro
  6. *
  7. * @see https://github.com/unjs/ohmyfetch/blob/main/README.md#%EF%B8%8F-create-fetch-with-default-options
  8. */
  9. let apiRequestServiceClass: null | ApiRequestService = null
  10. export const useMaestroRequestService = () => {
  11. const runtimeConfig = useRuntimeConfig()
  12. const baseURL = runtimeConfig.apiBaseUrl ?? runtimeConfig.public.apiBaseUrl
  13. const pending: Ref<boolean> = ref(false)
  14. /**
  15. * Peuple les headers avant l'envoi de la requête
  16. *
  17. * @param request
  18. * @param options
  19. */
  20. const onRequest = async function ({ request, options }: FetchContext) {
  21. // @ts-ignore
  22. if(options && options.noXaccessId) {
  23. return
  24. }
  25. pending.value = true
  26. console.log('Request : ' + request + ' (SSR: ' + process.server + ')')
  27. }
  28. const onResponse = async function({ request, options, response }: FetchContext) {
  29. pending.value = false
  30. }
  31. /**
  32. * Gère les erreurs retournées par l'api
  33. *
  34. * @param request
  35. * @param response
  36. * @param error
  37. */
  38. const config : FetchOptions = {
  39. baseURL,
  40. onRequest,
  41. onResponse,
  42. }
  43. //Avoid memory leak
  44. if (apiRequestServiceClass === null) {
  45. // Utilise la fonction `create` d'ohmyfetch pour générer un fetcher dédié à l'interrogation de Ap2i
  46. const fetcher = $fetch.create(config)
  47. // @ts-ignore
  48. apiRequestServiceClass = new ApiRequestService(fetcher)
  49. }
  50. return { apiRequestService: apiRequestServiceClass, pending: pending }
  51. }