···
const hasPriority = usePriority(ref);
15
-
if (!hasPriority) return;
15
+
if (!ref.current || !hasPriority) return;
function onKey(event: KeyboardEvent) {
19
-
event.isComposing ||
20
-
event.defaultPrevented ||
21
-
event.code !== 'Escape'
24
-
event.preventDefault();
18
+
if (event.defaultPrevented || event.isComposing) return;
20
+
if (event.code === 'Escape') {
21
+
// The current dialog can be dismissed by pressing escape if it either has focus
22
+
// or it has priority
23
+
const active = document.activeElement;
24
+
if (hasPriority || (active && contains(ref.current, active))) {
25
+
event.preventDefault();
function onClick(event: MouseEvent | TouchEvent) {
31
-
contains(ref.current, event.target) ||
32
-
event.defaultPrevented
32
+
const { target } = event;
33
+
if (contains(ref.current, target) || event.defaultPrevented) {
39
-
document.addEventListener('mousedown', onClick);
40
-
document.addEventListener('touchstart', onClick);
42
+
document.addEventListener('mousedown', onClick);
43
+
document.addEventListener('touchstart', onClick);
document.addEventListener('keydown', onKey);
44
-
document.removeEventListener('mousedown', onClick);
45
-
document.removeEventListener('touchstart', onClick);
50
+
document.removeEventListener('mousedown', onClick);
51
+
document.removeEventListener('touchstart', onClick);
document.removeEventListener('keydown', onKey);
}, [ref, hasPriority, onDismiss]);