Skip to content

Commit b41dd46

Browse files
alburkerkgabrieljablonski
authored andcommitted
feat: enable middleware configuration
1 parent 81be1c2 commit b41dd46

File tree

6 files changed

+18
-2
lines changed

6 files changed

+18
-2
lines changed

src/components/Tooltip/Tooltip.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const Tooltip = ({
1818
offset = 10,
1919
events = ['hover'],
2020
positionStrategy = 'absolute',
21+
middlewares,
2122
wrapper: WrapperElement = 'div',
2223
children = null,
2324
delayShow = 0,
@@ -150,6 +151,7 @@ const Tooltip = ({
150151
tooltipReference: tooltipRef.current,
151152
tooltipArrowReference: tooltipArrowRef.current,
152153
strategy: positionStrategy,
154+
middlewares,
153155
}).then((computedStylesData) => {
154156
setCalculatingPosition(false)
155157
if (Object.keys(computedStylesData.tooltipStyles).length) {
@@ -299,6 +301,7 @@ const Tooltip = ({
299301
tooltipReference: tooltipRef.current,
300302
tooltipArrowReference: tooltipArrowRef.current,
301303
strategy: positionStrategy,
304+
middlewares,
302305
}).then((computedStylesData) => {
303306
if (!mounted) {
304307
// invalidate computed positions after remount

src/components/Tooltip/TooltipTypes.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { ElementType, ReactNode, CSSProperties } from 'react'
2+
import type { Middleware } from '@floating-ui/dom'
23

34
export type PlacesType = 'top' | 'right' | 'bottom' | 'left'
45

@@ -12,6 +13,8 @@ export type EventsType = 'hover' | 'click'
1213

1314
export type PositionStrategy = 'absolute' | 'fixed'
1415

16+
export type Middleware = Middleware
17+
1518
export type DataAttribute =
1619
| 'place'
1720
| 'content'
@@ -44,6 +47,7 @@ export interface ITooltip {
4447
children?: ChildrenType
4548
events?: EventsType[]
4649
positionStrategy?: PositionStrategy
50+
middlewares?: Middleware[]
4751
delayShow?: number
4852
delayHide?: number
4953
float?: boolean

src/components/TooltipController/TooltipController.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ const TooltipController = ({
2626
children = null,
2727
events = ['hover'],
2828
positionStrategy = 'absolute',
29+
middlewares,
2930
delayShow = 0,
3031
delayHide = 0,
3132
float = false,
@@ -180,6 +181,7 @@ const TooltipController = ({
180181
wrapper: tooltipWrapper,
181182
events: tooltipEvents,
182183
positionStrategy: tooltipPositionStrategy,
184+
middlewares,
183185
delayShow: tooltipDelayShow,
184186
delayHide: tooltipDelayHide,
185187
float: tooltipFloat,

src/components/TooltipController/TooltipControllerTypes.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import type {
88
EventsType,
99
PositionStrategy,
1010
IPosition,
11+
Middleware,
1112
} from 'components/Tooltip/TooltipTypes'
1213

1314
export interface ITooltipController {
@@ -24,6 +25,7 @@ export interface ITooltipController {
2425
children?: ChildrenType
2526
events?: EventsType[]
2627
positionStrategy?: PositionStrategy
28+
middlewares?: Middleware[]
2729
delayShow?: number
2830
delayHide?: number
2931
float?: boolean
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
import type { Middleware } from '../components/Tooltip/TooltipTypes'
2+
13
export interface IComputePositions {
24
elementReference?: Element | HTMLElement | null
35
tooltipReference?: Element | HTMLElement | null
46
tooltipArrowReference?: Element | HTMLElement | null
57
place?: 'top' | 'right' | 'bottom' | 'left'
68
offset?: number
79
strategy?: 'absolute' | 'fixed'
10+
middlewares?: Middleware[]
811
}

src/utils/compute-positions.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { computePosition, offset, flip, shift, arrow } from '@floating-ui/dom'
1+
import { computePosition, offset, shift, arrow, flip } from '@floating-ui/dom'
22
import type { IComputePositions } from './compute-positions-types'
33

44
export const computeTooltipPosition = async ({
@@ -8,6 +8,7 @@ export const computeTooltipPosition = async ({
88
place = 'top',
99
offset: offsetValue = 10,
1010
strategy = 'absolute',
11+
middlewares = [offset(Number(offsetValue)), flip(), shift({ padding: 5 })],
1112
}: IComputePositions) => {
1213
if (!elementReference) {
1314
// elementReference can be null or undefined and we will not compute the position
@@ -20,10 +21,11 @@ export const computeTooltipPosition = async ({
2021
return { tooltipStyles: {}, tooltipArrowStyles: {} }
2122
}
2223

23-
const middleware = [offset(Number(offsetValue)), flip(), shift({ padding: 5 })]
24+
const middleware = middlewares
2425

2526
if (tooltipArrowReference) {
2627
middleware.push(arrow({ element: tooltipArrowReference as HTMLElement, padding: 5 }))
28+
2729
return computePosition(elementReference as HTMLElement, tooltipReference as HTMLElement, {
2830
placement: place,
2931
strategy,

0 commit comments

Comments
 (0)