@@ -10,30 +10,28 @@ interface InternalDataTransferItem extends DataTransferItem {
10
10
path : string ;
11
11
}
12
12
13
- function loopFiles ( item : InternalDataTransferItem , callback ) {
14
- const dirReader = item . createReader ( ) ;
15
- let fileList = [ ] ;
13
+ const traverseFileTree = ( files : InternalDataTransferItem [ ] , callback , isAccepted ) => {
14
+ const flattenFileList = [ ] ;
15
+ const progressFileList = [ ] ;
16
+ files . forEach ( file => progressFileList . push ( file . webkitGetAsEntry ( ) as any ) ) ;
17
+ function loopFiles ( item : InternalDataTransferItem ) {
18
+ const dirReader = item . createReader ( ) ;
16
19
17
- function sequence ( ) {
18
- dirReader . readEntries ( ( entries : InternalDataTransferItem [ ] ) => {
19
- const entryList = Array . prototype . slice . apply ( entries ) ;
20
- fileList = fileList . concat ( entryList ) ;
20
+ function sequence ( ) {
21
+ dirReader . readEntries ( ( entries : InternalDataTransferItem [ ] ) => {
22
+ const entryList = Array . prototype . slice . apply ( entries ) ;
21
23
22
- // Check if all the file has been viewed
23
- const isFinished = ! entryList . length ;
24
+ progressFileList . push ( ...entryList ) ;
25
+ // Check if all the file has been viewed
26
+ const isFinished = ! entryList . length ;
27
+ if ( ! isFinished ) {
28
+ sequence ( ) ;
29
+ }
30
+ } ) ;
31
+ }
24
32
25
- if ( isFinished ) {
26
- callback ( fileList ) ;
27
- } else {
28
- sequence ( ) ;
29
- }
30
- } ) ;
33
+ sequence ( ) ;
31
34
}
32
-
33
- sequence ( ) ;
34
- }
35
-
36
- const traverseFileTree = ( files : InternalDataTransferItem [ ] , callback , isAccepted ) => {
37
35
// eslint-disable-next-line @typescript-eslint/naming-convention
38
36
const _traverseFileTree = ( item : InternalDataTransferItem , path ?: string ) => {
39
37
if ( ! item ) {
@@ -59,20 +57,23 @@ const traverseFileTree = (files: InternalDataTransferItem[], callback, isAccepte
59
57
} ,
60
58
} ) ;
61
59
}
62
- callback ( [ file ] ) ;
60
+ flattenFileList . push ( file ) ;
63
61
}
64
62
} ) ;
65
63
} else if ( item . isDirectory ) {
66
- loopFiles ( item , ( entries : InternalDataTransferItem [ ] ) => {
67
- entries . forEach ( entryItem => {
68
- _traverseFileTree ( entryItem , `${ path } ${ item . name } /` ) ;
69
- } ) ;
70
- } ) ;
64
+ loopFiles ( item ) ;
71
65
}
72
66
} ;
73
- files . forEach ( file => {
74
- _traverseFileTree ( file . webkitGetAsEntry ( ) as any ) ;
75
- } ) ;
67
+
68
+ function walkFiles ( ) {
69
+ let wipIndex = 0 ;
70
+ while ( wipIndex < progressFileList . length ) {
71
+ _traverseFileTree ( progressFileList [ wipIndex ] ) ;
72
+ wipIndex ++ ;
73
+ }
74
+ callback ( flattenFileList ) ;
75
+ }
76
+ walkFiles ( ) ;
76
77
} ;
77
78
78
79
export default traverseFileTree ;
0 commit comments