From f8158f8a03cddfaf5ddc201566a343d0b6f6dc8a Mon Sep 17 00:00:00 2001 From: Paige Sun Date: Mon, 14 Feb 2022 16:26:23 -0800 Subject: [PATCH] Replace DummyUIManager with BridgelessUIManager. Log errors for deprecated methods in Bridgeless. Summary: Changelog: [Internal] * Rename DummyUIManager to BridgelessUIManager * Cleanup `RCTVirtualText` & `RCTShimmeringView` since the native changes from T107747313 are already in production, so these two will components always return a viewConfig in prod. - `console.error` when deprecated Bridge UIManager method are being accessed. - Make sure new BridgelessUIManager.js has the same method definition as [NativeUIManager.js](https://www.internalfb.com/code/fbsource/[e80c98b816183dcdfde1e81de01ba99aa6e30ed2]/xplat/js/react-native-github/Libraries/ReactNative/NativeUIManager.js?lines=15) Reviewed By: RSNara Differential Revision: D34203081 fbshipit-source-id: 99aafc2372b118d0c8cc41f7376e136dabae9bd5 --- ...mmyUIManager.js => BridgelessUIManager.js} | 105 +++++++++++------- Libraries/ReactNative/UIManager.js | 2 +- .../components/GenerateViewConfigJs.js | 2 +- .../GenerateViewConfigJs-test.js.snap | 2 +- 4 files changed, 66 insertions(+), 45 deletions(-) rename Libraries/ReactNative/{DummyUIManager.js => BridgelessUIManager.js} (50%) diff --git a/Libraries/ReactNative/DummyUIManager.js b/Libraries/ReactNative/BridgelessUIManager.js similarity index 50% rename from Libraries/ReactNative/DummyUIManager.js rename to Libraries/ReactNative/BridgelessUIManager.js index 126fe9b1d9b..ed16799ff0b 100644 --- a/Libraries/ReactNative/DummyUIManager.js +++ b/Libraries/ReactNative/BridgelessUIManager.js @@ -13,43 +13,51 @@ import type {RootTag} from 'react-native/Libraries/Types/RootTagTypes'; import {unstable_hasComponent} from 'react-native/Libraries/NativeComponent/NativeComponentRegistryUnstable'; +const errorMessageForMethod = (methodName: string): string => + "[ReactNative Architecture][JS] '" + + methodName + + "' is not available in the new React Native architecture."; + module.exports = { getViewManagerConfig: (viewManagerName: string): mixed => { - console.warn( - 'getViewManagerConfig is unavailable in Bridgeless, use hasViewManagerConfig instead. viewManagerName: ' + + console.error( + errorMessageForMethod('getViewManagerConfig') + + 'Use hasViewManagerConfig instead. viewManagerName: ' + viewManagerName, ); - if ( - viewManagerName === 'RCTVirtualText' || - viewManagerName === 'RCTShimmeringView' - ) { - return {}; - } return null; }, hasViewManagerConfig: (viewManagerName: string): boolean => { - if (global.__nativeComponentRegistry__hasComponent) { - return unstable_hasComponent(viewManagerName); - } else { - return ( - viewManagerName === 'RCTVirtualText' || - viewManagerName === 'RCTShimmeringView' - ); - } + return unstable_hasComponent(viewManagerName); + }, + getConstants: (): Object => { + console.error(errorMessageForMethod('getConstants')); + return {}; + }, + getConstantsForViewManager: (viewManagerName: string): Object => { + console.error(errorMessageForMethod('getConstantsForViewManager')); + return {}; + }, + getDefaultEventTypes: (): Array => { + console.error(errorMessageForMethod('getDefaultEventTypes')); + return []; + }, + lazilyLoadView: (name: string): Object => { + console.error(errorMessageForMethod('lazilyLoadView')); + return {}; }, - getConstants: (): {...} => ({}), - getConstantsForViewManager: (viewManagerName: string) => {}, - getDefaultEventTypes: (): Array<$FlowFixMe> => [], - lazilyLoadView: (name: string) => {}, createView: ( reactTag: ?number, viewName: string, rootTag: RootTag, props: Object, - ) => {}, - updateView: (reactTag: number, viewName: string, props: Object) => {}, - focus: (reactTag: ?number) => {}, - blur: (reactTag: ?number) => {}, + ): void => console.error(errorMessageForMethod('createView')), + updateView: (reactTag: number, viewName: string, props: Object): void => + console.error(errorMessageForMethod('updateView')), + focus: (reactTag: ?number): void => + console.error(errorMessageForMethod('focus')), + blur: (reactTag: ?number): void => + console.error(errorMessageForMethod('blur')), findSubviewIn: ( reactTag: ?number, point: Array, @@ -60,12 +68,12 @@ module.exports = { width: number, height: number, ) => void, - ) => {}, + ): void => console.error(errorMessageForMethod('findSubviewIn')), dispatchViewManagerCommand: ( reactTag: ?number, commandID: number, commandArgs: ?Array, - ) => {}, + ): void => console.error(errorMessageForMethod('dispatchViewManagerCommand')), measure: ( reactTag: ?number, callback: ( @@ -76,16 +84,16 @@ module.exports = { pageX: number, pageY: number, ) => void, - ) => {}, + ): void => console.error(errorMessageForMethod('measure')), measureInWindow: ( reactTag: ?number, callback: (x: number, y: number, width: number, height: number) => void, - ) => {}, + ): void => console.error(errorMessageForMethod('measureInWindow')), viewIsDescendantOf: ( reactTag: ?number, ancestorReactTag: ?number, callback: (result: Array) => void, - ) => {}, + ): void => console.error(errorMessageForMethod('viewIsDescendantOf')), measureLayout: ( reactTag: ?number, ancestorReactTag: ?number, @@ -96,7 +104,7 @@ module.exports = { width: number, height: number, ) => void, - ) => {}, + ): void => console.error(errorMessageForMethod('measureLayout')), measureLayoutRelativeToParent: ( reactTag: ?number, errorCallback: (error: Object) => void, @@ -106,17 +114,24 @@ module.exports = { width: number, height: number, ) => void, - ) => {}, - setJSResponder: (reactTag: ?number, blockNativeResponder: boolean) => {}, - clearJSResponder: () => {}, + ): void => + console.error(errorMessageForMethod('measureLayoutRelativeToParent')), + setJSResponder: (reactTag: ?number, blockNativeResponder: boolean): void => + console.error(errorMessageForMethod('setJSResponder')), + clearJSResponder: (): void => + console.error(errorMessageForMethod('clearJSResponder')), configureNextLayoutAnimation: ( config: Object, callback: () => void, errorCallback: (error: Object) => void, - ) => {}, - removeSubviewsFromContainerWithID: (containerID: number) => {}, - replaceExistingNonRootView: (reactTag: ?number, newReactTag: ?number) => {}, - setChildren: (containerTag: ?number, reactTags: Array) => {}, + ): void => + console.error(errorMessageForMethod('configureNextLayoutAnimation')), + removeSubviewsFromContainerWithID: (containerID: number): void => + console.error(errorMessageForMethod('removeSubviewsFromContainerWithID')), + replaceExistingNonRootView: (reactTag: ?number, newReactTag: ?number): void => + console.error(errorMessageForMethod('replaceExistingNonRootView')), + setChildren: (containerTag: ?number, reactTags: Array): void => + console.error(errorMessageForMethod('setChildren')), manageChildren: ( containerTag: ?number, moveFromIndices: Array, @@ -124,16 +139,22 @@ module.exports = { addChildReactTags: Array, addAtIndices: Array, removeAtIndices: Array, - ) => {}, + ): void => console.error(errorMessageForMethod('manageChildren')), // Android only - setLayoutAnimationEnabledExperimental: (enabled: boolean) => {}, - sendAccessibilityEvent: (reactTag: ?number, eventType: number) => {}, + setLayoutAnimationEnabledExperimental: (enabled: boolean): void => { + console.error( + errorMessageForMethod('setLayoutAnimationEnabledExperimental'), + ); + }, + sendAccessibilityEvent: (reactTag: ?number, eventType: number): void => + console.error(errorMessageForMethod('sendAccessibilityEvent')), showPopupMenu: ( reactTag: ?number, items: Array, error: (error: Object) => void, success: (event: string, selected?: number) => void, - ) => {}, - dismissPopupMenu: () => {}, + ): void => console.error(errorMessageForMethod('showPopupMenu')), + dismissPopupMenu: (): void => + console.error(errorMessageForMethod('dismissPopupMenu')), }; diff --git a/Libraries/ReactNative/UIManager.js b/Libraries/ReactNative/UIManager.js index e0ec53c0611..fc9da190bef 100644 --- a/Libraries/ReactNative/UIManager.js +++ b/Libraries/ReactNative/UIManager.js @@ -33,7 +33,7 @@ export interface UIManagerJSInterface extends Spec { const UIManager: UIManagerJSInterface = global.RN$Bridgeless === true - ? require('./DummyUIManager') + ? require('./BridgelessUIManager') : require('./PaperUIManager'); module.exports = UIManager; diff --git a/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js b/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js index 3a4bda260c1..3c79fce530b 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js +++ b/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js @@ -141,7 +141,7 @@ const DeprecatedComponentNameCheckTemplate = ({ paperComponentNameDeprecated: string, }) => ` -if (global.__nativeComponentRegistry__hasComponent) { +if (global.RN$Bridgeless) { if (UIManager.hasViewManagerConfig('${componentName}')) { nativeComponentName = '${componentName}'; } else if (UIManager.hasViewManagerConfig('${paperComponentNameDeprecated}')) { diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap index 49f9a83c094..f83ef796e5f 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap @@ -1070,7 +1070,7 @@ const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/ const {UIManager} = require(\\"react-native\\") let nativeComponentName = 'NativeComponentName'; -if (global.__nativeComponentRegistry__hasComponent) { +if (global.RN$Bridgeless) { if (UIManager.hasViewManagerConfig('NativeComponentName')) { nativeComponentName = 'NativeComponentName'; } else if (UIManager.hasViewManagerConfig('DeprecatedNativeComponentName')) {