@@ -5,9 +5,10 @@ import FileItem from './components/FileItem.vue';
55import { useFileDataStore } from ' ./stores/fileData' ;
66import { storeToRefs } from ' pinia' ;
77import type { FileObj } from ' ./types/file' ;
8- import { computed , ref , watch } from ' vue' ;
9- import { useImageCompression } from ' ./composables/useImageCompression' ;
10- import { useZipCompression } from ' ./composables/useZipCompression' ;
8+ import { computed , ref } from ' vue' ;
9+ import { compressFile } from ' ./functions/imageCompression' ;
10+ import { compressToZip } from ' ./functions/zipCompression' ;
11+ import { paginate } from ' ./functions/paginate' ;
1112import { useI18n } from ' ./hooks/useI18n' ;
1213
1314const { t } = useI18n ();
@@ -20,44 +21,46 @@ const zipData = ref('');
2021const isZipCompressing = ref (false );
2122const anyUncompressed = computed (() => files .value .some ((file ) => ! file .isCompressed ));
2223
24+ const availableThreads = Math .max (navigator .hardwareConcurrency - 2 , 1 );
25+
2326async function editFileObj(fileObj : FileObj ) {
2427 try {
25- const compressedFile = await useImageCompression (fileObj .file );
26- const item = files .value .find ((item ) => item .id === fileObj .id );
27- if (! item ) return ;
28- item .file = compressedFile ;
29- item .isCompressed = true ;
28+ const compressedFile = await compressFile (fileObj .file );
29+ fileObj .file = compressedFile ;
30+ fileObj .isCompressed = true ;
3031 } catch {
31- fileObj .isTooLarge = true ;
32+ fileObj .isError = true ;
3233 }
3334}
3435
3536async function compressFiles() {
3637 isCompressing .value = true ;
3738
38- const promises = [];
39-
4039 const uncompressedFiles = files .value .filter ((fileObj : FileObj ) => ! fileObj .isCompressed );
4140
42- for (const fileObj of uncompressedFiles ) {
43- promises .push (editFileObj (fileObj ));
41+ // option 1 (no errors, slower)
42+ const paginatedFileArray = paginate (uncompressedFiles , availableThreads );
43+
44+ for (const subArray of paginatedFileArray ) {
45+ const promises = subArray .map (editFileObj );
46+ await Promise .all (promises );
4447 }
4548
46- await Promise .all (promises );
49+ // option 2 (errors, faster -> better option once the errors are fixed in Firefox)
50+ // const promises = uncompressedFiles.map(editFileObj);
51+ // await Promise.all(promises);
52+
4753 isCompressing .value = false ;
54+
55+ URL .revokeObjectURL (zipData .value );
56+ isZipCompressing .value = true ;
57+ zipData .value = await compressToZip ();
58+ isZipCompressing .value = false ;
4859}
4960
5061function removeItem(file : FileObj ) {
5162 files .value = files .value .filter ((item ) => item !== file );
5263}
53-
54- watch (anyUncompressed , async (newVal ) => {
55- if (files .value .length && ! newVal ) {
56- isZipCompressing .value = true ;
57- zipData .value = await useZipCompression ();
58- isZipCompressing .value = false ;
59- }
60- });
6164 </script >
6265
6366<template >
@@ -92,7 +95,7 @@ watch(anyUncompressed, async (newVal) => {
9295 </button >
9396 <a
9497 :aria-busy =" isZipCompressing"
95- :aria- disabled =" !zipData"
98+ :disabled =" !zipData || undefined "
9699 :href =" zipData || undefined"
97100 role =" button"
98101 download
0 commit comments