From 7dd5081a5155334033965e6184cbd4b9d487e3a8 Mon Sep 17 00:00:00 2001
From: zhwcreate <3331598351@qq.com>
Date: Fri, 7 Jun 2024 08:57:52 +0800
Subject: [PATCH 1/4] fix: Delay folder upload until all children files are
parsed
---
src/traverseFileTree.ts | 49 +++++++++++++++++++++++------------------
1 file changed, 28 insertions(+), 21 deletions(-)
diff --git a/src/traverseFileTree.ts b/src/traverseFileTree.ts
index 06665d3c..2b5f1d88 100644
--- a/src/traverseFileTree.ts
+++ b/src/traverseFileTree.ts
@@ -10,30 +10,32 @@ interface InternalDataTransferItem extends DataTransferItem {
path: string;
}
-function loopFiles(item: InternalDataTransferItem, callback) {
- const dirReader = item.createReader();
- let fileList = [];
-
- function sequence() {
- dirReader.readEntries((entries: InternalDataTransferItem[]) => {
- const entryList = Array.prototype.slice.apply(entries);
- fileList = fileList.concat(entryList);
+const traverseFileTree = (files: InternalDataTransferItem[], callback, isAccepted) => {
+ let restDirectory = 0;
+ const flattenFileList = [];
+ function loopFiles(item: InternalDataTransferItem, callback) {
+ const dirReader = item.createReader();
+ let fileList = [];
- // Check if all the file has been viewed
- const isFinished = !entryList.length;
+ function sequence() {
+ dirReader.readEntries((entries: InternalDataTransferItem[]) => {
+ const entryList = Array.prototype.slice.apply(entries);
+ fileList = fileList.concat(entryList);
- if (isFinished) {
- callback(fileList);
- } else {
- sequence();
- }
- });
- }
+ // Check if all the file has been viewed
+ const isFinished = !entryList.length;
- sequence();
-}
+ if (isFinished) {
+ restDirectory--;
+ callback(fileList);
+ } else {
+ sequence();
+ }
+ });
+ }
-const traverseFileTree = (files: InternalDataTransferItem[], callback, isAccepted) => {
+ sequence();
+ }
// eslint-disable-next-line @typescript-eslint/naming-convention
const _traverseFileTree = (item: InternalDataTransferItem, path?: string) => {
if (!item) {
@@ -59,10 +61,15 @@ const traverseFileTree = (files: InternalDataTransferItem[], callback, isAccepte
},
});
}
- callback([file]);
+ flattenFileList.push(file);
+ console.log(restDirectory);
+ if (restDirectory === 0) {
+ callback(flattenFileList);
+ }
}
});
} else if (item.isDirectory) {
+ restDirectory++;
loopFiles(item, (entries: InternalDataTransferItem[]) => {
entries.forEach(entryItem => {
_traverseFileTree(entryItem, `${path}${item.name}/`);
From cc6227888ea6a23bf549518be9f1e087ca487532 Mon Sep 17 00:00:00 2001
From: zhwcreate <3331598351@qq.com>
Date: Fri, 7 Jun 2024 10:06:53 +0800
Subject: [PATCH 2/4] feat: remove console
---
src/traverseFileTree.ts | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/traverseFileTree.ts b/src/traverseFileTree.ts
index 2b5f1d88..19ff7449 100644
--- a/src/traverseFileTree.ts
+++ b/src/traverseFileTree.ts
@@ -62,7 +62,6 @@ const traverseFileTree = (files: InternalDataTransferItem[], callback, isAccepte
});
}
flattenFileList.push(file);
- console.log(restDirectory);
if (restDirectory === 0) {
callback(flattenFileList);
}
From c3cc93ce04bf8763be5dbad3e0d7624ccd54c846 Mon Sep 17 00:00:00 2001
From: zhwcreate <3331598351@qq.com>
Date: Mon, 10 Jun 2024 16:38:12 +0800
Subject: [PATCH 3/4] =?UTF-8?q?feat=EF=BC=9Aadd=20test=20and=20fix=20bug?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/traverseFileTree.ts | 9 +++----
tests/uploader.spec.tsx | 52 ++++++++++++++++++++++++++++++++++++++++-
2 files changed, 56 insertions(+), 5 deletions(-)
diff --git a/src/traverseFileTree.ts b/src/traverseFileTree.ts
index 19ff7449..be3717a6 100644
--- a/src/traverseFileTree.ts
+++ b/src/traverseFileTree.ts
@@ -11,7 +11,7 @@ interface InternalDataTransferItem extends DataTransferItem {
}
const traverseFileTree = (files: InternalDataTransferItem[], callback, isAccepted) => {
- let restDirectory = 0;
+ let restFile = files.length;
const flattenFileList = [];
function loopFiles(item: InternalDataTransferItem, callback) {
const dirReader = item.createReader();
@@ -26,7 +26,7 @@ const traverseFileTree = (files: InternalDataTransferItem[], callback, isAccepte
const isFinished = !entryList.length;
if (isFinished) {
- restDirectory--;
+ restFile = restFile - 1 + fileList.length;
callback(fileList);
} else {
sequence();
@@ -39,6 +39,7 @@ const traverseFileTree = (files: InternalDataTransferItem[], callback, isAccepte
// eslint-disable-next-line @typescript-eslint/naming-convention
const _traverseFileTree = (item: InternalDataTransferItem, path?: string) => {
if (!item) {
+ restFile = restFile - 1;
return;
}
// eslint-disable-next-line no-param-reassign
@@ -62,13 +63,13 @@ const traverseFileTree = (files: InternalDataTransferItem[], callback, isAccepte
});
}
flattenFileList.push(file);
- if (restDirectory === 0) {
+ restFile = restFile - 1;
+ if (restFile === 0) {
callback(flattenFileList);
}
}
});
} else if (item.isDirectory) {
- restDirectory++;
loopFiles(item, (entries: InternalDataTransferItem[]) => {
entries.forEach(entryItem => {
_traverseFileTree(entryItem, `${path}${item.name}/`);
diff --git a/tests/uploader.spec.tsx b/tests/uploader.spec.tsx
index b7e060cd..df7749cb 100644
--- a/tests/uploader.spec.tsx
+++ b/tests/uploader.spec.tsx
@@ -25,7 +25,7 @@ const makeFileSystemEntry = item => {
return {
readEntries(handle) {
if (!first) {
- return [];
+ return handle([]);
}
first = false;
@@ -374,6 +374,56 @@ describe('uploader', () => {
uploader = render();
});
+ it('beforeUpload should run after all children files are parsed', done => {
+ const props = { action: '/test', directory: true, accept: '.png' };
+ const mockBeforeUpload = jest.fn();
+ const beforeUpload = (file, fileList) => {
+ console.log('beforeUpload', file, fileList);
+ mockBeforeUpload(file, fileList);
+ };
+ const Test = () => {
+ return ;
+ };
+
+ const { container } = render();
+ const files = {
+ name: 'foo',
+ children: [
+ {
+ name: 'bar',
+ children: [
+ {
+ name: '1.png',
+ },
+ {
+ name: '2.png',
+ },
+ {
+ name: 'rc',
+ children: [
+ {
+ name: '3.png',
+ },
+ {
+ name: '4.png',
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ };
+ const input = container.querySelector('input')!;
+ fireEvent.drop(input, { dataTransfer: { items: [makeDataTransferItem(files)] } });
+ setTimeout(() => {
+ expect(mockBeforeUpload.mock.calls.length).toBe(4);
+ expect(mockBeforeUpload.mock.calls[0][1].length).toBe(4);
+ expect(mockBeforeUpload.mock.calls[1][1].length).toBe(4);
+ expect(mockBeforeUpload.mock.calls[2][1].length).toBe(4);
+ expect(mockBeforeUpload.mock.calls[3][1].length).toBe(4);
+ done();
+ }, 100);
+ });
it('unaccepted type files to upload will not trigger onStart', done => {
const input = uploader.container.querySelector('input')!;
const files = {
From 4c008be702db99a659c9e69ac03afe9812096b5d Mon Sep 17 00:00:00 2001
From: zhwcreate <3331598351@qq.com>
Date: Wed, 12 Jun 2024 17:59:18 +0800
Subject: [PATCH 4/4] fix: ci
---
src/traverseFileTree.ts | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/traverseFileTree.ts b/src/traverseFileTree.ts
index be3717a6..4c1f644f 100644
--- a/src/traverseFileTree.ts
+++ b/src/traverseFileTree.ts
@@ -13,7 +13,7 @@ interface InternalDataTransferItem extends DataTransferItem {
const traverseFileTree = (files: InternalDataTransferItem[], callback, isAccepted) => {
let restFile = files.length;
const flattenFileList = [];
- function loopFiles(item: InternalDataTransferItem, callback) {
+ function loopFiles(item: InternalDataTransferItem, InnerCallback) {
const dirReader = item.createReader();
let fileList = [];
@@ -27,7 +27,7 @@ const traverseFileTree = (files: InternalDataTransferItem[], callback, isAccepte
if (isFinished) {
restFile = restFile - 1 + fileList.length;
- callback(fileList);
+ InnerCallback(fileList);
} else {
sequence();
}