Skip to content

Commit 17379f7

Browse files
committed
refactor(defaultTheme): refine enhanceUpload()
1 parent ade66a3 commit 17379f7

File tree

1 file changed

+46
-77
lines changed

1 file changed

+46
-77
lines changed

src/tpl/defaultTheme/frontend/index.js

Lines changed: 46 additions & 77 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;
@@ -523,76 +519,56 @@
523519

524520
var files = [];
525521
var hasDir = false;
526-
if (!dataTransferItems || !dataTransferItems.length) return onDone(files, hasDir);
527522

528-
var items = Array.prototype.slice.call(dataTransferItems);
529-
Promise.all(items.map(function (item) {
523+
return Promise.all(Array.from(dataTransferItems).map(function (item) {
530524
return item.getAsFileSystemHandle();
531525
})).then(function (handles) {
532526
handles = handles.filter(Boolean); // undefined for pasted content
533527
hasDir = handles.some(function (handle) {
534528
return handle.kind === handleKindDir;
535529
});
536530
if (hasDir && !canMkdir) {
537-
return onLacksMkdir();
531+
throw errLacksMkdir;
538532
}
539533
var handleResults = handles.map(function (handle) {
540534
return {value: handle, done: false};
541535
});
542-
resultsToFiles(handleResults, files, '').then(function () {
543-
onDone(files, hasDir);
536+
return resultsToFiles(handleResults, files, '').then(function () {
537+
return {files: files, hasDir: hasDir};
544538
});
545539
});
546540
}
547541
} else {
548-
itemsToFiles = function (dataTransferItems, canMkdir, onDone, onLacksMkdir) {
549-
function entriesToFiles(entries, files, onLevelDone) {
550-
var len = entries.length;
551-
var cb = 0;
552-
if (!len) return onLevelDone();
553-
554-
function increaseCb() {
555-
cb++;
556-
if (cb === len) {
557-
onLevelDone();
558-
}
559-
}
560-
561-
function dirReaderToFiles(dirReader, files, onAllRead) {
562-
dirReader.readEntries(function (subEntries) {
563-
if (!subEntries.length) return onAllRead();
564-
entriesToFiles(subEntries, files, function () {
565-
dirReaderToFiles(dirReader, files, onAllRead);
566-
});
567-
}, onAllRead);
568-
}
569-
570-
entries.forEach(function (entry) {
571-
if (entry.isFile) {
572-
var relativePath = entry.fullPath;
573-
if (relativePath[0] === '/') {
574-
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+
entry.createReader().readEntries(function (subEntries) {
560+
entriesToFiles(subEntries, files).then(resolve);
561+
});
575562
}
576-
entry.file(function (file) {
577-
files.push({file: file, relativePath: relativePath});
578-
increaseCb();
579-
}, function (err) {
580-
increaseCb();
581-
logError(err);
582-
});
583-
} else if (entry.isDirectory) {
584-
var dirReader = entry.createReader();
585-
dirReaderToFiles(dirReader, files, increaseCb);
586-
}
587-
});
563+
})
564+
}));
588565
}
589566

590567
var files = [];
591568
var hasDir = false;
592-
if (!dataTransferItems || !dataTransferItems.length || !dataTransferItems[0].webkitGetAsEntry) return onDone(files, hasDir);
593569

594570
var entries = [];
595-
for (var i = 0, len = dataTransferItems.length; i < len; i++) {
571+
for (var i = 0; i < dataTransferItems.length; i++) {
596572
var item = dataTransferItems[i];
597573
var entry = item.webkitGetAsEntry();
598574
if (!entry) { // undefined for pasted text
@@ -608,27 +584,17 @@
608584
if (canMkdir) {
609585
entries.push(entry);
610586
} else {
611-
return onLacksMkdir();
587+
throw errLacksMkdir;
612588
}
613589
}
614590
}
615591

616-
entriesToFiles(entries, files, function () {
617-
onDone(files, hasDir);
592+
return entriesToFiles(entries, files).then(function () {
593+
return {files: files, hasDir: hasDir};
618594
});
619595
}
620596
}
621597

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

@@ -926,8 +892,9 @@
926892
return;
927893
}
928894

929-
dataTransferToFiles(e.dataTransfer, canMkdir && Boolean(uploadProgressively), function (files, hasDir) {
930-
if (hasDir) {
895+
itemsToFiles(e.dataTransfer.items, canMkdir && Boolean(uploadProgressively)).then(function (result) {
896+
var files = result.files;
897+
if (result.hasDir) {
931898
switchToDirMode();
932899
uploadProgressively(files);
933900
} else {
@@ -939,8 +906,10 @@
939906
form.submit();
940907
}
941908
}
942-
}, function () {
943-
typeof showUploadDirFailMessage !== strUndef && showUploadDirFailMessage();
909+
}, function (err) {
910+
if (err === errLacksMkdir && typeof showUploadDirFailMessage !== strUndef) {
911+
showUploadDirFailMessage();
912+
}
944913
});
945914
}
946915

0 commit comments

Comments
 (0)