95 lines
1.7 KiB
TypeScript
95 lines
1.7 KiB
TypeScript
import config from "@/config";
|
|
|
|
const { uploadSizeLimit } = config;
|
|
|
|
type dropHandlerHooks = {
|
|
onDrop?: (files: File[]) => void;
|
|
onEnter?: () => void;
|
|
/**
|
|
* 当拖动时
|
|
*/
|
|
onOver?: () => void;
|
|
onLeave?: () => void;
|
|
};
|
|
|
|
const isFile = (file: File) =>
|
|
new Promise(resolve => {
|
|
const reader = new FileReader();
|
|
reader.onload = () => {
|
|
resolve(true);
|
|
reader.abort();
|
|
};
|
|
reader.onerror = () => {
|
|
resolve(false);
|
|
reader.abort();
|
|
};
|
|
reader.readAsText(file);
|
|
});
|
|
|
|
|
|
/**
|
|
* 只保留文件,移去文件夹
|
|
* @param {File[]} files
|
|
*/
|
|
const filesFilter = async (files: File[]) => {
|
|
let index = 0;
|
|
while (index < files.length) {
|
|
const currentFile = files[index];
|
|
const _isFile = await isFile(currentFile);
|
|
console.log(_isFile);
|
|
if (_isFile) {
|
|
index += 1;
|
|
continue;
|
|
} else {
|
|
files.splice(index, 1);
|
|
continue;
|
|
}
|
|
}
|
|
};
|
|
|
|
export default function dropHandler(dom: HTMLDivElement, hooks?: dropHandlerHooks) {
|
|
console.log(dom);
|
|
dom.addEventListener(
|
|
"dragenter",
|
|
function (e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
hooks?.onEnter && hooks?.onEnter();
|
|
},
|
|
false
|
|
);
|
|
|
|
dom.addEventListener(
|
|
"dragover",
|
|
function (e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
hooks?.onOver && hooks?.onOver();
|
|
},
|
|
false
|
|
);
|
|
|
|
dom.addEventListener(
|
|
"dragleave",
|
|
function (e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
hooks?.onLeave && hooks?.onLeave();
|
|
},
|
|
false
|
|
);
|
|
|
|
dom.addEventListener(
|
|
"drop",
|
|
async function (e) {
|
|
// console.log(e, e.dataTransfer?.types);
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
const files = [...(e.dataTransfer?.files ?? [])].filter(file => file.size < uploadSizeLimit);
|
|
await filesFilter(files);
|
|
hooks?.onDrop && hooks.onDrop(files);
|
|
},
|
|
false
|
|
);
|
|
}
|