From b2a337e2dd9bfcb03abdb2481cdcf29aec69bb3c Mon Sep 17 00:00:00 2001 From: Ferit Date: Tue, 20 Oct 2026 14:31:21 +0300 Subject: [PATCH] fix: keep drag hover timers per element --- src/file-attachment-element.ts | 12 ++++++------ test/test.js | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/file-attachment-element.ts b/src/file-attachment-element.ts index 112cd18..fd29ec2 100644 --- a/src/file-attachment-element.ts +++ b/src/file-attachment-element.ts @@ -63,18 +63,18 @@ function hasFile(transfer: DataTransfer): boolean { return Array.from(transfer.types).indexOf('Files') >= 0 } -let dragging: number | null = null +const dragging = new WeakMap() // Highlight textarea and change drop cursor. Ensure drop target styles // are cleared after dragging back outside of window. function onDragenter(event: DragEvent) { const target = event.currentTarget as Element - if (dragging) { - clearTimeout(dragging) - } - - dragging = window.setTimeout(() => target.removeAttribute('hover'), 200) + clearTimeout(dragging.get(target)) + dragging.set( + target, + window.setTimeout(() => target.removeAttribute('hover'), 200) + ) const transfer = event.dataTransfer if (!transfer || !hasFile(transfer)) return diff --git a/test/test.js b/test/test.js index 3e7341e..4dae556 100644 --- a/test/test.js +++ b/test/test.js @@ -91,6 +91,22 @@ describe('file-attachment', function () { document.body.innerHTML = '' }) + it('clears hover independently for multiple attachment elements', async function () { + const other = document.createElement('file-attachment') + document.body.append(other) + const dataTransfer = new DataTransfer() + dataTransfer.items.add(new File(['hubot'], 'test.txt', {type: 'text/plain'})) + fileAttachment.dispatchEvent(new DragEvent('dragenter', {bubbles: true, dataTransfer})) + other.dispatchEvent(new DragEvent('dragenter', {bubbles: true, dataTransfer})) + assert.isTrue(fileAttachment.hasAttribute('hover')) + assert.isTrue(other.hasAttribute('hover')) + + await new Promise(resolve => window.setTimeout(resolve, 250)) + + assert.isFalse(fileAttachment.hasAttribute('hover')) + assert.isFalse(other.hasAttribute('hover')) + }) + it('attaches files via .attach', async function () { const listener = once('file-attachment-accepted')