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

View File

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