Skip to content

Commit bf1dc6a

Browse files
authored
refactor: use props check instead of version check (#593)
* refactor: use props check instead of version check * chore: update peer * chore: clean up * chore: update build
1 parent 7aaa1d8 commit bf1dc6a

File tree

5 files changed

+50
-28
lines changed

5 files changed

+50
-28
lines changed

now.json

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

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@
6767
"rc-test": "^7.0.14",
6868
"react": "^18.0.0",
6969
"react-dom": "^18.0.0",
70+
"react-19": "npm:[email protected]",
71+
"react-dom-19": "npm:[email protected]",
7072
"typescript": "^5.3.2"
7173
},
7274
"peerDependencies": {

src/ref.ts

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -81,19 +81,13 @@ export const supportNodeRef = <T = any>(
8181
*/
8282
export const getNodeRef: <T = any>(
8383
node: React.ReactNode,
84-
) => React.Ref<T> | null =
85-
Number(version.split('.')[0]) >= 19
86-
? // >= React 19
87-
node => {
88-
if (isReactElement(node)) {
89-
return (node as any).props.ref;
90-
}
91-
return null;
92-
}
93-
: // < React 19
94-
node => {
95-
if (isReactElement(node)) {
96-
return (node as any).ref;
97-
}
98-
return null;
99-
};
84+
) => React.Ref<T> | null = node => {
85+
if (node && isReactElement(node)) {
86+
const ele = node as any;
87+
88+
// Source from:
89+
// https://github.com/mui/material-ui/blob/master/packages/mui-utils/src/getReactNodeRef/getReactNodeRef.ts
90+
return ele.props.propertyIsEnumerable('ref') ? ele.props.ref : ele.ref;
91+
}
92+
return null;
93+
};

tests/ref-19.test.tsx

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/* eslint-disable no-eval */
2+
import React from 'react';
3+
import { getNodeRef } from '../src/ref';
4+
5+
jest.mock('react', () => {
6+
const react19 = jest.requireActual('react-19');
7+
return react19;
8+
});
9+
10+
jest.mock('react-dom', () => {
11+
const reactDom19 = jest.requireActual('react-dom-19');
12+
return reactDom19;
13+
});
14+
15+
describe('ref: React 19', () => {
16+
const errSpy = jest.spyOn(console, 'error');
17+
18+
beforeEach(() => {
19+
errSpy.mockReset();
20+
});
21+
22+
it('getNodeRef', () => {
23+
const ref = React.createRef<HTMLDivElement>();
24+
const node = <div ref={ref} />;
25+
26+
expect(getNodeRef(node)).toBe(ref);
27+
28+
expect(errSpy).not.toHaveBeenCalled();
29+
});
30+
});

tests/ref.test.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ import {
1212
} from '../src/ref';
1313

1414
describe('ref', () => {
15+
const errSpy = jest.spyOn(console, 'error');
16+
17+
beforeEach(() => {
18+
errSpy.mockReset();
19+
});
20+
1521
describe('composeRef', () => {
1622
it('basic', () => {
1723
const refFunc1 = jest.fn();
@@ -207,5 +213,7 @@ describe('ref', () => {
207213
const node = <div ref={ref} />;
208214

209215
expect(getNodeRef(node)).toBe(ref);
216+
217+
expect(errSpy).not.toHaveBeenCalled();
210218
});
211219
});

0 commit comments

Comments
 (0)