diff --git a/polylan_submitter/src/Submissions.vue b/polylan_submitter/src/Submissions.vue index 204c1cb..34fd65a 100644 --- a/polylan_submitter/src/Submissions.vue +++ b/polylan_submitter/src/Submissions.vue @@ -415,6 +415,26 @@ const removeFile = (index: number) => { uploadedFiles.value.splice(index, 1); }; +// Thumbnails of the selected images, revoked once the file is removed/submitted +const thumbnailUrls = new Map(); +const thumbnails = computed(() => + uploadedFiles.value.map((file) => { + if (!file.type.startsWith("image/")) return null; + if (!thumbnailUrls.has(file)) thumbnailUrls.set(file, URL.createObjectURL(file)); + return thumbnailUrls.get(file)!; + }), +); + +const revokeThumbnails = (keep: File[] = []) => { + thumbnailUrls.forEach((url, file) => { + if (keep.includes(file)) return; + URL.revokeObjectURL(url); + thumbnailUrls.delete(file); + }); +}; + +watch(uploadedFiles, (files) => revokeThumbnails(files), { deep: true }); + const submitSubmission = async () => { if (uploadedFiles.value.length === 0) return; @@ -561,6 +581,7 @@ onMounted(async () => { onUnmounted(() => { window.removeEventListener('paste', handlePasteOnUploadArea); + revokeThumbnails(); }); @@ -629,17 +650,24 @@ onUnmounted(() => {

{{ t("common.selectedFiles") }}

-
+
- -
-

{{ file.name }}

-

{{ formatFileSize(file.size) }}

+
+ + +
+
+ +
+

{{ file.name }}

+

{{ formatFileSize(file.size) }}

+