useMaestroRequestService.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import type { Ref } from "vue";
  2. import type { FetchContext, FetchOptions } from "ofetch";
  3. import ApiRequestService from "~/services/data/apiRequestService";
  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 ({
  29. request,
  30. options,
  31. response,
  32. }: FetchContext) {
  33. pending.value = false;
  34. };
  35. /**
  36. * Gère les erreurs retournées par l'api
  37. *
  38. * @param request
  39. * @param response
  40. * @param error
  41. */
  42. const config: FetchOptions = {
  43. baseURL,
  44. onRequest,
  45. onResponse,
  46. };
  47. // Avoid memory leak
  48. if (apiRequestServiceClass === null) {
  49. // Utilise la fonction `create` d'ohmyfetch pour générer un fetcher dédié à l'interrogation de Ap2i
  50. const fetcher = $fetch.create(config);
  51. // @ts-ignore
  52. apiRequestServiceClass = new ApiRequestService(fetcher);
  53. }
  54. return { apiRequestService: apiRequestServiceClass, pending };
  55. };