@@ -37,7 +37,7 @@ function TooltipTrigger(props) {
37
37
38
38
return (
39
39
< span >
40
- < button aria-label = " trigger" ref = { ref } { ...triggerProps } >
40
+ < button aria-label = { props . label ?? ' trigger' } ref = { ref } { ...triggerProps } >
41
41
{ props . children }
42
42
</ button >
43
43
{ state . isOpen &&
@@ -46,6 +46,23 @@ function TooltipTrigger(props) {
46
46
) ;
47
47
}
48
48
49
+ function ManualTooltipTrigger ( props ) {
50
+ let [ isOpen , setOpen ] = React . useState ( false ) ;
51
+
52
+ const onOpenChange = ( isOpen ) => {
53
+ props . onOpenChange ( isOpen ) ;
54
+ setOpen ( isOpen ) ;
55
+ } ;
56
+
57
+ return (
58
+ < TooltipTrigger
59
+ label = { props . label }
60
+ onOpenChange = { onOpenChange }
61
+ isOpen = { isOpen }
62
+ tooltip = { props . tooltip } />
63
+ ) ;
64
+ }
65
+
49
66
/**
50
67
* Most of the tests for useTooltipTriggerState are in the React Spectrum package at
51
68
* @react -spectrum/tooltip/test/TooltipTrigger.test.js. The React Spectrum tooltip
@@ -196,4 +213,45 @@ describe('useTooltipTriggerState', function () {
196
213
expect ( onOpenChange ) . toHaveBeenCalledWith ( false ) ;
197
214
} ) ;
198
215
} ) ;
216
+
217
+ describe ( 'multiple controlled tooltips' , ( ) => {
218
+ it ( 'closes previus tooltip when opening a new one' , ( ) => {
219
+ let secondOnOpenChange = jest . fn ( ) ;
220
+
221
+ let { queryByRole, getByLabelText} = render (
222
+ < >
223
+ < ManualTooltipTrigger onOpenChange = { onOpenChange } tooltip = "First tooltip" label = "trigger1" >
224
+ Trigger 1
225
+ </ ManualTooltipTrigger >
226
+
227
+ < ManualTooltipTrigger onOpenChange = { secondOnOpenChange } tooltip = "Second tooltip" label = "trigger2" >
228
+ Trigger 2
229
+ </ ManualTooltipTrigger >
230
+ </ >
231
+ ) ;
232
+
233
+ fireEvent . mouseDown ( document . body ) ;
234
+ fireEvent . mouseUp ( document . body ) ;
235
+
236
+ let button1 = getByLabelText ( 'trigger1' ) ;
237
+ fireEvent . mouseEnter ( button1 ) ;
238
+ fireEvent . mouseMove ( button1 ) ;
239
+
240
+ // run through open timer and confirm that it has opened
241
+ act ( ( ) => jest . advanceTimersByTime ( TOOLTIP_DELAY ) ) ;
242
+
243
+ expect ( onOpenChange ) . toHaveBeenCalledWith ( true ) ;
244
+ expect ( queryByRole ( 'tooltip' ) ) . toBeVisible ( ) ;
245
+
246
+ let button2 = getByLabelText ( 'trigger2' ) ;
247
+ fireEvent . mouseEnter ( button2 ) ;
248
+ fireEvent . mouseMove ( button2 ) ;
249
+
250
+ // run through open timer and confirm that it has opened
251
+ act ( ( ) => jest . advanceTimersByTime ( TOOLTIP_DELAY ) ) ;
252
+
253
+ expect ( onOpenChange ) . toHaveBeenCalledTimes ( 2 ) ;
254
+ expect ( onOpenChange ) . toHaveBeenCalledWith ( false ) ;
255
+ } ) ;
256
+ } ) ;
199
257
} ) ;
0 commit comments