Skip to content

Commit 83c8b03

Browse files
committed
Add defaultVisible, visible and onToggle props to overlays
1 parent acfb036 commit 83c8b03

File tree

3 files changed

+42
-15
lines changed

3 files changed

+42
-15
lines changed

src/components/popover/injectPopover.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ const propTypes = {
1212
};
1313

1414
export default function injectPopover(Component) {
15-
function OverlayPopover(props) {
15+
const OverlayPopover = React.forwardRef((props, ref) => {
16+
/* eslint-disable react/prop-types */
1617
const {
1718
popover: {
1819
title,
@@ -21,11 +22,15 @@ export default function injectPopover(Component) {
2122
trigger = 'click',
2223
placement = 'right',
2324
fallbackPlacement,
25+
defaultVisible,
26+
visible,
27+
onToggle,
2428
},
2529
...elementProps
2630
} = props;
31+
/* eslint-enable */
2732

28-
const target = <Component {...elementProps} />;
33+
const target = <Component {...elementProps} ref={ref} />;
2934

3035
const template = (
3136
<Popover>
@@ -39,8 +44,11 @@ export default function injectPopover(Component) {
3944
trigger,
4045
placement,
4146
fallbackPlacement,
47+
defaultVisible,
48+
visible,
49+
onToggle,
4250
});
43-
}
51+
});
4452

4553
OverlayPopover.displayName = 'Overlay(Popover)';
4654
OverlayPopover.propTypes = propTypes;

src/components/tooltip/injectTooltip.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,24 @@ const propTypes = {
1111
};
1212

1313
export default function injectTooltip(Component) {
14-
function OverlayTooltip(props) {
14+
const OverlayTooltip = React.forwardRef((props, ref) => {
15+
/* eslint-disable react/prop-types */
1516
const {
1617
tooltip: {
1718
title,
1819
delay,
1920
trigger = 'hover focus',
2021
placement = 'top',
2122
fallbackPlacement,
23+
defaultVisible,
24+
visible,
25+
onToggle,
2226
},
2327
...elementProps
2428
} = props;
29+
/* eslint-enable */
2530

26-
const target = <Component {...elementProps} />;
31+
const target = <Component {...elementProps} ref={ref} />;
2732

2833
const template = <Tooltip>{title}</Tooltip>;
2934

@@ -32,8 +37,11 @@ export default function injectTooltip(Component) {
3237
trigger,
3338
placement,
3439
fallbackPlacement,
40+
defaultVisible,
41+
visible,
42+
onToggle,
3543
});
36-
}
44+
});
3745

3846
OverlayTooltip.displayName = 'Overlay(Tooltip)';
3947
OverlayTooltip.propTypes = propTypes;

src/hooks/useOverlay.js

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import useIdentifier from './useIdentifier';
88
import usePopper from './usePopper';
99
import concatRefs from '../utils/concatRefs';
1010
import optional from '../utils/optional';
11+
import useControlledState from './useControlledState';
1112

1213
export const OverlayPropTypes = {
1314
delay: PropTypes.oneOfType([
@@ -20,6 +21,9 @@ export const OverlayPropTypes = {
2021
trigger: PropTypes.oneOf(TRIGGERS),
2122
placement: PropTypes.oneOf(PLACEMENTS),
2223
fallbackPlacement: PropTypes.oneOf(['flip', 'clockwise', 'counterwise']),
24+
defaultVisible: PropTypes.bool,
25+
visible: PropTypes.bool,
26+
onToggle: PropTypes.func,
2327
};
2428

2529
function useOverlay(target, template, config) {
@@ -28,6 +32,9 @@ function useOverlay(target, template, config) {
2832
trigger: rawTrigger,
2933
placement: defaultPlacement,
3034
fallbackPlacement = 'flip',
35+
defaultVisible = false,
36+
visible: controlledVisible,
37+
onToggle,
3138
} = config;
3239

3340
const delay =
@@ -37,7 +44,11 @@ function useOverlay(target, template, config) {
3744
const trigger = rawTrigger.split(' ');
3845

3946
const identifier = useIdentifier('template');
40-
const [visible, setVisible] = useState(false);
47+
const [visible, setVisible] = useControlledState(
48+
defaultVisible,
49+
controlledVisible,
50+
onToggle,
51+
);
4152
const [focused, setFocused] = useState(false);
4253
const [hovered, setHovered] = useState(false);
4354

@@ -64,7 +75,7 @@ function useOverlay(target, template, config) {
6475
}, target.ref),
6576
...optional(visible, { 'aria-describedby': identifier }),
6677
onPress: (event) => {
67-
if (trigger.indexOf('click') !== -1) {
78+
if (trigger.includes('click')) {
6879
setVisible((value) => !value);
6980
}
7081

@@ -73,10 +84,10 @@ function useOverlay(target, template, config) {
7384
}
7485
},
7586
onFocus: (event) => {
76-
if (trigger.indexOf('focus') !== -1) {
87+
if (trigger.includes('focus')) {
7788
setFocused(true);
7889

79-
if (trigger.indexOf('focus') !== -1 && !visible) {
90+
if (!visible) {
8091
setVisible(true);
8192
}
8293
}
@@ -86,10 +97,10 @@ function useOverlay(target, template, config) {
8697
}
8798
},
8899
onBlur: (event) => {
89-
if (trigger.indexOf('focus') !== -1) {
100+
if (trigger.includes('focus')) {
90101
setFocused(false);
91102

92-
const activeHoverTrigger = trigger.indexOf('hover') !== -1 && hovered;
103+
const activeHoverTrigger = trigger.includes('hover') && hovered;
93104
if (visible && !activeHoverTrigger) {
94105
setVisible(false);
95106
}
@@ -100,7 +111,7 @@ function useOverlay(target, template, config) {
100111
}
101112
},
102113
onMouseOver: (event) => {
103-
if (trigger.indexOf('hover') !== -1) {
114+
if (trigger.includes('hover')) {
104115
setHovered(true);
105116

106117
if (!visible && !focused) {
@@ -113,10 +124,10 @@ function useOverlay(target, template, config) {
113124
}
114125
},
115126
onMouseLeave: (event) => {
116-
if (trigger.indexOf('hover') !== -1) {
127+
if (trigger.includes('hover')) {
117128
setHovered(false);
118129

119-
const activeFocusTrigger = trigger.indexOf('focus') !== -1 && focused;
130+
const activeFocusTrigger = trigger.includes('focus') && focused;
120131
if (visible && !activeFocusTrigger) {
121132
setVisible(false);
122133
}

0 commit comments

Comments
 (0)