@@ -3,41 +3,38 @@ import React, {
3
3
PropsWithChildren ,
4
4
useCallback ,
5
5
useContext ,
6
- useId ,
7
6
useMemo ,
8
7
useState ,
9
8
} from 'react'
10
9
11
- import type {
12
- AnchorRef ,
13
- TooltipContextData ,
14
- TooltipContextDataWrapper ,
15
- } from './TooltipProviderTypes'
10
+ import type { AnchorRef , TooltipContextData } from './TooltipProviderTypes'
11
+
12
+ const DEFAULT_TOOLTIP_ID = 'DEFAULT_TOOLTIP_ID'
16
13
17
14
const defaultContextData : TooltipContextData = {
18
- anchorRefs : new Set ( ) ,
19
- activeAnchor : { current : null } ,
20
- attach : ( ) => {
21
- /* attach anchor element */
22
- } ,
23
- detach : ( ) => {
24
- /* detach anchor element */
25
- } ,
26
- setActiveAnchor : ( ) => {
27
- /* set active anchor */
28
- } ,
15
+ getTooltipData : ( ) => ( {
16
+ anchorRefs : new Set ( ) ,
17
+ activeAnchor : { current : null } ,
18
+ attach : ( ) => {
19
+ /* attach anchor element */
20
+ } ,
21
+ detach : ( ) => {
22
+ /* detach anchor element */
23
+ } ,
24
+ setActiveAnchor : ( ) => {
25
+ /* set active anchor */
26
+ } ,
27
+ } ) ,
29
28
}
30
29
31
- const defaultContextWrapper = Object . assign ( ( ) => defaultContextData , defaultContextData )
32
- const TooltipContext = createContext < TooltipContextDataWrapper > ( defaultContextWrapper )
30
+ const TooltipContext = createContext < TooltipContextData > ( defaultContextData )
33
31
34
32
const TooltipProvider : React . FC < PropsWithChildren > = ( { children } ) => {
35
- const defaultTooltipId = useId ( )
36
33
const [ anchorRefMap , setAnchorRefMap ] = useState < Record < string , Set < AnchorRef > > > ( {
37
- [ defaultTooltipId ] : new Set ( ) ,
34
+ [ DEFAULT_TOOLTIP_ID ] : new Set ( ) ,
38
35
} )
39
36
const [ activeAnchorMap , setActiveAnchorMap ] = useState < Record < string , AnchorRef > > ( {
40
- [ defaultTooltipId ] : { current : null } ,
37
+ [ DEFAULT_TOOLTIP_ID ] : { current : null } ,
41
38
} )
42
39
43
40
const attach = ( tooltipId : string , ...refs : AnchorRef [ ] ) => {
@@ -74,37 +71,27 @@ const TooltipProvider: React.FC<PropsWithChildren> = ({ children }) => {
74
71
}
75
72
76
73
const getTooltipData = useCallback (
77
- ( tooltipId ?: string ) => ( {
78
- anchorRefs : anchorRefMap [ tooltipId ?? defaultTooltipId ] ?? new Set ( ) ,
79
- activeAnchor : activeAnchorMap [ tooltipId ?? defaultTooltipId ] ?? { current : null } ,
80
- attach : ( ...refs : AnchorRef [ ] ) => attach ( tooltipId ?? defaultTooltipId , ...refs ) ,
81
- detach : ( ...refs : AnchorRef [ ] ) => detach ( tooltipId ?? defaultTooltipId , ...refs ) ,
82
- setActiveAnchor : ( ref : AnchorRef ) => setActiveAnchor ( tooltipId ?? defaultTooltipId , ref ) ,
74
+ ( tooltipId = DEFAULT_TOOLTIP_ID ) => ( {
75
+ anchorRefs : anchorRefMap [ tooltipId ] ?? new Set ( ) ,
76
+ activeAnchor : activeAnchorMap [ tooltipId ] ?? { current : null } ,
77
+ attach : ( ...refs : AnchorRef [ ] ) => attach ( tooltipId , ...refs ) ,
78
+ detach : ( ...refs : AnchorRef [ ] ) => detach ( tooltipId , ...refs ) ,
79
+ setActiveAnchor : ( ref : AnchorRef ) => setActiveAnchor ( tooltipId , ref ) ,
83
80
} ) ,
84
- [ defaultTooltipId , anchorRefMap , activeAnchorMap , attach , detach ] ,
81
+ [ anchorRefMap , activeAnchorMap , attach , detach ] ,
85
82
)
86
83
87
84
const context = useMemo ( ( ) => {
88
- const contextData : TooltipContextData = getTooltipData ( defaultTooltipId )
89
- const contextWrapper = Object . assign (
90
- ( tooltipId ?: string ) => getTooltipData ( tooltipId ) ,
91
- contextData ,
92
- )
93
- return contextWrapper
85
+ return {
86
+ getTooltipData,
87
+ }
94
88
} , [ getTooltipData ] )
95
89
96
90
return < TooltipContext . Provider value = { context } > { children } </ TooltipContext . Provider >
97
91
}
98
92
99
- /*
100
- // this will use the "global" tooltip (same as `useTooltip()()`)
101
- const { anchorRefs, attach, detach } = useTooltip()
102
-
103
- // this will use the tooltip with id `tooltip-id`
104
- const { anchorRefs, attach, detach } = useTooltip()('tooltip-id')
105
- */
106
- export function useTooltip ( ) {
107
- return useContext ( TooltipContext )
93
+ export function useTooltip ( tooltipId = DEFAULT_TOOLTIP_ID ) {
94
+ return useContext ( TooltipContext ) . getTooltipData ( tooltipId )
108
95
}
109
96
110
97
export default TooltipProvider
0 commit comments