fix(files-overlay): fall back to getAsFile when webkitGetAsEntry returns null
webkitGetAsEntry() only returns an Entry for real OS-originated drag-drops; synthetic DragEvents (and some browsers without folder-drop support) get null back. Per-item fallback to getAsFile() keeps single-file drops working in those cases without sacrificing the whole-folder upload path on real OS drops. Caught while end-to-end testing on the deploy box: a programmatically- dispatched drop fired the listener and reached preventDefault(), but no upload row appeared because the file collection loop never enqueued. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
2d3c98866a
commit
76cd7ddda0
1 changed files with 19 additions and 6 deletions
|
|
@ -890,17 +890,30 @@
|
|||
return;
|
||||
}
|
||||
|
||||
// External drop — collect entries via webkitGetAsEntry if available,
|
||||
// else fall back to flat dataTransfer.files.
|
||||
// External drop — collect entries via webkitGetAsEntry where it
|
||||
// returns an Entry (real OS drag with folder support), and fall back
|
||||
// to getAsFile() for any item whose entry is null (synthetic events,
|
||||
// browsers without the API, or items that have no folder structure).
|
||||
const items = event.dataTransfer.items;
|
||||
const files = [];
|
||||
const tasks = [];
|
||||
if (items && items[0] && typeof items[0].webkitGetAsEntry === "function") {
|
||||
if (items && items.length) {
|
||||
for (let i = 0; i < items.length; i++) {
|
||||
const entry = items[i].webkitGetAsEntry();
|
||||
if (entry) tasks.push(walkEntry(entry, "", files));
|
||||
const item = items[i];
|
||||
if (typeof item.webkitGetAsEntry === "function") {
|
||||
const entry = item.webkitGetAsEntry();
|
||||
if (entry) {
|
||||
tasks.push(walkEntry(entry, "", files));
|
||||
continue;
|
||||
}
|
||||
}
|
||||
// Fallback: treat as a flat file.
|
||||
if (typeof item.getAsFile === "function") {
|
||||
const f = item.getAsFile();
|
||||
if (f) files.push({ file: f, rel: f.name });
|
||||
}
|
||||
}
|
||||
} else {
|
||||
} else if (event.dataTransfer.files) {
|
||||
for (let i = 0; i < event.dataTransfer.files.length; i++) {
|
||||
files.push({ file: event.dataTransfer.files[i], rel: event.dataTransfer.files[i].name });
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue