Skip to content

Commit 0e2b986

Browse files
committed
Added switchable overlay trigger events
1 parent 7ccfa0c commit 0e2b986

File tree

5 files changed

+56
-21
lines changed

5 files changed

+56
-21
lines changed

src/components/Overlay/OverlayTrigger.tsx

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
33
import { useRef, useState } from 'react';
44
import Overlay from '@/components/Overlay/index';
55
import { Placement, PositioningStrategy } from '@popperjs/core';
6+
import { Trigger, triggerPropTypes } from '@/components/Overlay/Trigger';
67

78
interface OverlayTriggerProps {
89
arrow?: boolean;
@@ -11,6 +12,7 @@ interface OverlayTriggerProps {
1112
placement?: Placement;
1213
positionStrategy?: PositioningStrategy;
1314
className?: string;
15+
trigger?: Trigger | string;
1416
}
1517

1618
const OverlayTrigger = ({
@@ -19,29 +21,50 @@ const OverlayTrigger = ({
1921
className,
2022
overlay,
2123
placement,
22-
positionStrategy
24+
positionStrategy,
25+
trigger = 'hover'
2326
}: OverlayTriggerProps): React.ReactElement => {
2427
const [shown, setShown] = useState<boolean>(false);
2528
const triggerRef = useRef<HTMLElement>();
2629

27-
return (
28-
<>
29-
{React.cloneElement(triggerElement, {
30-
ref: triggerRef,
31-
onMouseEnter: (event: React.MouseEvent): void => {
32-
if (triggerElement.props.onMouseEnter) {
33-
triggerElement.props.onMouseEnter(event)
34-
}
30+
const attachEvents = (child: React.ReactElement, trigger: string) => {
31+
switch (trigger) {
32+
case Trigger.CLICK:
33+
return {
34+
onClick: (event: React.MouseEvent) => {
35+
if (child.props.onClick) {
36+
child.props.onClick(event);
37+
}
3538

36-
setShown(true);
37-
},
38-
onMouseLeave: (event: React.MouseEvent) => {
39-
if (triggerElement.props.onHover) {
40-
triggerElement.props.onMouseLeave(event)
39+
setShown(!shown);
4140
}
41+
}
42+
case Trigger.HOVER:
43+
default:
44+
return {
45+
onMouseEnter: (event: React.MouseEvent): void => {
46+
if (child.props.onMouseEnter) {
47+
child.props.onMouseEnter(event);
48+
}
49+
50+
setShown(true)
51+
},
52+
onMouseLeave: (event: React.MouseEvent) => {
53+
if (child.props.onMouseLeave) {
54+
child.props.onMouseLeave(event);
55+
}
4256

43-
setShown(false);
57+
setShown(false)
58+
}
4459
}
60+
}
61+
}
62+
63+
return (
64+
<>
65+
{React.cloneElement(triggerElement, {
66+
ref: triggerRef,
67+
...attachEvents(triggerElement, trigger)
4568
})}
4669
{shown && (
4770
<Overlay
@@ -63,7 +86,8 @@ OverlayTrigger.propTypes = {
6386
children: PropTypes.node.isRequired,
6487
className: PropTypes.string,
6588
overlay: PropTypes.element.isRequired,
66-
placement: PropTypes.string
89+
placement: PropTypes.string,
90+
trigger: triggerPropTypes
6791
}
6892

6993
export default OverlayTrigger;

src/components/Overlay/Placement.ts

Lines changed: 0 additions & 3 deletions
This file was deleted.

src/components/Overlay/Trigger.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import Proptypes from 'prop-types';
2+
3+
export enum Trigger {
4+
CLICK = 'click',
5+
HOVER = 'hover'
6+
}
7+
8+
export const triggerPropTypes = Proptypes.oneOf(['click', 'hover'])

src/components/Tooltip/index.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,25 @@ import * as React from 'react';
22
import PropTypes from 'prop-types';
33
import OverlayTrigger from '@/components/Overlay/OverlayTrigger';
44
import { Placement } from '@popperjs/core';
5+
import { Trigger, triggerPropTypes } from '@/components/Overlay/Trigger';
56

67
interface TooltipProps {
78
arrow?: boolean;
89
children: React.ReactElement;
910
placement?: Placement;
1011
content: React.ReactNode;
12+
trigger?: Trigger | string;
1113
}
1214

1315
const Tooltip = ({
1416
arrow,
1517
children,
1618
content,
17-
placement
19+
placement,
20+
trigger = 'hover'
1821
}: TooltipProps): React.ReactElement => (
1922
<OverlayTrigger
23+
trigger={trigger}
2024
arrow={arrow}
2125
overlay={content}
2226
placement={placement}
@@ -30,7 +34,8 @@ Tooltip.displayName = 'Tooltip';
3034
Tooltip.propTypes = {
3135
children: PropTypes.element,
3236
placement: PropTypes.string,
33-
content: PropTypes.node
37+
content: PropTypes.node,
38+
trigger: triggerPropTypes
3439
}
3540

3641
export default Tooltip;

www/src/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ ReactDom.render(
122122
<Tooltip
123123
content="Megalange tekst"
124124
placement="top"
125+
trigger="click"
125126
>
126127
<Button
127128
variant={Variant.ORANGE}

0 commit comments

Comments
 (0)