Skip to content

Commit 13d3fd1

Browse files
committed
refactor(defaultTheme): refine enhanceUpload() utilities
1 parent 0df796b commit 13d3fd1

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,8 +889,9 @@
916889
return;
917890
}
918891

919-
dataTransferToFiles(e.dataTransfer, canMkdir && Boolean(uploadProgressively), function (files, hasDir) {
920-
if (hasDir) {
892+
itemsToFiles(e.dataTransfer.items, canMkdir && Boolean(uploadProgressively)).then(function (result) {
893+
var files = result.files;
894+
if (result.hasDir) {
921895
switchToDirMode();
922896
uploadProgressively(files);
923897
} else {
@@ -929,8 +903,10 @@
929903
form.submit();
930904
}
931905
}
932-
}, function () {
933-
typeof showUploadDirFailMessage !== strUndef && showUploadDirFailMessage();
906+
}, function (err) {
907+
if (err === errLacksMkdir && typeof showUploadDirFailMessage !== strUndef) {
908+
showUploadDirFailMessage();
909+
}
934910
});
935911
}
936912

@@ -1023,7 +999,8 @@
1023999
return;
10241000
}
10251001

1026-
itemsToFiles(items, canMkdir, function (files, hasDir) {
1002+
itemsToFiles(items, canMkdir).then(function (result) {
1003+
var files = result.files;
10271004
// for pasted text
10281005
if (!files.length) {
10291006
generatePastedFiles(data);
@@ -1040,14 +1017,16 @@
10401017
}
10411018

10421019
// pasted real files
1043-
if (hasDir) {
1020+
if (result.hasDir) {
10441021
switchToDirMode();
10451022
} else {
10461023
switchToFileMode();
10471024
}
10481025
uploadProgressively(files);
1049-
}, function () {
1050-
typeof showUploadDirFailMessage !== strUndef && showUploadDirFailMessage();
1026+
}, function (err) {
1027+
if (err === errLacksMkdir && typeof showUploadDirFailMessage !== strUndef) {
1028+
showUploadDirFailMessage();
1029+
}
10511030
});
10521031
});
10531032
}

0 commit comments

Comments
 (0)