Files
react-native/packages/rn-tester/NativeComponentExample/js/MyLegacyViewNativeComponent.js
Dmitry Rykun d66d6518d8 RNTester - Legacy component example: do not convert commands to string (#42822)
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/42822

The conversion to string was introduced in D45043929. It was supposed to fix command execution for `MyLegacyNativeComponent` in RNTester on Android/Old Architecture.

At the same time it introduced a regression on iOS, since we have [different code path](https://www.internalfb.com/code/fbsource/[ffee789cab9514c0a15b8a63869cbfdf4e534a56]/xplat/js/react-native-github/packages/react-native/React/Modules/RCTUIManager.m?lines=1088-1092) for string commands in iOS, where we expect command name, and not command number converted to string.

I tried to remove that conversion, did local tests, and saw no issues with executing commands on Android.
Looks like the underlying issue has been fixed in some other way.

So let's just remove those conversions.

Changelog: [Internal]

Reviewed By: cortinico

Differential Revision: D53123956

fbshipit-source-id: 968e35277e01215bd6fc1282c78f04666453317d
2024-02-05 04:01:14 -08:00

105 lines
2.5 KiB
JavaScript

/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
import type {HostComponent} from 'react-native';
import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes';
import ReactNative from '../../../react-native/Libraries/Renderer/shims/ReactNative';
import * as React from 'react';
import {UIManager, requireNativeComponent} from 'react-native';
type ColorChangedEvent = {
nativeEvent: {
backgroundColor: {
hue: number,
saturation: number,
brightness: number,
alpha: number,
},
},
};
type NativeProps = $ReadOnly<{|
...ViewProps,
opacity?: number,
color?: string,
onColorChanged?: (event: ColorChangedEvent) => void,
|}>;
export type MyLegacyViewType = HostComponent<NativeProps>;
export function callNativeMethodToChangeBackgroundColor(
viewRef: React.ElementRef<MyLegacyViewType> | null,
color: string,
) {
if (!viewRef) {
console.log('viewRef is null');
return;
}
const reactTag = ReactNative.findNodeHandle(viewRef);
if (reactTag == null) {
console.log('reactTag is null');
return;
}
UIManager.dispatchViewManagerCommand(
reactTag,
UIManager.getViewManagerConfig('RNTMyLegacyNativeView').Commands
.changeBackgroundColor,
[color],
);
}
export function callNativeMethodToAddOverlays(
viewRef: React.ElementRef<MyLegacyViewType> | null,
overlayColors: $ReadOnlyArray<string>,
) {
if (!viewRef) {
console.log('viewRef is null');
return;
}
const reactTag = ReactNative.findNodeHandle(viewRef);
if (reactTag == null) {
console.log('reactTag is null');
return;
}
UIManager.dispatchViewManagerCommand(
reactTag,
UIManager.getViewManagerConfig('RNTMyLegacyNativeView').Commands
.addOverlays,
[overlayColors],
);
}
export function callNativeMethodToRemoveOverlays(
viewRef: React.ElementRef<MyLegacyViewType> | null,
) {
if (!viewRef) {
console.log('viewRef is null');
return;
}
const reactTag = ReactNative.findNodeHandle(viewRef);
if (reactTag == null) {
console.log('reactTag is null');
return;
}
UIManager.dispatchViewManagerCommand(
reactTag,
UIManager.getViewManagerConfig('RNTMyLegacyNativeView').Commands
.removeOverlays,
[],
);
}
export default (requireNativeComponent(
'RNTMyLegacyNativeView',
): HostComponent<NativeProps>);