@conveyorhq/arrow-ds 1.98.0 → 1.99.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -32,17 +32,19 @@ const types_1 = require("../../types");
|
|
|
32
32
|
const context_1 = require("./context");
|
|
33
33
|
const cn = "Tooltip";
|
|
34
34
|
const Tooltip = (props) => {
|
|
35
|
-
const { isVisible:
|
|
36
|
-
const
|
|
35
|
+
const { isVisible: isVisibleInitial = false, open: isOpenControlled, setOpen: setOpenControlled, children, referenceElement, placement = "bottom", className, delay = 200, theme = "dark", hideArrow, style, ...rest } = props;
|
|
36
|
+
const [isOpenUncontrolled, setOpenUncontrolled] = react_1.useState(isVisibleInitial);
|
|
37
|
+
const open = isOpenControlled !== null && isOpenControlled !== void 0 ? isOpenControlled : isOpenUncontrolled;
|
|
38
|
+
const setOpen = setOpenControlled !== null && setOpenControlled !== void 0 ? setOpenControlled : setOpenUncontrolled;
|
|
37
39
|
const isHoveringReferenceRef = react_1.useRef(false);
|
|
38
40
|
const isHoveringPopoverRef = react_1.useRef(false);
|
|
39
41
|
const referenceTimoutRef = react_1.useRef(null);
|
|
40
42
|
const popoverTimoutRef = react_1.useRef(null);
|
|
41
43
|
react_1.useEffect(() => {
|
|
42
|
-
if (
|
|
43
|
-
|
|
44
|
+
if (isVisibleInitial) {
|
|
45
|
+
setOpen(true);
|
|
44
46
|
}
|
|
45
|
-
}, [
|
|
47
|
+
}, [isVisibleInitial, setOpen]);
|
|
46
48
|
react_1.useEffect(() => {
|
|
47
49
|
return () => {
|
|
48
50
|
if (referenceTimoutRef.current) {
|
|
@@ -55,15 +57,15 @@ const Tooltip = (props) => {
|
|
|
55
57
|
});
|
|
56
58
|
const close = () => {
|
|
57
59
|
if (!isHoveringPopoverRef.current) {
|
|
58
|
-
|
|
60
|
+
setOpen(false);
|
|
59
61
|
}
|
|
60
62
|
};
|
|
61
63
|
const handleMouseEnter = () => {
|
|
62
64
|
isHoveringReferenceRef.current = true;
|
|
63
|
-
if (!
|
|
65
|
+
if (!open) {
|
|
64
66
|
const referenceTimeout = setTimeout(() => {
|
|
65
67
|
if (isHoveringReferenceRef.current) {
|
|
66
|
-
|
|
68
|
+
setOpen(true);
|
|
67
69
|
}
|
|
68
70
|
}, delay);
|
|
69
71
|
referenceTimoutRef.current = referenceTimeout;
|
|
@@ -71,7 +73,7 @@ const Tooltip = (props) => {
|
|
|
71
73
|
};
|
|
72
74
|
const handleMouseLeave = () => {
|
|
73
75
|
isHoveringReferenceRef.current = false;
|
|
74
|
-
if (
|
|
76
|
+
if (open) {
|
|
75
77
|
const popoverTimeout = setTimeout(close, delay);
|
|
76
78
|
popoverTimoutRef.current = popoverTimeout;
|
|
77
79
|
}
|
|
@@ -83,17 +85,17 @@ const Tooltip = (props) => {
|
|
|
83
85
|
};
|
|
84
86
|
const handlePopoverMouseLeave = () => {
|
|
85
87
|
isHoveringPopoverRef.current = false;
|
|
86
|
-
if (
|
|
88
|
+
if (open) {
|
|
87
89
|
const popoverTimeout = setTimeout(close, delay);
|
|
88
90
|
popoverTimoutRef.current = popoverTimeout;
|
|
89
91
|
}
|
|
90
92
|
};
|
|
91
93
|
hooks_1.useKeyPress(types_1.KEY_CODE.ESC, () => {
|
|
92
|
-
if (
|
|
94
|
+
if (open && !isVisibleInitial) {
|
|
93
95
|
close();
|
|
94
96
|
}
|
|
95
97
|
});
|
|
96
|
-
const referenceElementWithMouseHandlers = !
|
|
98
|
+
const referenceElementWithMouseHandlers = !isVisibleInitial
|
|
97
99
|
? react_1.cloneElement(referenceElement, {
|
|
98
100
|
onMouseEnter: () => {
|
|
99
101
|
handleMouseEnter();
|
|
@@ -123,9 +125,9 @@ const Tooltip = (props) => {
|
|
|
123
125
|
})
|
|
124
126
|
: referenceElement;
|
|
125
127
|
const context = react_1.useMemo(() => ({
|
|
126
|
-
isOpen,
|
|
127
|
-
}), [
|
|
128
|
+
isOpen: open,
|
|
129
|
+
}), [open]);
|
|
128
130
|
return children ? (react_1.default.createElement(context_1.TooltipContext.Provider, { value: context },
|
|
129
|
-
react_1.default.createElement(Popover_1.Popover, Object.assign({ showArrow: !hideArrow, isVisible:
|
|
131
|
+
react_1.default.createElement(Popover_1.Popover, Object.assign({ showArrow: !hideArrow, isVisible: open, referenceElement: referenceElementWithMouseHandlers, placement: placement, className: classnames_1.default([bem_1.bem(cn), bem_1.bem(cn, { m: theme }), className]), onMouseEnter: !isVisibleInitial ? handlePopoverMouseEnter : undefined, onMouseLeave: !isVisibleInitial ? handlePopoverMouseLeave : undefined, style: style }, rest), children))) : (referenceElement);
|
|
130
132
|
};
|
|
131
133
|
exports.Tooltip = Tooltip;
|
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, {
|
|
2
|
+
useRef,
|
|
3
|
+
cloneElement,
|
|
4
|
+
useEffect,
|
|
5
|
+
useMemo,
|
|
6
|
+
useState,
|
|
7
|
+
} from "react";
|
|
2
8
|
import classnames from "classnames";
|
|
3
9
|
|
|
4
10
|
import { bem } from "../../utilities/bem";
|
|
5
|
-
import {
|
|
11
|
+
import { useKeyPress } from "../../hooks";
|
|
6
12
|
|
|
7
13
|
import { Popover, PopoverTooltipSharedProps } from "../Popover";
|
|
8
14
|
import { KEY_CODE } from "../../types";
|
|
@@ -21,13 +27,23 @@ export interface TooltipProps extends PopoverTooltipSharedProps {
|
|
|
21
27
|
* Controls the visibility of the reference pointer arrow
|
|
22
28
|
*/
|
|
23
29
|
hideArrow?: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Controlled state
|
|
32
|
+
*/
|
|
33
|
+
open?: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Controlled state
|
|
36
|
+
*/
|
|
37
|
+
setOpen?(open: boolean): void;
|
|
24
38
|
}
|
|
25
39
|
|
|
26
40
|
const cn = "Tooltip";
|
|
27
41
|
|
|
28
42
|
export const Tooltip = (props: TooltipProps) => {
|
|
29
43
|
const {
|
|
30
|
-
isVisible:
|
|
44
|
+
isVisible: isVisibleInitial = false,
|
|
45
|
+
open: isOpenControlled,
|
|
46
|
+
setOpen: setOpenControlled,
|
|
31
47
|
children,
|
|
32
48
|
referenceElement,
|
|
33
49
|
placement = "bottom",
|
|
@@ -39,17 +55,19 @@ export const Tooltip = (props: TooltipProps) => {
|
|
|
39
55
|
...rest
|
|
40
56
|
} = props;
|
|
41
57
|
|
|
42
|
-
const
|
|
58
|
+
const [isOpenUncontrolled, setOpenUncontrolled] = useState(isVisibleInitial);
|
|
59
|
+
const open = isOpenControlled ?? isOpenUncontrolled;
|
|
60
|
+
const setOpen = setOpenControlled ?? setOpenUncontrolled;
|
|
43
61
|
const isHoveringReferenceRef = useRef(false);
|
|
44
62
|
const isHoveringPopoverRef = useRef(false);
|
|
45
63
|
const referenceTimoutRef = useRef<null | NodeJS.Timeout>(null);
|
|
46
64
|
const popoverTimoutRef = useRef<null | NodeJS.Timeout>(null);
|
|
47
65
|
|
|
48
66
|
useEffect(() => {
|
|
49
|
-
if (
|
|
50
|
-
|
|
67
|
+
if (isVisibleInitial) {
|
|
68
|
+
setOpen(true);
|
|
51
69
|
}
|
|
52
|
-
}, [
|
|
70
|
+
}, [isVisibleInitial, setOpen]);
|
|
53
71
|
|
|
54
72
|
useEffect(() => {
|
|
55
73
|
return () => {
|
|
@@ -64,17 +82,17 @@ export const Tooltip = (props: TooltipProps) => {
|
|
|
64
82
|
|
|
65
83
|
const close = () => {
|
|
66
84
|
if (!isHoveringPopoverRef.current) {
|
|
67
|
-
|
|
85
|
+
setOpen(false);
|
|
68
86
|
}
|
|
69
87
|
};
|
|
70
88
|
|
|
71
89
|
const handleMouseEnter = () => {
|
|
72
90
|
isHoveringReferenceRef.current = true;
|
|
73
91
|
|
|
74
|
-
if (!
|
|
92
|
+
if (!open) {
|
|
75
93
|
const referenceTimeout = setTimeout(() => {
|
|
76
94
|
if (isHoveringReferenceRef.current) {
|
|
77
|
-
|
|
95
|
+
setOpen(true);
|
|
78
96
|
}
|
|
79
97
|
}, delay);
|
|
80
98
|
referenceTimoutRef.current = referenceTimeout;
|
|
@@ -84,7 +102,7 @@ export const Tooltip = (props: TooltipProps) => {
|
|
|
84
102
|
const handleMouseLeave = () => {
|
|
85
103
|
isHoveringReferenceRef.current = false;
|
|
86
104
|
|
|
87
|
-
if (
|
|
105
|
+
if (open) {
|
|
88
106
|
const popoverTimeout = setTimeout(close, delay);
|
|
89
107
|
popoverTimoutRef.current = popoverTimeout;
|
|
90
108
|
}
|
|
@@ -99,19 +117,19 @@ export const Tooltip = (props: TooltipProps) => {
|
|
|
99
117
|
const handlePopoverMouseLeave = () => {
|
|
100
118
|
isHoveringPopoverRef.current = false;
|
|
101
119
|
|
|
102
|
-
if (
|
|
120
|
+
if (open) {
|
|
103
121
|
const popoverTimeout = setTimeout(close, delay);
|
|
104
122
|
popoverTimoutRef.current = popoverTimeout;
|
|
105
123
|
}
|
|
106
124
|
};
|
|
107
125
|
|
|
108
126
|
useKeyPress(KEY_CODE.ESC, () => {
|
|
109
|
-
if (
|
|
127
|
+
if (open && !isVisibleInitial) {
|
|
110
128
|
close();
|
|
111
129
|
}
|
|
112
130
|
});
|
|
113
131
|
|
|
114
|
-
const referenceElementWithMouseHandlers = !
|
|
132
|
+
const referenceElementWithMouseHandlers = !isVisibleInitial
|
|
115
133
|
? cloneElement(referenceElement, {
|
|
116
134
|
onMouseEnter: () => {
|
|
117
135
|
handleMouseEnter();
|
|
@@ -143,21 +161,21 @@ export const Tooltip = (props: TooltipProps) => {
|
|
|
143
161
|
|
|
144
162
|
const context = useMemo(
|
|
145
163
|
() => ({
|
|
146
|
-
isOpen,
|
|
164
|
+
isOpen: open,
|
|
147
165
|
}),
|
|
148
|
-
[
|
|
166
|
+
[open],
|
|
149
167
|
);
|
|
150
168
|
|
|
151
169
|
return children ? (
|
|
152
170
|
<TooltipContext.Provider value={context}>
|
|
153
171
|
<Popover
|
|
154
172
|
showArrow={!hideArrow}
|
|
155
|
-
isVisible={
|
|
173
|
+
isVisible={open}
|
|
156
174
|
referenceElement={referenceElementWithMouseHandlers}
|
|
157
175
|
placement={placement}
|
|
158
176
|
className={classnames([bem(cn), bem(cn, { m: theme }), className])}
|
|
159
|
-
onMouseEnter={!
|
|
160
|
-
onMouseLeave={!
|
|
177
|
+
onMouseEnter={!isVisibleInitial ? handlePopoverMouseEnter : undefined}
|
|
178
|
+
onMouseLeave={!isVisibleInitial ? handlePopoverMouseLeave : undefined}
|
|
161
179
|
style={style}
|
|
162
180
|
{...rest}
|
|
163
181
|
>
|