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(); }