@@ -6,7 +6,7 @@ import { createPortal } from 'react-dom';
66import T from 'prop-types' ;
77import { Manager , Reference , Popper } from 'react-popper' ;
88import Tooltip from './Tooltip' ;
9- import { callAll } from './utils' ;
9+ import { callAll , noop } from './utils' ;
1010
1111const DEFAULT_MODIFIERS = {
1212 preventOverflow : {
@@ -35,6 +35,10 @@ export default class TooltipTrigger extends PureComponent {
3535 * use to create controlled tooltip
3636 */
3737 tooltipShown : T . bool ,
38+ /**
39+ * use to create controlled tooltip
40+ */
41+ onVisibilityChange : T . func ,
3842 /**
3943 * delay in showing the tooltip
4044 */
@@ -77,11 +81,34 @@ export default class TooltipTrigger extends PureComponent {
7781 defaultTooltipShown : false ,
7882 placement : 'right' ,
7983 trigger : 'hover' ,
80- closeOnOutOfBoundaries : true
84+ closeOnOutOfBoundaries : true ,
85+ onChange : noop
8186 } ;
8287
8388 state = {
84- tooltipShown : this . props . defaultTooltipShown
89+ tooltipShown : this . _isControlled ( )
90+ ? undefined
91+ : this . props . defaultTooltipShown || false
92+ } ;
93+
94+ _isControlled ( ) {
95+ return this . props . tooltipShown !== undefined ;
96+ }
97+
98+ _getState ( ) {
99+ return this . _isControlled ( )
100+ ? this . props . tooltipShown
101+ : this . state . tooltipShown ;
102+ }
103+
104+ _setTooltipState = state => {
105+ const cb = ( ) => this . props . onVisibilityChange ( state ) ;
106+
107+ if ( this . _isControlled ( ) ) {
108+ cb ( ) ;
109+ } else {
110+ this . setState ( { tooltipShown : state } , cb ) ;
111+ }
85112 } ;
86113
87114 _clearScheduled = ( ) => {
@@ -91,37 +118,24 @@ export default class TooltipTrigger extends PureComponent {
91118
92119 _showTooltip = ( delay = this . props . delayShow ) => {
93120 this . _clearScheduled ( ) ;
94-
95- this . _showTimeout = setTimeout (
96- ( ) => this . setState ( { tooltipShown : true } ) ,
97- delay
98- ) ;
121+ this . _showTimeout = setTimeout ( ( ) => this . _setTooltipState ( true ) , delay ) ;
99122 } ;
100123
101124 _hideTooltip = ( delay = this . props . delayHide ) => {
102125 this . _clearScheduled ( ) ;
103-
104- this . _hideTimeout = setTimeout (
105- ( ) => this . setState ( { tooltipShown : false } ) ,
106- delay
107- ) ;
126+ this . _hideTimeout = setTimeout ( ( ) => this . _setTooltipState ( false ) , delay ) ;
108127 } ;
109128
110129 _toggleTooltip = delay => {
111- const action = this . state . tooltipShown ? '_hideTooltip' : '_showTooltip' ;
130+ const action = this . _getState ( ) ? '_hideTooltip' : '_showTooltip' ;
112131 this [ action ] ( delay ) ;
113132 } ;
114133
115134 _contextMenuToggle = event => {
116135 event . preventDefault ( ) ;
117- this . scheduleToggle ( ) ;
136+ this . _toggleTooltip ( ) ;
118137 } ;
119138
120- static getDerivedStateFromProps ( props ) {
121- const { tooltipShown } = props ;
122- return tooltipShown != null ? { tooltipShown } : null ;
123- }
124-
125139 componentWillUnmount ( ) {
126140 this . _clearScheduled ( ) ;
127141 }
@@ -143,7 +157,7 @@ export default class TooltipTrigger extends PureComponent {
143157 props . onMouseEnter
144158 ) ,
145159 onMouseLeave : callAll (
146- isHoverTriggered && this . _hideTooltip ( ) ,
160+ isHoverTriggered && this . _hideTooltip ,
147161 props . onMouseLeave
148162 )
149163 } ;
@@ -166,7 +180,7 @@ export default class TooltipTrigger extends PureComponent {
166180 children ( { getTriggerProps : this . getTriggerProps , triggerRef : ref } )
167181 }
168182 </ Reference >
169- { this . state . tooltipShown &&
183+ { this . _getState ( ) &&
170184 createPortal (
171185 < Popper
172186 placement = { placement }
0 commit comments