feat: drag n drop

This commit is contained in:
not-nullptr 2024-11-11 18:32:59 +00:00
parent c0925bf6de
commit 08353cf8ff
2 changed files with 42 additions and 8 deletions

View File

@ -1,8 +1,10 @@
<script lang="ts">
import { Upload } from "lucide-svelte";
import clsx from "clsx";
import { onMount } from "svelte";
let fileList = $state<FileList | undefined>();
let fileList = $state<FileList>();
let dragBtn = $state<HTMLButtonElement>();
interface Props {
files: File[] | undefined;
@ -23,16 +25,48 @@
fileInput.click();
}
onMount(() => {
const handler = (e: Event) => e.preventDefault();
if (!dragBtn) return;
dragBtn.addEventListener("dragenter", handler);
dragBtn.addEventListener("dragstart", handler);
dragBtn.addEventListener("dragend", handler);
dragBtn.addEventListener("dragleave", handler);
dragBtn.addEventListener("dragover", handler);
dragBtn.addEventListener("drag", handler);
dragBtn.addEventListener("drop", handler);
return () => {
if (!dragBtn) return;
dragBtn.removeEventListener("dragenter", handler);
dragBtn.removeEventListener("dragstart", handler);
dragBtn.removeEventListener("dragend", handler);
dragBtn.removeEventListener("dragleave", handler);
dragBtn.removeEventListener("dragover", handler);
dragBtn.removeEventListener("drag", handler);
dragBtn.removeEventListener("drop", handler);
};
});
function drop(event: DragEvent) {
event.preventDefault();
dragOver = false;
if (!event.dataTransfer) return;
if (!files) files = Array.from(event.dataTransfer.files);
else files.push(...Array.from(event.dataTransfer.files));
return true;
}
function addFiles() {
if (!fileInput) return;
if (!fileInput.files) return;
if (!files) files = Array.from(fileInput.files);
else files.push(...Array.from(fileInput.files));
}
</script>
<button
bind:this={dragBtn}
onclick={upload}
ondragover={() => (dragOver = true)}
ondragleave={() => (dragOver = false)}
@ -60,7 +94,7 @@
<input
type="file"
class="hidden"
bind:files={fileList}
bind:this={fileInput}
onchange={addFiles}
multiple
/>

View File

@ -4,14 +4,14 @@
let conversionTypes = $state<string[]>([]);
let downloadFns = $state<(() => void)[]>([]);
let files = $state<FileList>();
let iterableFiles = $derived.by(() => {
if (!files) return [];
return Array.from(files);
let files = $state<File[]>();
$effect(() => {
$inspect(files);
});
const convertAllFiles = async () => {
const promises = iterableFiles.map(async (file, i) => {
const promises = files?.map(async (file, i) => {
let conversionType = conversionTypes[i];
const converter = converters[0];
const convertedFile = await converter.convert(
@ -35,7 +35,7 @@
URL.revokeObjectURL(url);
};
});
await Promise.all(promises);
if (promises) await Promise.all(promises);
};
</script>