diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index af2ebe5..5187930 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -15,6 +15,8 @@ let feedbackMessage = $state(''); let images = $state([]); let loadingImages = $state(false); + let isDragging = $state(false); + let dragCounter = 0; async function loadImages() { if (!user.did) return; @@ -40,10 +42,11 @@ } }); - async function handleImageUpload(event: Event) { - const input = event.target as HTMLInputElement; - const file = input.files?.[0]; - if (!file) return; + async function uploadImage(file: File) { + if (!file.type.startsWith('image/')) { + feedbackMessage = 'Please drop an image file'; + return; + } isUploading = true; feedbackMessage = ''; @@ -92,6 +95,46 @@ } } + function handleFileInput(event: Event) { + const input = event.target as HTMLInputElement; + const file = input.files?.[0]; + if (file) uploadImage(file); + } + + function handleDragEnter(event: DragEvent) { + event.preventDefault(); + dragCounter++; + if (event.dataTransfer?.types.includes('Files')) { + isDragging = true; + } + } + + function handleDragLeave(event: DragEvent) { + event.preventDefault(); + dragCounter--; + if (dragCounter === 0) { + isDragging = false; + } + } + + function handleDragOver(event: DragEvent) { + event.preventDefault(); + } + + function handleDrop(event: DragEvent) { + event.preventDefault(); + dragCounter = 0; + isDragging = false; + + if (!user.isLoggedIn) { + feedbackMessage = 'Please log in to upload images'; + return; + } + + const file = event.dataTransfer?.files[0]; + if (file) uploadImage(file); + } + function getImageUrl(record: ImageRecord): string | undefined { if (!user.did) return; return getImageFromRecord(record.value, user.did); @@ -144,7 +187,27 @@ } -
+ +
+ + {#if isDragging && user.isLoggedIn} +
+
+ + + + Drop image here to upload +
+
+ {/if} + +