fix: 드래그 앤 드롭 — window 이벤트로 브라우저 기본 동작 차단

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Hyungi Ahn
2026-04-03 11:06:18 +09:00
parent 87bdd8003c
commit 9fd44ab268

View File

@@ -1,4 +1,5 @@
<script>
import { onMount } from 'svelte';
import { api } from '$lib/api';
import { addToast } from '$lib/stores/ui';
import { Upload } from 'lucide-svelte';
@@ -10,31 +11,52 @@
let uploadFiles = $state([]);
let dragCounter = 0;
function handleDragEnter(e) {
e.preventDefault();
dragCounter++;
dragging = true;
}
onMount(() => {
function onDragEnter(e) {
e.preventDefault();
e.stopPropagation();
dragCounter++;
dragging = true;
}
function handleDragLeave(e) {
e.preventDefault();
dragCounter--;
if (dragCounter <= 0) {
function onDragOver(e) {
e.preventDefault();
e.stopPropagation();
}
function onDragLeave(e) {
e.preventDefault();
e.stopPropagation();
dragCounter--;
if (dragCounter <= 0) {
dragging = false;
dragCounter = 0;
}
}
function onDrop(e) {
e.preventDefault();
e.stopPropagation();
dragging = false;
dragCounter = 0;
handleFiles(e.dataTransfer?.files);
}
}
function handleDragOver(e) {
e.preventDefault();
}
window.addEventListener('dragenter', onDragEnter);
window.addEventListener('dragover', onDragOver);
window.addEventListener('dragleave', onDragLeave);
window.addEventListener('drop', onDrop);
async function handleDrop(e) {
e.preventDefault();
dragging = false;
dragCounter = 0;
return () => {
window.removeEventListener('dragenter', onDragEnter);
window.removeEventListener('dragover', onDragOver);
window.removeEventListener('dragleave', onDragLeave);
window.removeEventListener('drop', onDrop);
};
});
const files = Array.from(e.dataTransfer?.files || []);
async function handleFiles(fileList) {
const files = Array.from(fileList || []);
if (files.length === 0) return;
uploading = true;
@@ -74,16 +96,9 @@
}
</script>
<svelte:document
on:dragenter={handleDragEnter}
on:dragleave={handleDragLeave}
on:dragover={handleDragOver}
on:drop={handleDrop}
/>
<!-- 전체 페이지 드래그 오버레이 -->
{#if dragging}
<div class="fixed inset-0 z-50 bg-[var(--accent)]/10 border-2 border-dashed border-[var(--accent)] flex items-center justify-center pointer-events-none">
<div class="fixed inset-0 z-50 bg-[var(--accent)]/10 border-2 border-dashed border-[var(--accent)] flex items-center justify-center">
<div class="bg-[var(--surface)] rounded-xl px-8 py-6 shadow-xl text-center">
<Upload size={32} class="mx-auto mb-2 text-[var(--accent)]" />
<p class="text-sm font-medium text-[var(--accent)]">여기에 파일을 놓으세요</p>