useImageFetch.ts 1.1 KB

12345678910111213141516171819202122232425262728293031323334
  1. import type { AsyncData } from '#app'
  2. import { v4 as uuid4 } from 'uuid'
  3. import type { Ref } from 'vue'
  4. import { useImageManager } from '~/composables/data/useImageManager'
  5. import { IMAGE_SIZE } from '~/types/enum/enums'
  6. interface useImageFetchReturnType {
  7. fetch: (
  8. id: Ref<number | null>,
  9. defaultImage?: string | null,
  10. height?: number,
  11. width?: number,
  12. ) => AsyncData<string | ArrayBuffer | null, Error | null>
  13. }
  14. /**
  15. * Sert d'intermédiaire entre les composants et l'ImageManager en fournissant une méthode useAsyncData toute prête.
  16. */
  17. export const useImageFetch = (): useImageFetchReturnType => {
  18. const { imageManager } = useImageManager()
  19. const fetch = (
  20. id: Ref<number | null>, // If id is null, fetch shall return the default image url
  21. defaultImage: string | null = null,
  22. size: IMAGE_SIZE = IMAGE_SIZE.MD
  23. ) =>
  24. useAsyncData(
  25. 'img' + (id ?? defaultImage ?? 0) + '_' + uuid4(),
  26. () => imageManager.get(id.value, defaultImage, size),
  27. { lazy: true, server: false }, // Always fetch images client-side
  28. )
  29. return { fetch }
  30. }