Skip to content

Commit d2798fb

Browse files
OEvgenycompulim
andauthored
fix: dropping file out of drop zone makes it stuck in visible state (#5394)
* fix: dropping file out of drop zone makes it stuck in visible state * Changelog * Fix race condition * Add a test case * Fix missing semicolon --------- Co-authored-by: William Wong <compulim@users.noreply.github.com>
1 parent ba7ba0f commit d2798fb

File tree

5 files changed

+52
-13
lines changed

5 files changed

+52
-13
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ Notes: web developers are advised to use [`~` (tilde range)](https://github.com/
121121
- Fixed math parsing that could cause Web Chat to hang when processing certain LaTeX expressions, in PR [#5377](https://github.com/microsoft/BotFramework-WebChat/pull/5377), by [@OEvgeny](https://github.com/OEvgeny)
122122
- Fixed long math formula should be scrollable, in PR [#5380](https://github.com/microsoft/BotFramework-WebChat/pull/5380), by [@compulim](https://github.com/compulim)
123123
- Fixed [#4948](https://github.com/microsoft/BotFramework-WebChat/issues/4948). Microphone should stop after initial silence, in PR [#5385](https://github.com/microsoft/BotFramework-WebChat/pull/5385)
124+
- Fixed [#5390](https://github.com/microsoft/BotFramework-WebChat/issues/5390). Fixed drop zone remaining visible when file is dropped outside of the zone, in PR [#5394](https://github.com/microsoft/BotFramework-WebChat/pull/5394), by [@OEvgeny](https://github.com/OEvgeny)
124125

125126
# Removed
126127

__tests__/html/fluentTheme/dragAndDrop.upload.html

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,36 +46,66 @@
4646
dataTransfer.items.add(new File([new ArrayBuffer(100)], 'simple.txt'));
4747

4848
// WHEN: Dragging a file into document.
49-
const dragEnterDocumentEvent = new DragEvent('dragenter', { dataTransfer });
50-
51-
dragEnterDocumentEvent.initEvent('dragenter', true, true);
49+
const dragEnterDocumentEvent = new DragEvent('dragenter', {
50+
bubbles: true,
51+
cancelable: true,
52+
dataTransfer
53+
});
5254

5355
document.dispatchEvent(dragEnterDocumentEvent);
5456

5557
// THEN: Should render the drop zone.
5658
await host.snapshot();
5759

5860
// WHEN: Dragging into the drop zone.
59-
const dragEnterDropZoneEvent = new DragEvent('dragenter', { dataTransfer });
60-
61-
dragEnterDropZoneEvent.initEvent('dragenter', true, true);
61+
const dragEnterDropZoneEvent = new DragEvent('dragenter', {
62+
bubbles: true,
63+
cancelable: true,
64+
dataTransfer
65+
});
6266

6367
document
6468
.querySelector(`[data-testid="${WebChat.testIds['sendBoxDropZone']}"]`)
6569
.dispatchEvent(dragEnterDropZoneEvent);
6670

67-
// THEN: Should render the drop zone.
71+
// THEN: Should render element dropped.
6872
await host.snapshot();
6973

7074
// WHEN: Dropping into the drop zone.
71-
const dropEvent = new DragEvent('drop', { dataTransfer });
72-
73-
dropEvent.initEvent('drop', true, true);
75+
const dropEvent = new DragEvent('drop', {
76+
bubbles: true,
77+
cancelable: true,
78+
dataTransfer
79+
});
7480

7581
document.querySelector(`[data-testid="${WebChat.testIds['sendBoxDropZone']}"]`).dispatchEvent(dropEvent);
7682

7783
// THEN: Should render the drop zone.
7884
await host.snapshot();
85+
86+
// WHEN: Dragging a file into document.
87+
const dragEnterDocumentEvent1 = new DragEvent('dragenter', {
88+
bubbles: true,
89+
cancelable: true,
90+
dataTransfer
91+
});
92+
93+
document.dispatchEvent(dragEnterDocumentEvent1);
94+
95+
// THEN: Should render the drop zone.
96+
await host.snapshot();
97+
98+
// WHEN: Dropping out of the drop zone.
99+
const dropEvent1 = new DragEvent('drop', {
100+
bubbles: true,
101+
cancelable: true,
102+
dataTransfer
103+
});
104+
105+
document.body.dispatchEvent(dropEvent1);
106+
107+
// THEN: Should render single element dropped.
108+
await host.snapshot();
79109
});
80110
</script>
81111
</body>

packages/fluent-theme/src/components/dropZone/DropZone.tsx

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,22 @@ const DropZone = (props: { readonly onFilesAdded: (files: File[]) => void }) =>
6767
setDropZoneState(false);
6868
};
6969

70-
document.addEventListener('dragenter', handleDragEnter, false);
71-
document.addEventListener('dragleave', handleDragLeave, false);
72-
document.addEventListener('dragend', handleDragEnd, false);
70+
const handleDocumentDrop = (event: DragEvent) => {
71+
if (!dropZoneRef.current?.contains(event.target as Node)) {
72+
handleDragEnd();
73+
}
74+
};
75+
76+
document.addEventListener('dragenter', handleDragEnter);
77+
document.addEventListener('dragleave', handleDragLeave);
78+
document.addEventListener('dragend', handleDragEnd);
79+
document.addEventListener('drop', handleDocumentDrop);
7380

7481
return () => {
7582
document.removeEventListener('dragenter', handleDragEnter);
7683
document.removeEventListener('dragleave', handleDragLeave);
7784
document.removeEventListener('dragend', handleDragEnd);
85+
document.removeEventListener('drop', handleDocumentDrop);
7886
};
7987
}, [setDropZoneState]);
8088

0 commit comments

Comments
 (0)