@@ -5,7 +5,6 @@ import useTimeout from '@restart/hooks/useTimeout';
5
5
import safeFindDOMNode from 'react-overlays/safeFindDOMNode' ;
6
6
import warning from 'warning' ;
7
7
import { useUncontrolledProp } from 'uncontrollable' ;
8
- import { Modifier } from 'react-overlays/esm/usePopper' ;
9
8
import Overlay , { OverlayChildren , OverlayProps } from './Overlay' ;
10
9
11
10
export type OverlayTriggerType = 'hover' | 'click' | 'focus' ;
@@ -16,9 +15,15 @@ export type OverlayInjectedProps = {
16
15
onFocus ?: ( ...args : any [ ] ) => any ;
17
16
} ;
18
17
18
+ export type OverlayTriggerRenderProps = OverlayInjectedProps & {
19
+ ref : React . Ref < any > ;
20
+ } ;
21
+
19
22
export interface OverlayTriggerProps
20
23
extends Omit < OverlayProps , 'children' | 'target' > {
21
- children : React . ReactElement ;
24
+ children :
25
+ | React . ReactElement
26
+ | ( ( props : OverlayTriggerRenderProps ) => React . ReactNode ) ;
22
27
trigger ?: OverlayTriggerType | OverlayTriggerType [ ] ;
23
28
delay ?: OverlayDelay ;
24
29
show ?: boolean ;
@@ -51,9 +56,9 @@ function normalizeDelay(delay?: OverlayDelay) {
51
56
// for cases when the trigger is disabled and mouseOut/Over can cause flicker
52
57
// moving from one child element to another.
53
58
function handleMouseOverOut (
54
- handler : ( ...args : any [ ] ) => any ,
59
+ handler : ( ...args : [ React . MouseEvent , ... any [ ] ] ) => any ,
55
60
args : [ React . MouseEvent , ...any [ ] ] ,
56
- relatedNative ,
61
+ relatedNative : 'fromElement' | 'toElement' ,
57
62
) {
58
63
const [ e ] = args ;
59
64
const target = e . currentTarget ;
@@ -188,9 +193,10 @@ function OverlayTrigger({
188
193
189
194
const delay = normalizeDelay ( propsDelay ) ;
190
195
191
- const child = React . Children . only ( children ) ;
192
-
193
- const { onFocus, onBlur, onClick } = child . props ;
196
+ const { onFocus, onBlur, onClick } =
197
+ typeof children !== 'function'
198
+ ? React . Children . only ( children ) . props
199
+ : ( { } as any ) ;
194
200
195
201
const getTarget = useCallback (
196
202
( ) => safeFindDOMNode ( triggerNodeRef . current ) ,
@@ -228,15 +234,15 @@ function OverlayTrigger({
228
234
const handleFocus = useCallback (
229
235
( ...args : any [ ] ) => {
230
236
handleShow ( ) ;
231
- if ( onFocus ) onFocus ( ...args ) ;
237
+ onFocus ?. ( ...args ) ;
232
238
} ,
233
239
[ handleShow , onFocus ] ,
234
240
) ;
235
241
236
242
const handleBlur = useCallback (
237
243
( ...args : any [ ] ) => {
238
244
handleHide ( ) ;
239
- if ( onBlur ) onBlur ( ...args ) ;
245
+ onBlur ?. ( ...args ) ;
240
246
} ,
241
247
[ handleHide , onBlur ] ,
242
248
) ;
@@ -263,34 +269,6 @@ function OverlayTrigger({
263
269
[ handleHide ] ,
264
270
) ;
265
271
266
- // We add aria-describedby in the case where the overlay is a role="tooltip"
267
- // for other cases describedby isn't appropriate (e.g. a popover with inputs) so we don't add it.
268
- const ariaModifier : Modifier < 'ariaDescribedBy' , Record < string , unknown > > = {
269
- name : 'ariaDescribedBy' ,
270
- enabled : true ,
271
- phase : 'afterWrite' ,
272
- effect : ( { state } ) => {
273
- return ( ) => {
274
- if ( 'removeAttribute' in state . elements . reference )
275
- state . elements . reference . removeAttribute ( 'aria-describedby' ) ;
276
- } ;
277
- } ,
278
- fn : ( { state } ) => {
279
- const { popper, reference } = state . elements ;
280
-
281
- if ( ! show || ! reference ) return ;
282
-
283
- const role = popper . getAttribute ( 'role' ) || '' ;
284
- if (
285
- popper . id &&
286
- role . toLowerCase ( ) === 'tooltip' &&
287
- 'setAttribute' in reference
288
- ) {
289
- reference . setAttribute ( 'aria-describedby' , popper . id ) ;
290
- }
291
- } ,
292
- } ;
293
-
294
272
const triggers : string [ ] = trigger == null ? [ ] : [ ] . concat ( trigger as any ) ;
295
273
const triggerProps : any = { } ;
296
274
@@ -312,25 +290,23 @@ function OverlayTrigger({
312
290
triggerProps . onMouseOut = handleMouseOut ;
313
291
}
314
292
315
- // TODO: fix typing
316
- // @ts -ignore
317
- const modifiers = [ ariaModifier ] . concat ( popperConfig . modifiers || [ ] ) ;
318
293
return (
319
294
< >
320
- < RefHolder ref = { triggerNodeRef } >
321
- { cloneElement ( child as any , triggerProps ) }
322
- </ RefHolder >
295
+ { typeof children === 'function' ? (
296
+ children ( { ...triggerProps , ref : triggerNodeRef } )
297
+ ) : (
298
+ < RefHolder ref = { triggerNodeRef } >
299
+ { cloneElement ( children as any , triggerProps ) }
300
+ </ RefHolder >
301
+ ) }
323
302
< Overlay
324
303
{ ...props }
325
- popperConfig = { {
326
- ...popperConfig ,
327
- modifiers,
328
- } }
329
304
show = { show }
330
305
onHide = { handleHide }
331
- target = { getTarget as any }
332
- placement = { placement }
333
306
flip = { flip }
307
+ placement = { placement }
308
+ popperConfig = { popperConfig }
309
+ target = { getTarget as any }
334
310
>
335
311
{ overlay }
336
312
</ Overlay >
0 commit comments