1
1
import { faXmark } from '@fortawesome/free-solid-svg-icons'
2
2
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
3
+ import ContextProvider from 'frontend/state/ContextProvider'
3
4
import React , {
5
+ KeyboardEvent ,
4
6
ReactNode ,
5
7
SyntheticEvent ,
6
8
useCallback ,
9
+ useContext ,
7
10
useEffect ,
8
11
useRef ,
9
12
useState
@@ -26,6 +29,7 @@ export const Dialog: React.FC<DialogProps> = ({
26
29
const onCloseRef = useRef ( onClose )
27
30
onCloseRef . current = onClose
28
31
const [ focusOnClose , setFocusOnClose ] = useState < HTMLElement | null > ( null )
32
+ const { disableDialogBackdropClose } = useContext ( ContextProvider )
29
33
30
34
useEffect ( ( ) => {
31
35
setFocusOnClose ( document . querySelector ( '*:focus' ) as HTMLElement )
@@ -45,15 +49,25 @@ export const Dialog: React.FC<DialogProps> = ({
45
49
close ( )
46
50
}
47
51
dialog . addEventListener ( 'cancel' , cancel )
48
- dialog [ 'showPopover' ] ( )
49
52
50
- return ( ) => {
51
- dialog . removeEventListener ( 'cancel' , cancel )
52
- dialog [ 'hidePopover' ] ( )
53
+ if ( disableDialogBackdropClose ) {
54
+ dialog [ 'showPopover' ] ( )
55
+
56
+ return ( ) => {
57
+ dialog . removeEventListener ( 'cancel' , cancel )
58
+ dialog [ 'hidePopover' ] ( )
59
+ }
60
+ } else {
61
+ dialog . showModal ( )
62
+
63
+ return ( ) => {
64
+ dialog . removeEventListener ( 'cancel' , cancel )
65
+ dialog . close ( )
66
+ }
53
67
}
54
68
}
55
69
return
56
- } , [ dialogRef . current ] )
70
+ } , [ dialogRef . current , disableDialogBackdropClose ] )
57
71
58
72
const onDialogClick = useCallback (
59
73
( e : SyntheticEvent ) => {
@@ -73,6 +87,12 @@ export const Dialog: React.FC<DialogProps> = ({
73
87
[ onClose ]
74
88
)
75
89
90
+ const closeIfEsc = ( event : KeyboardEvent < HTMLDialogElement > ) => {
91
+ if ( event . key === 'Escape' ) {
92
+ close ( )
93
+ }
94
+ }
95
+
76
96
return (
77
97
< div className = "Dialog" >
78
98
< dialog
@@ -82,6 +102,7 @@ export const Dialog: React.FC<DialogProps> = ({
82
102
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
83
103
// @ts -ignore, this feature is new and not yet typed
84
104
popover = "manual"
105
+ onKeyUp = { closeIfEsc }
85
106
>
86
107
{ showCloseButton && (
87
108
< div className = "Dialog__Close" >
0 commit comments