useImageViewer.ts 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // Copyright (C) 2012-2023 Zammad Foundation, https://zammad-foundation.org/
  2. import { canPreviewFile } from '@shared/utils/files'
  3. import type { MaybeRef } from '@vueuse/shared'
  4. import { ref, unref, watchEffect } from 'vue'
  5. interface ImagePreview {
  6. src?: string
  7. title?: string
  8. }
  9. interface CachedFile {
  10. name?: string
  11. content?: string
  12. type?: Maybe<string>
  13. }
  14. interface ViewerOptions {
  15. images: ImagePreview[]
  16. index: number
  17. visible: boolean
  18. }
  19. export const imageViewerOptions = ref<ViewerOptions>({
  20. visible: false,
  21. index: 0,
  22. images: [],
  23. })
  24. const useImageViewer = (viewFiles: MaybeRef<CachedFile[]>) => {
  25. const indexMap = new WeakMap<CachedFile, number>()
  26. let images: ImagePreview[] = []
  27. watchEffect(() => {
  28. images = unref(viewFiles)
  29. .filter((file) => canPreviewFile(file.type))
  30. .map((image, index) => {
  31. // we need to keep track of indexes, because they might
  32. // be different from original files, if they had non-image uploads
  33. indexMap.set(image, index)
  34. return {
  35. src: image.content,
  36. title: image.name,
  37. }
  38. })
  39. })
  40. const showImage = (image: CachedFile) => {
  41. const foundIndex = indexMap.get(image) ?? 0
  42. imageViewerOptions.value = {
  43. index: foundIndex,
  44. images,
  45. visible: true,
  46. }
  47. }
  48. const hideImage = () => {
  49. imageViewerOptions.value = {
  50. images: [],
  51. index: 0,
  52. visible: false,
  53. }
  54. }
  55. const isViewable = (file: CachedFile) => indexMap.has(file)
  56. return {
  57. isViewable,
  58. showImage,
  59. hideImage,
  60. }
  61. }
  62. export default useImageViewer