33 - SPDX-License-Identifier: AGPL-3.0-or-later
44-->
55<template >
6- <div :style =" canLoadPreview ? { backgroundImage: `url(${previewURL})`} : undefined"
6+ <div :style =" previewLoaded ? { backgroundImage: `url(${previewURL})`} : undefined"
77 :class =" fileListIconStyles['file-picker__file-icon']" >
8- <template v-if =" ! canLoadPreview " >
8+ <template v-if =" ! previewLoaded " >
99 <IconFile v-if =" isFile" :size =" 20" />
1010 <IconFolder v-else :size =" 20" />
1111 </template >
1414
1515<script setup lang="ts">
1616import { FileType , type Node } from ' @nextcloud/files'
17- import { computed , ref , watchEffect } from ' vue'
18- import { getPreviewURL } from ' ../../composables/preview'
17+ import { computed , ref , toRef } from ' vue'
18+ import { usePreviewURL } from ' ../../composables/preview'
1919
2020import IconFile from ' vue-material-design-icons/File.vue'
2121import IconFolder from ' vue-material-design-icons/Folder.vue'
2222
2323// CSS modules
2424import fileListIconStylesModule from ' ./FileListIcon.module.scss'
25+
2526// workaround for vue2.7 bug, can be removed with vue3
2627const fileListIconStyles = ref (fileListIconStylesModule )
2728
@@ -30,21 +31,12 @@ const props = defineProps<{
3031 cropImagePreviews: boolean
3132}>()
3233
33- const previewURL = computed (() => getPreviewURL (props .node , { cropPreview: props .cropImagePreviews }))
34+ const {
35+ previewURL,
36+ previewLoaded,
37+ } = usePreviewURL (toRef (props , ' node' ), computed (() => ({ cropPreview: props .cropImagePreviews })))
3438
3539const isFile = computed (() => props .node .type === FileType .File )
36- const canLoadPreview = ref (false )
37-
38- watchEffect (() => {
39- canLoadPreview .value = false
40-
41- if (previewURL .value ) {
42- const loader = new Image ()
43- loader .src = previewURL .value .href
44- loader .onerror = () => loader .remove ()
45- loader .onload = () => { canLoadPreview .value = true ; loader .remove () }
46- }
47- })
4840 </script >
4941
5042<script lang="ts">
0 commit comments