imageManager.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import ApiRequestService from "./apiRequestService";
  2. import ImageUtils from "~/services/utils/imageUtils";
  3. class ImageManager {
  4. private apiRequestService: ApiRequestService;
  5. public readonly defaultImage = '/images/default/picture.jpeg'
  6. public constructor(apiRequestService: ApiRequestService) {
  7. this.apiRequestService = apiRequestService
  8. }
  9. /**
  10. * Retourne l'image correspondante sous forme d'un blob encodé au format base64,
  11. * ou l'url d'une image par défaut si l'image est introuvable ou si l'id passé en paramètre est null
  12. *
  13. * Attention, les dimensions (hauteur / largeur) ne s'appliqueront pas à l'image par défaut, il est nécessaire de
  14. * les redéfinir dans le composant lui-même.
  15. *
  16. * @param id The id of the image; if null, the url to the default image is returned
  17. * @param defaultImage The path of an image in the 'public' folder, default: '/images/default/picture.jpeg'
  18. * @param height Height of the image (does not apply to default image)
  19. * @param width Width of the image (does not apply to default image)
  20. */
  21. public async get(
  22. id: number | null,
  23. defaultImage: string | null,
  24. height: number = 0,
  25. width: number = 0
  26. ): Promise<string> {
  27. const defaultUrl = defaultImage ?? this.defaultImage
  28. if (id === null) {
  29. return defaultUrl
  30. }
  31. const imageUrl = `api/download/${id}`
  32. // Set requested size if needed
  33. if (height > 0 || width > 0) {
  34. // @see https://thumbor.readthedocs.io/en/latest/crop_and_resize_algorithms.html
  35. // TODO: ajouter le support de ces options dans ap2i
  36. // url = Url.join(url, `${height}x${width}`)
  37. }
  38. // Une image doit toujours avoir le time en options pour éviter les problèmes de cache
  39. const query = [new Date().getTime().toString()]
  40. const response: any = await this.apiRequestService.get(imageUrl, query)
  41. // console.log(response)
  42. if(!response || response.size === 0) {
  43. console.error('Error: image ' + id + ' not found or invalid')
  44. return defaultUrl
  45. }
  46. const blob = await ImageUtils.newBlob(response)
  47. return await ImageUtils.blobToBase64(blob)
  48. }
  49. }
  50. export default ImageManager