12
13
let React;
14
let ReactFabric;
15
+let ReactNativePrivateInterface;
16
let createReactNativeComponentClass;
17
let StrictMode;
18
let act;
18
-let getNativeTagFromPublicInstance;
19
-let getNodeFromPublicInstance;
19
20
const DISPATCH_COMMAND_REQUIRES_HOST_COMPONENT =
21
"Warning: dispatchCommand was called with a ref that isn't a " +
38
React = require('react');
39
StrictMode = React.StrictMode;
40
ReactFabric = require('react-native-renderer/fabric');
41
+ ReactNativePrivateInterface = require('react-native/Libraries/ReactPrivate/ReactNativePrivateInterface');
42
createReactNativeComponentClass =
43
require('react-native/Libraries/ReactPrivate/ReactNativePrivateInterface')
44
.ReactNativeViewConfigRegistry.register;
45
- getNativeTagFromPublicInstance =
46
- require('react-native/Libraries/ReactPrivate/ReactNativePrivateInterface').getNativeTagFromPublicInstance;
47
- getNodeFromPublicInstance =
48
- require('react-native/Libraries/ReactPrivate/ReactNativePrivateInterface').getNodeFromPublicInstance;
49
-
45
act = require('internal-test-utils').act;
46
});
47
932
'\n in RCTView (at **)' +
933
'\n in ContainsStrictModeChild (at **)',
934
]);
940
- expect(match).toBe(getNativeTagFromPublicInstance(child));
935
+ expect(match).toBe(
936
+ ReactNativePrivateInterface.getNativeTagFromPublicInstance(child),
937
+ );
938
});
939
940
it('findNodeHandle should warn if passed a component that is inside StrictMode', async () => {
971
'\n in RCTView (at **)' +
972
'\n in IsInStrictMode (at **)',
973
]);
977
- expect(match).toBe(getNativeTagFromPublicInstance(child));
974
+ expect(match).toBe(
975
+ ReactNativePrivateInterface.getNativeTagFromPublicInstance(child),
976
+ );
977
});
978
979
it('should no-op if calling sendAccessibilityEvent on unmounted refs', async () => {
1014
uiViewClassName: 'RCTView',
1015
}));
1016
1017
+ await act(() => {
1018
+ ReactFabric.render(<View foo="test" />, 1);
1019
+ });
1020
+
1021
+ const internalInstanceHandle =
1022
+ nativeFabricUIManager.createNode.mock.calls[0][4];
1023
+ expect(internalInstanceHandle).toEqual(expect.any(Object));
1024
+
1025
+ const expectedShadowNode =
1026
+ nativeFabricUIManager.createNode.mock.results[0].value;
1027
+ expect(expectedShadowNode).toEqual(expect.any(Object));
1028
+
1029
+ const node = ReactFabric.getNodeFromInternalInstanceHandle(
1030
+ internalInstanceHandle,
1031
+ );
1032
+ expect(node).toBe(expectedShadowNode);
1033
+ });
1034
+
1035
+ it('getPublicInstanceFromInternalInstanceHandle should provide public instances for HostComponent', async () => {
1036
+ const View = createReactNativeComponentClass('RCTView', () => ({
1037
+ validAttributes: {foo: true},
1038
+ uiViewClassName: 'RCTView',
1039
+ }));
1040
+
1041
let viewRef;
1042
await act(() => {
1043
ReactFabric.render(
1051
);
1052
});
1053
1031
- const expectedShadowNode =
1032
- nativeFabricUIManager.createNode.mock.results[0].value;
1033
- expect(expectedShadowNode).toEqual(expect.any(Object));
1054
+ const internalInstanceHandle =
1055
+ nativeFabricUIManager.createNode.mock.calls[0][4];
1056
+ expect(internalInstanceHandle).toEqual(expect.any(Object));
1057
1035
- const node = getNodeFromPublicInstance(viewRef);
1036
- expect(node).toBe(expectedShadowNode);
1058
+ const publicInstance =
1059
+ ReactFabric.getPublicInstanceFromInternalInstanceHandle(
1060
+ internalInstanceHandle,
1061
+ );
1062
+ expect(publicInstance).toBe(viewRef);
1063
+ });
1064
+
1065
+ it('getPublicInstanceFromInternalInstanceHandle should provide public instances for HostText', async () => {
1066
+ jest.spyOn(ReactNativePrivateInterface, 'createPublicTextInstance');
1067
+
1068
+ const RCTText = createReactNativeComponentClass('RCTText', () => ({
1069
+ validAttributes: {},
1070
+ uiViewClassName: 'RCTText',
1071
+ }));
1072
+
1073
+ await act(() => {
1074
+ ReactFabric.render(<RCTText>Text content</RCTText>, 1);
1075
+ });
1076
+
1077
+ // Access the internal instance handle used to create the text node.
1078
+ const internalInstanceHandle =
1079
+ nativeFabricUIManager.createNode.mock.calls[0][4];
1080
+ expect(internalInstanceHandle).toEqual(expect.any(Object));
1081
+
1082
+ // Text public instances should be created lazily.
1083
+ expect(
1084
+ ReactNativePrivateInterface.createPublicTextInstance,
1085
+ ).not.toHaveBeenCalled();
1086
+
1087
+ const publicInstance =
1088
+ ReactFabric.getPublicInstanceFromInternalInstanceHandle(
1089
+ internalInstanceHandle,
1090
+ );
1091
+
1092
+ // We just requested the text public instance, so it should have been created at this point.
1093
+ expect(
1094
+ ReactNativePrivateInterface.createPublicTextInstance,
1095
+ ).toHaveBeenCalledTimes(1);
1096
+ expect(
1097
+ ReactNativePrivateInterface.createPublicTextInstance,
1098
+ ).toHaveBeenCalledWith(internalInstanceHandle);
1099
+
1100
+ const expectedPublicInstance =
1101
+ ReactNativePrivateInterface.createPublicTextInstance.mock.results[0]
1102
+ .value;
1103
+ expect(publicInstance).toBe(expectedPublicInstance);
1104
});
1105
});