Skip to content

Commit 08775e9

Browse files
committed
feat[wip]: add type of tooltip as prop
1 parent 4fb2db1 commit 08775e9

File tree

6 files changed

+46
-10
lines changed

6 files changed

+46
-10
lines changed

src/App.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,13 @@ function App() {
112112
<TooltipProvider>
113113
<WithProviderMultiple />
114114
</TooltipProvider>
115+
<div id="freeTooltipAnchor" className={styles.freeAnchor} />
116+
<Tooltip
117+
anchorId="freeTooltipAnchor"
118+
content="This is a free tooltip"
119+
type="free"
120+
events={['click']}
121+
/>
115122
</main>
116123
)
117124
}

src/components/Tooltip/Tooltip.tsx

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ const Tooltip = ({
2424
delayHide = 0,
2525
noArrow,
2626
style: externalStyles,
27+
type = 'fixed',
2728
// props handled by controller
2829
isHtmlContent = false,
2930
content,
@@ -100,14 +101,6 @@ const Tooltip = ({
100101
}
101102
}
102103

103-
const handleClickTooltipAnchor = () => {
104-
if (setIsOpen) {
105-
setIsOpen(!isOpen)
106-
} else if (isOpen === undefined) {
107-
setShow((currentValue) => !currentValue)
108-
}
109-
}
110-
111104
const handleMouseMove = (event?: MouseEvent) => {
112105
if (!event) {
113106
return
@@ -126,6 +119,7 @@ const Tooltip = ({
126119
}
127120
},
128121
} as Element
122+
129123
computeTooltipPosition({
130124
place,
131125
offset,
@@ -144,6 +138,18 @@ const Tooltip = ({
144138
})
145139
}
146140

141+
const handleClickTooltipAnchor = (event: MouseEvent) => {
142+
if (type === 'free') {
143+
handleMouseMove(event)
144+
}
145+
146+
if (setIsOpen) {
147+
setIsOpen(!isOpen)
148+
} else if (!setIsOpen && isOpen === undefined) {
149+
setShow((currentValue) => !currentValue)
150+
}
151+
}
152+
147153
// debounce handler to prevent call twice when
148154
// mouse enter and focus events being triggered toggether
149155
const debouncedHandleShowTooltip = debounce(handleShowTooltip, 50)
@@ -175,10 +181,16 @@ const Tooltip = ({
175181
enabledEvents.push(
176182
{ event: 'mouseenter', listener: debouncedHandleShowTooltip },
177183
{ event: 'mouseleave', listener: debouncedHandleHideTooltip },
178-
{ event: 'mousemove', listener: (e) => handleMouseMove(e as MouseEvent) },
179184
{ event: 'focus', listener: debouncedHandleShowTooltip },
180185
{ event: 'blur', listener: debouncedHandleHideTooltip },
181186
)
187+
188+
if (type === 'float') {
189+
enabledEvents.push({
190+
event: 'mousemove',
191+
listener: (event) => handleMouseMove(event as MouseEvent),
192+
})
193+
}
182194
}
183195

184196
enabledEvents.forEach(({ event, listener }) => {
@@ -197,6 +209,10 @@ const Tooltip = ({
197209
}, [anchorRefs, anchorId, events, delayHide, delayShow])
198210

199211
useEffect(() => {
212+
if (type === 'free') {
213+
return () => null
214+
}
215+
200216
let elementReference = activeAnchor.current
201217
if (anchorId) {
202218
// `anchorId` element takes precedence
@@ -227,7 +243,7 @@ const Tooltip = ({
227243
return () => {
228244
mounted = false
229245
}
230-
}, [show, isOpen, anchorId, activeAnchor, content, place, offset, positionStrategy])
246+
}, [show, isOpen, anchorId, activeAnchor, content, place, offset, positionStrategy, type])
231247

232248
useEffect(() => {
233249
return () => {

src/components/Tooltip/TooltipTypes.d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ export type EventsType = 'hover' | 'click'
1212

1313
export type PositionStrategy = 'absolute' | 'fixed'
1414

15+
export type Type = 'fixed' | 'float' | 'free'
16+
1517
export type DataAttribute =
1618
| 'place'
1719
| 'content'
@@ -39,6 +41,7 @@ export interface ITooltip {
3941
children?: ChildrenType
4042
events?: EventsType[]
4143
positionStrategy?: PositionStrategy
44+
type?: Type
4245
delayShow?: number
4346
delayHide?: number
4447
noArrow?: boolean

src/components/TooltipController/TooltipController.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ const TooltipController = ({
3030
delayHide = 0,
3131
noArrow,
3232
style,
33+
type,
3334
isOpen,
3435
setIsOpen,
3536
}: ITooltipController) => {
@@ -179,6 +180,7 @@ const TooltipController = ({
179180
delayHide: tooltipDelayHide,
180181
noArrow,
181182
style,
183+
type,
182184
isOpen,
183185
setIsOpen,
184186
}

src/components/TooltipController/TooltipControllerTypes.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type {
77
ChildrenType,
88
EventsType,
99
PositionStrategy,
10+
Type,
1011
} from 'components/Tooltip/TooltipTypes'
1112

1213
export interface ITooltipController {
@@ -27,6 +28,7 @@ export interface ITooltipController {
2728
delayHide?: number
2829
noArrow?: boolean
2930
style?: CSSProperties
31+
type?: Type
3032
isOpen?: boolean
3133
setIsOpen?: (value: boolean) => void
3234
}

src/styles.module.css

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,9 @@
33
width: 100%;
44
height: 100vh;
55
}
6+
7+
.freeAnchor {
8+
width: 500px;
9+
height: 500px;
10+
background-color: #d3d3d3;
11+
}

0 commit comments

Comments
 (0)