routie dev init since i didn't adhere to any proper guidance up until now
This commit is contained in:
+49
@@ -0,0 +1,49 @@
|
||||
// Types
|
||||
|
||||
export function useFileDrop() {
|
||||
function hasFilesOrFolders(e) {
|
||||
const entries = [...(e.dataTransfer?.items ?? [])].filter(x => x.kind === 'file').map(x => x.webkitGetAsEntry()).filter(Boolean);
|
||||
return entries.length > 0 || [...(e.dataTransfer?.files ?? [])].length > 0;
|
||||
}
|
||||
async function handleDrop(e) {
|
||||
const result = [];
|
||||
const entries = [...(e.dataTransfer?.items ?? [])].filter(x => x.kind === 'file').map(x => x.webkitGetAsEntry()).filter(Boolean);
|
||||
if (entries.length) {
|
||||
for (const entry of entries) {
|
||||
const files = await traverseFileTree(entry, appendIfDirectory('.', entry));
|
||||
result.push(...files.map(x => x.file));
|
||||
}
|
||||
} else {
|
||||
result.push(...[...(e.dataTransfer?.files ?? [])]);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
return {
|
||||
handleDrop,
|
||||
hasFilesOrFolders
|
||||
};
|
||||
}
|
||||
function traverseFileTree(item, path = '') {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (item.isFile) {
|
||||
const fileEntry = item;
|
||||
fileEntry.file(file => resolve([{
|
||||
file,
|
||||
path
|
||||
}]), reject);
|
||||
} else if (item.isDirectory) {
|
||||
const directoryReader = item.createReader();
|
||||
directoryReader.readEntries(async entries => {
|
||||
const files = [];
|
||||
for (const entry of entries) {
|
||||
files.push(...(await traverseFileTree(entry, appendIfDirectory(path, entry))));
|
||||
}
|
||||
resolve(files);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
function appendIfDirectory(path, item) {
|
||||
return item.isDirectory ? `${path}/${item.name}` : path;
|
||||
}
|
||||
//# sourceMappingURL=fileDrop.js.map
|
||||
Reference in New Issue
Block a user