Skip to content

Commit f7c8a5d

Browse files
committed
refactor(defaultTheme): refine enhanceUpload() utilities
1 parent 62db60a commit f7c8a5d

File tree

1 file changed

+59
-80
lines changed

1 file changed

+59
-80
lines changed

src/tpl/defaultTheme/frontend/index.js

Lines changed: 59 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141

4242
var lastFocused;
4343

44+
var errLacksMkdir = new Error("mkdir permission is not enabled")
45+
4446
function enableFilter() {
4547
var filter = document.body.querySelector('.filter');
4648
if (!filter) return;
@@ -432,22 +434,16 @@
432434

433435
function enhanceUpload() {
434436
var upload = document.body.querySelector('.upload');
435-
if (!upload) {
436-
return;
437-
}
437+
if (!upload) return;
438+
438439
var form = upload.querySelector('form');
439-
if (!form) {
440-
return;
441-
}
440+
if (!form) return;
441+
442442
var fileInput = form.querySelector('.file');
443-
if (!fileInput) {
444-
return;
445-
}
443+
if (!fileInput) return;
446444

447445
var uploadType = document.body.querySelector('.upload-type');
448-
if (!uploadType) {
449-
return;
450-
}
446+
if (!uploadType) return;
451447

452448
var file = 'file';
453449
var dirFile = 'dirfile';
@@ -476,7 +472,7 @@
476472
var handleKindFile = 'file';
477473
var handleKindDir = 'directory';
478474
var permDescriptor = {mode: 'read'};
479-
itemsToFiles = function (dataTransferItems, canMkdir, onDone, onLacksMkdir) {
475+
itemsToFiles = function (dataTransferItems, canMkdir) {
480476
function resultsToFiles(results, files, dirPath) {
481477
return Promise.all(results.map(function (result) {
482478
var handle = result.value;
@@ -524,73 +520,60 @@
524520
var files = [];
525521
var hasDir = false;
526522

527-
var items = Array.prototype.slice.call(dataTransferItems);
528-
Promise.all(items.map(function (item) {
523+
return Promise.all(Array.from(dataTransferItems).map(function (item) {
529524
return item.getAsFileSystemHandle();
530525
})).then(function (handles) {
531526
handles = handles.filter(Boolean); // undefined for pasted content
532527
hasDir = handles.some(function (handle) {
533528
return handle.kind === handleKindDir;
534529
});
535530
if (hasDir && !canMkdir) {
536-
return onLacksMkdir();
531+
throw errLacksMkdir;
537532
}
538533
var handleResults = handles.map(function (handle) {
539534
return {value: handle, done: false};
540535
});
541-
resultsToFiles(handleResults, files, '').then(function () {
542-
onDone(files, hasDir);
536+
return resultsToFiles(handleResults, files, '').then(function () {
537+
return {files: files, hasDir: hasDir};
543538
});
544539
});
545540
}
546541
} else {
547-
itemsToFiles = function (dataTransferItems, canMkdir, onDone, onLacksMkdir) {
548-
function entriesToFiles(entries, files, onLevelDone) {
549-
var len = entries.length;
550-
var cb = 0;
551-
if (!len) return onLevelDone();
552-
553-
function increaseCb() {
554-
cb++;
555-
if (cb === len) {
556-
onLevelDone();
557-
}
558-
}
559-
560-
function dirReaderToFiles(dirReader, files, onAllRead) {
561-
dirReader.readEntries(function (subEntries) {
562-
if (!subEntries.length) return onAllRead();
563-
entriesToFiles(subEntries, files, function () {
564-
dirReaderToFiles(dirReader, files, onAllRead);
565-
});
566-
}, onAllRead);
567-
}
568-
569-
entries.forEach(function (entry) {
570-
if (entry.isFile) {
571-
var relativePath = entry.fullPath;
572-
if (relativePath[0] === '/') {
573-
relativePath = relativePath.substring(1);
542+
itemsToFiles = function (dataTransferItems, canMkdir) {
543+
function entriesToFiles(entries, files) {
544+
return Promise.all(entries.map(function (entry) {
545+
return new Promise(function (resolve) {
546+
if (entry.isFile) {
547+
var relativePath = entry.fullPath;
548+
if (relativePath[0] === '/') {
549+
relativePath = relativePath.slice(1);
550+
}
551+
entry.file(function (file) {
552+
files.push({file: file, relativePath: relativePath});
553+
resolve();
554+
}, function (err) {
555+
logError(err);
556+
resolve()
557+
});
558+
} else if (entry.isDirectory) {
559+
var dirReader = entry.createReader()
560+
var onReadSubEntries = function (subEntries) {
561+
if (!subEntries.length) resolve();
562+
entriesToFiles(subEntries, files).then(function () {
563+
dirReader.readEntries(onReadSubEntries);
564+
});
565+
}
566+
dirReader.readEntries(onReadSubEntries);
574567
}
575-
entry.file(function (file) {
576-
files.push({file: file, relativePath: relativePath});
577-
increaseCb();
578-
}, function (err) {
579-
increaseCb();
580-
logError(err);
581-
});
582-
} else if (entry.isDirectory) {
583-
var dirReader = entry.createReader();
584-
dirReaderToFiles(dirReader, files, increaseCb);
585-
}
586-
});
568+
})
569+
}));
587570
}
588571

572+
var entries = [];
589573
var files = [];
590574
var hasDir = false;
591575

592-
var entries = [];
593-
for (var i = 0, len = dataTransferItems.length; i < len; i++) {
576+
for (var i = 0; i < dataTransferItems.length; i++) {
594577
var item = dataTransferItems[i];
595578
var entry = item.webkitGetAsEntry();
596579
if (!entry) { // undefined for pasted text
@@ -606,27 +589,17 @@
606589
if (canMkdir) {
607590
entries.push(entry);
608591
} else {
609-
return onLacksMkdir();
592+
return Promise.reject(errLacksMkdir);
610593
}
611594
}
612595
}
613596

614-
entriesToFiles(entries, files, function () {
615-
onDone(files, hasDir);
597+
return entriesToFiles(entries, files).then(function () {
598+
return {files: files, hasDir: hasDir};
616599
});
617600
}
618601
}
619602

620-
function dataTransferToFiles(dataTransfer, canMkdir, onDone, onLacksMkdir) {
621-
itemsToFiles(dataTransfer.items, canMkdir, function (files, hasDir) {
622-
// ancient Browser
623-
if (files.length === 0 && dataTransfer.files && dataTransfer.files.length) {
624-
files = Array.prototype.slice.call(dataTransfer.files);
625-
}
626-
onDone(files, hasDir);
627-
}, onLacksMkdir);
628-
}
629-
630603
var switchToFileMode = noop;
631604
var switchToDirMode = noop;
632605

@@ -916,16 +889,19 @@
916889
return;
917890
}
918891

919-
dataTransferToFiles(e.dataTransfer, canMkdir, function (files, hasDir) {
920-
if (hasDir) {
892+
itemsToFiles(e.dataTransfer.items, canMkdir).then(function (result) {
893+
var files = result.files;
894+
if (result.hasDir) {
921895
switchToDirMode();
922896
uploadProgressively(files);
923897
} else {
924898
switchToFileMode();
925899
uploadProgressively(files);
926900
}
927-
}, function () {
928-
typeof showUploadDirFailMessage !== strUndef && showUploadDirFailMessage();
901+
}, function (err) {
902+
if (err === errLacksMkdir && typeof showUploadDirFailMessage !== strUndef) {
903+
showUploadDirFailMessage();
904+
}
929905
});
930906
}
931907

@@ -1015,7 +991,8 @@
1015991
return;
1016992
}
1017993

1018-
itemsToFiles(items, canMkdir, function (files, hasDir) {
994+
itemsToFiles(items, canMkdir).then(function (result) {
995+
var files = result.files;
1019996
// for pasted text
1020997
if (!files.length) {
1021998
generatePastedFiles(data);
@@ -1032,14 +1009,16 @@
10321009
}
10331010

10341011
// pasted real files
1035-
if (hasDir) {
1012+
if (result.hasDir) {
10361013
switchToDirMode();
10371014
} else {
10381015
switchToFileMode();
10391016
}
10401017
uploadProgressively(files);
1041-
}, function () {
1042-
typeof showUploadDirFailMessage !== strUndef && showUploadDirFailMessage();
1018+
}, function (err) {
1019+
if (err === errLacksMkdir && typeof showUploadDirFailMessage !== strUndef) {
1020+
showUploadDirFailMessage();
1021+
}
10431022
});
10441023
});
10451024
}

0 commit comments

Comments
 (0)