Skip to content

Commit b9bf91a

Browse files
committed
fix(async-stack): handle esc keydown explicitly in enhanceDialog for preventResolution
1 parent a7c0e17 commit b9bf91a

2 files changed

Lines changed: 18 additions & 0 deletions

File tree

.changeset/spicy-mayflies-stare.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@svelte-put/async-stack': patch
3+
---
4+
5+
(experimental) proactively invoke `preventDefault` on "Escape" keydown to ensure consistency for `preventResolution` option in `enhanceDialog` on Chrome, where the second Escape keydown will bypass the cancel event

packages/async-stack/src/helpers/enhance-dialog.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,18 @@ export function enhanceDialog(item, options) {
6666
}
6767
dialog.addEventListener('cancel', oncancel);
6868

69+
// prevent escape from closing dialog if specified
70+
// this is only needed on Chrome where the cancel event isn't fired
71+
// if Escape is pressed twice
72+
// See: https://issues.chromium.org/issues/41491338
73+
/** @param {KeyboardEvent} event */
74+
function onkeydown(event) {
75+
if (options?.preventResolution && event.key === 'Escape') {
76+
event.preventDefault();
77+
}
78+
}
79+
window.addEventListener('keydown', onkeydown);
80+
6981
return () => {
7082
offResolve?.();
7183
resumeResolution?.();
@@ -74,6 +86,7 @@ export function enhanceDialog(item, options) {
7486
dialog.removeEventListener('clickbackdrop', onclickbackdrop);
7587
dialog.removeEventListener('close', onclose);
7688
dialog.removeEventListener('cancel', oncancel);
89+
window.removeEventListener('keydown', onkeydown);
7790
};
7891
},
7992
};

0 commit comments

Comments
 (0)