useMaestroRequestService.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import {FetchContext, FetchOptions} from "ohmyfetch";
  2. import ApiRequestService from "~/services/data/apiRequestService";
  3. import {Ref} from "@vue/reactivity";
  4. /**
  5. * Retourne une instance de ApiRequestService configurée pour interroger l'api Ap2i
  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. }