Skip to content

Commit d9573f9

Browse files
gabrieljablonskiGabriel Jablonski
authored andcommitted
feat: clickable prop
1 parent 110cac6 commit d9573f9

File tree

6 files changed

+43
-6
lines changed

6 files changed

+43
-6
lines changed

src/App.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ function WithProviderMinimal() {
1717
<button>Minimal 2</button>
1818
</TooltipWrapper>
1919
</p>
20-
<Tooltip />
20+
<Tooltip clickable>
21+
<button>button</button>
22+
</Tooltip>
2123
</section>
2224
)
2325
}
@@ -159,6 +161,7 @@ function App() {
159161
content={`This is an on click tooltip (x:${position.x},y:${position.y})`}
160162
events={['click']}
161163
position={position}
164+
positionStrategy="fixed"
162165
/>
163166
</div>
164167
</div>

src/components/Tooltip/Tooltip.tsx

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ const Tooltip = ({
2323
delayShow = 0,
2424
delayHide = 0,
2525
float = false,
26-
noArrow,
26+
noArrow = false,
27+
clickable = false,
2728
style: externalStyles,
2829
position,
2930
// props handled by controller
@@ -43,6 +44,7 @@ const Tooltip = ({
4344
const lastFloatPosition = useRef<IPosition | null>(null)
4445
const { anchorRefs, setActiveAnchor: setProviderActiveAnchor } = useTooltip()(id)
4546
const [activeAnchor, setActiveAnchor] = useState<React.RefObject<HTMLElement>>({ current: null })
47+
const hoveringTooltip = useRef(false)
4648

4749
const handleShow = (value: boolean) => {
4850
if (setIsOpen) {
@@ -62,14 +64,17 @@ const Tooltip = ({
6264
}, delayShow)
6365
}
6466

65-
const handleHideTooltipDelayed = () => {
67+
const handleHideTooltipDelayed = (delay = delayHide) => {
6668
if (tooltipHideDelayTimerRef.current) {
6769
clearTimeout(tooltipHideDelayTimerRef.current)
6870
}
6971

7072
tooltipHideDelayTimerRef.current = setTimeout(() => {
73+
if (hoveringTooltip.current) {
74+
return
75+
}
7176
handleShow(false)
72-
}, delayHide)
77+
}, delay)
7378
}
7479

7580
const handleShowTooltip = (event?: Event) => {
@@ -93,7 +98,10 @@ const Tooltip = ({
9398
}
9499

95100
const handleHideTooltip = () => {
96-
if (delayHide) {
101+
if (clickable) {
102+
// allow time for the mouse to reach the tooltip, in case there's a gap
103+
handleHideTooltipDelayed(delayHide || 50)
104+
} else if (delayHide) {
97105
handleHideTooltipDelayed()
98106
} else {
99107
handleShow(false)
@@ -207,6 +215,19 @@ const Tooltip = ({
207215
}
208216
}
209217

218+
const handleMouseEnterTooltip = () => {
219+
hoveringTooltip.current = true
220+
}
221+
const handleMouseLeaveTooltip = () => {
222+
hoveringTooltip.current = false
223+
handleHideTooltip()
224+
}
225+
226+
if (clickable) {
227+
tooltipRef.current?.addEventListener('mouseenter', handleMouseEnterTooltip)
228+
tooltipRef.current?.addEventListener('mouseleave', handleMouseLeaveTooltip)
229+
}
230+
210231
enabledEvents.forEach(({ event, listener }) => {
211232
elementRefs.forEach((ref) => {
212233
ref.current?.addEventListener(event, listener)
@@ -215,6 +236,10 @@ const Tooltip = ({
215236

216237
return () => {
217238
window.removeEventListener('click', handleClickOutsideAnchor)
239+
if (clickable) {
240+
tooltipRef.current?.removeEventListener('mouseenter', handleMouseEnterTooltip)
241+
tooltipRef.current?.removeEventListener('mouseleave', handleMouseLeaveTooltip)
242+
}
218243
enabledEvents.forEach(({ event, listener }) => {
219244
elementRefs.forEach((ref) => {
220245
ref.current?.removeEventListener(event, listener)
@@ -297,6 +322,7 @@ const Tooltip = ({
297322
className={classNames('react-tooltip', styles['tooltip'], styles[variant], className, {
298323
[styles['show']]: hasContentOrChildren && !calculatingPosition && (isOpen || show),
299324
[styles['fixed']]: positionStrategy === 'fixed',
325+
[styles['clickable']]: clickable,
300326
})}
301327
style={{ ...externalStyles, ...inlineStyles }}
302328
ref={tooltipRef}

src/components/Tooltip/TooltipTypes.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export interface ITooltip {
4949
delayHide?: number
5050
float?: boolean
5151
noArrow?: boolean
52+
clickable?: boolean
5253
style?: CSSProperties
5354
position?: IPosition
5455
isOpen?: boolean

src/components/Tooltip/styles.module.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@
2929
display: none;
3030
}
3131

32+
.clickable {
33+
pointer-events: auto;
34+
}
35+
3236
.show {
3337
visibility: visible;
3438
opacity: var(--rt-opacity);

src/components/TooltipController/TooltipController.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ const TooltipController = ({
2929
delayShow = 0,
3030
delayHide = 0,
3131
float = false,
32-
noArrow,
32+
noArrow = false,
33+
clickable = false,
3334
style,
3435
position,
3536
isOpen,
@@ -184,6 +185,7 @@ const TooltipController = ({
184185
delayHide: tooltipDelayHide,
185186
float: tooltipFloat,
186187
noArrow,
188+
clickable,
187189
style,
188190
position,
189191
isOpen,

src/components/TooltipController/TooltipControllerTypes.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export interface ITooltipController {
2828
delayHide?: number
2929
float?: boolean
3030
noArrow?: boolean
31+
clickable?: boolean
3132
style?: CSSProperties
3233
position?: IPosition
3334
isOpen?: boolean

0 commit comments

Comments
 (0)