useImageFetch.ts 1.1 KB

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