Skip to content

Commit a5f3cdd

Browse files
committed
fix: react19 support
1 parent 8fdd2ff commit a5f3cdd

File tree

2 files changed

+23
-20
lines changed

2 files changed

+23
-20
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/index.tsx

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -33,22 +33,21 @@ const eventTypeMapping = {
3333
touchend: 'onTouchEnd'
3434
};
3535

36-
const reactMajorVersion = parseInt(React.version.split('.')[0], 10);
37-
console.log({ reactMajorVersion });
38-
39-
function useForkRef<T = any>(
40-
...refs: Array<Ref<T> | undefined>
41-
): RefCallback<T> {
42-
return (node: T) => {
36+
const mergeRefs = <T extends any>(
37+
refs: Array<Ref<T> | undefined | null>
38+
): RefCallback<T> => {
39+
return (value) => {
4340
refs.forEach((ref) => {
4441
if (typeof ref === 'function') {
45-
ref(node);
46-
} else if (ref != null && typeof ref === 'object') {
47-
(ref as MutableRefObject<T | null>).current = node;
42+
ref(value);
43+
} else if (ref != null) {
44+
(ref as MutableRefObject<T | null>).current = value;
4845
}
4946
});
5047
};
51-
}
48+
};
49+
50+
const reactMajorVersion = parseInt(React.version.split('.')[0], 10);
5251

5352
const ClickAwayListener: FunctionComponent<Props> = ({
5453
children,
@@ -87,13 +86,17 @@ const ClickAwayListener: FunctionComponent<Props> = ({
8786
}
8887
};
8988

90-
const combinedRef = useForkRef((ref) => {
91-
node.current = ref;
92-
}, (children as any).ref);
89+
let childRef: React.Ref<any> | null = null;
9390

94-
const handleReact19ChildRef = (instance: HTMLElement | null) => {
95-
node.current = instance;
96-
};
91+
// For React 19+, we get the ref via props.ref
92+
if (reactMajorVersion >= 19) {
93+
childRef = children.props?.ref || null;
94+
} else if ('ref' in children) {
95+
childRef = (children as any).ref;
96+
}
97+
98+
// Create a combined ref handler
99+
const combinedRef = mergeRefs([node, childRef]);
97100

98101
useEffect(() => {
99102
const nodeDocument = node.current?.ownerDocument ?? document;
@@ -129,7 +132,7 @@ const ClickAwayListener: FunctionComponent<Props> = ({
129132

130133
return React.Children.only(
131134
cloneElement(children as ReactElement<any>, {
132-
ref: reactMajorVersion >= 19 ? handleReact19ChildRef : combinedRef,
135+
ref: combinedRef,
133136
[mappedFocusEvent]: handleBubbledEvents(mappedFocusEvent),
134137
[mappedMouseEvent]: handleBubbledEvents(mappedMouseEvent),
135138
[mappedTouchEvent]: handleBubbledEvents(mappedTouchEvent)

0 commit comments

Comments
 (0)