2
2
import React , {
3
3
Fragment ,
4
4
createContext ,
5
- useCallback ,
6
5
useContext ,
7
6
useEffect ,
8
7
useMemo ,
9
8
useReducer ,
10
9
useRef ,
11
10
12
11
// Types
12
+ ContextType ,
13
13
Dispatch ,
14
14
ElementType ,
15
15
KeyboardEvent as ReactKeyboardEvent ,
16
16
MouseEvent as ReactMouseEvent ,
17
- Ref ,
18
17
MutableRefObject ,
19
- ContextType ,
18
+ Ref ,
20
19
} from 'react'
21
20
22
21
import { Props } from '../../types'
@@ -29,6 +28,7 @@ import { isDisabledReactIssue7711 } from '../../utils/bugs'
29
28
import { OpenClosedProvider , State , useOpenClosed } from '../../internal/open-closed'
30
29
import { useResolveButtonType } from '../../hooks/use-resolve-button-type'
31
30
import { getOwnerDocument } from '../../utils/owner'
31
+ import { useEvent } from '../../hooks/use-event'
32
32
33
33
enum DisclosureStates {
34
34
Open ,
@@ -188,24 +188,21 @@ let DisclosureRoot = forwardRefWithAs(function Disclosure<
188
188
useEffect ( ( ) => dispatch ( { type : ActionTypes . SetButtonId , buttonId } ) , [ buttonId , dispatch ] )
189
189
useEffect ( ( ) => dispatch ( { type : ActionTypes . SetPanelId , panelId } ) , [ panelId , dispatch ] )
190
190
191
- let close = useCallback (
192
- ( focusableElement ?: HTMLElement | MutableRefObject < HTMLElement | null > ) => {
193
- dispatch ( { type : ActionTypes . CloseDisclosure } )
194
- let ownerDocument = getOwnerDocument ( internalDisclosureRef )
195
- if ( ! ownerDocument ) return
191
+ let close = useEvent ( ( focusableElement ?: HTMLElement | MutableRefObject < HTMLElement | null > ) => {
192
+ dispatch ( { type : ActionTypes . CloseDisclosure } )
193
+ let ownerDocument = getOwnerDocument ( internalDisclosureRef )
194
+ if ( ! ownerDocument ) return
196
195
197
- let restoreElement = ( ( ) => {
198
- if ( ! focusableElement ) return ownerDocument . getElementById ( buttonId )
199
- if ( focusableElement instanceof HTMLElement ) return focusableElement
200
- if ( focusableElement . current instanceof HTMLElement ) return focusableElement . current
196
+ let restoreElement = ( ( ) => {
197
+ if ( ! focusableElement ) return ownerDocument . getElementById ( buttonId )
198
+ if ( focusableElement instanceof HTMLElement ) return focusableElement
199
+ if ( focusableElement . current instanceof HTMLElement ) return focusableElement . current
201
200
202
- return ownerDocument . getElementById ( buttonId )
203
- } ) ( )
201
+ return ownerDocument . getElementById ( buttonId )
202
+ } ) ( )
204
203
205
- restoreElement ?. focus ( )
206
- } ,
207
- [ dispatch , buttonId ]
208
- )
204
+ restoreElement ?. focus ( )
205
+ } )
209
206
210
207
let api = useMemo < ContextType < typeof DisclosureAPIContext > > ( ( ) => ( { close } ) , [ close ] )
211
208
@@ -265,35 +262,32 @@ let Button = forwardRefWithAs(function Button<TTag extends ElementType = typeof
265
262
let internalButtonRef = useRef < HTMLButtonElement | null > ( null )
266
263
let buttonRef = useSyncRefs ( internalButtonRef , ref , ! isWithinPanel ? state . buttonRef : null )
267
264
268
- let handleKeyDown = useCallback (
269
- ( event : ReactKeyboardEvent < HTMLButtonElement > ) => {
270
- if ( isWithinPanel ) {
271
- if ( state . disclosureState === DisclosureStates . Closed ) return
272
-
273
- switch ( event . key ) {
274
- case Keys . Space :
275
- case Keys . Enter :
276
- event . preventDefault ( )
277
- event . stopPropagation ( )
278
- dispatch ( { type : ActionTypes . ToggleDisclosure } )
279
- state . buttonRef . current ?. focus ( )
280
- break
281
- }
282
- } else {
283
- switch ( event . key ) {
284
- case Keys . Space :
285
- case Keys . Enter :
286
- event . preventDefault ( )
287
- event . stopPropagation ( )
288
- dispatch ( { type : ActionTypes . ToggleDisclosure } )
289
- break
290
- }
265
+ let handleKeyDown = useEvent ( ( event : ReactKeyboardEvent < HTMLButtonElement > ) => {
266
+ if ( isWithinPanel ) {
267
+ if ( state . disclosureState === DisclosureStates . Closed ) return
268
+
269
+ switch ( event . key ) {
270
+ case Keys . Space :
271
+ case Keys . Enter :
272
+ event . preventDefault ( )
273
+ event . stopPropagation ( )
274
+ dispatch ( { type : ActionTypes . ToggleDisclosure } )
275
+ state . buttonRef . current ?. focus ( )
276
+ break
291
277
}
292
- } ,
293
- [ dispatch , isWithinPanel , state . disclosureState , state . buttonRef ]
294
- )
278
+ } else {
279
+ switch ( event . key ) {
280
+ case Keys . Space :
281
+ case Keys . Enter :
282
+ event . preventDefault ( )
283
+ event . stopPropagation ( )
284
+ dispatch ( { type : ActionTypes . ToggleDisclosure } )
285
+ break
286
+ }
287
+ }
288
+ } )
295
289
296
- let handleKeyUp = useCallback ( ( event : ReactKeyboardEvent < HTMLButtonElement > ) => {
290
+ let handleKeyUp = useEvent ( ( event : ReactKeyboardEvent < HTMLButtonElement > ) => {
297
291
switch ( event . key ) {
298
292
case Keys . Space :
299
293
// Required for firefox, event.preventDefault() in handleKeyDown for
@@ -302,22 +296,19 @@ let Button = forwardRefWithAs(function Button<TTag extends ElementType = typeof
302
296
event . preventDefault ( )
303
297
break
304
298
}
305
- } , [ ] )
306
-
307
- let handleClick = useCallback (
308
- ( event : ReactMouseEvent ) => {
309
- if ( isDisabledReactIssue7711 ( event . currentTarget ) ) return
310
- if ( props . disabled ) return
311
-
312
- if ( isWithinPanel ) {
313
- dispatch ( { type : ActionTypes . ToggleDisclosure } )
314
- state . buttonRef . current ?. focus ( )
315
- } else {
316
- dispatch ( { type : ActionTypes . ToggleDisclosure } )
317
- }
318
- } ,
319
- [ dispatch , props . disabled , state . buttonRef , isWithinPanel ]
320
- )
299
+ } )
300
+
301
+ let handleClick = useEvent ( ( event : ReactMouseEvent ) => {
302
+ if ( isDisabledReactIssue7711 ( event . currentTarget ) ) return
303
+ if ( props . disabled ) return
304
+
305
+ if ( isWithinPanel ) {
306
+ dispatch ( { type : ActionTypes . ToggleDisclosure } )
307
+ state . buttonRef . current ?. focus ( )
308
+ } else {
309
+ dispatch ( { type : ActionTypes . ToggleDisclosure } )
310
+ }
311
+ } )
321
312
322
313
let slot = useMemo < ButtonRenderPropArg > (
323
314
( ) => ( { open : state . disclosureState === DisclosureStates . Open } ) ,
0 commit comments