useMaestroRequestService.ts 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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 = 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 = function (_: 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 }
  51. }