Files
react-native/packages/rn-tester/NativeComponentExample/ios/RNTMyNativeViewComponentView.mm
Riccardo Cipolleschi 7de3111f9b Add Maestro test for New Arch Example (#46541)
Summary:
This change adds automated tests for the New Architecture Examples page in RNTester.
It also updates the NativeComponentExample to make sure that iOS and Android behaves in the same way and in a reliable way.

## Changelog:
[Internal] - Adds

Pull Request resolved: https://github.com/facebook/react-native/pull/46541

Test Plan:
* Android:

https://github.com/user-attachments/assets/65ead328-9c4f-4e0f-8b9b-992ffb584566

* iOS:

https://github.com/user-attachments/assets/412a4f68-c9c9-4ff2-a3e9-ae7194deef77

Reviewed By: cortinico

Differential Revision: D62879289

Pulled By: cipolleschi

fbshipit-source-id: 59e15f48f5995b18fd8b3ee24aca726b93e04d9f
2024-09-18 06:15:58 -07:00

139 lines
4.3 KiB
Plaintext

/*
* 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.
*/
#import "RNTMyNativeViewComponentView.h"
#import "UIView+ColorOverlays.h"
#import <react/renderer/components/AppSpecs/ComponentDescriptors.h>
#import <react/renderer/components/AppSpecs/EventEmitters.h>
#import <react/renderer/components/AppSpecs/Props.h>
#import <react/renderer/components/AppSpecs/RCTComponentViewHelpers.h>
#import "RCTFabricComponentsPlugins.h"
using namespace facebook::react;
@interface RNTMyNativeViewComponentView () <RCTRNTMyNativeViewViewProtocol>
@end
@implementation RNTMyNativeViewComponentView {
UIView *_view;
}
+ (ComponentDescriptorProvider)componentDescriptorProvider
{
return concreteComponentDescriptorProvider<RNTMyNativeViewComponentDescriptor>();
}
// Load is not invoked if it is not defined, therefore, we must ask to update this.
// See the Apple documentation: https://developer.apple.com/documentation/objectivec/nsobject/1418815-load?language=objc
// "[...] but only if the newly loaded class or category implements a method that can respond."
+ (void)load
{
[super load];
}
- (instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
static const auto defaultProps = std::make_shared<const RNTMyNativeViewProps>();
_props = defaultProps;
_view = [[UIView alloc] init];
self.contentView = _view;
}
return self;
}
- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
{
const auto &oldViewProps = *std::static_pointer_cast<const RNTMyNativeViewProps>(_props);
const auto &newViewProps = *std::static_pointer_cast<const RNTMyNativeViewProps>(props);
if (oldViewProps.values != newViewProps.values) {
if (_eventEmitter) {
std::vector<int> newVector = {};
std::vector<bool> newBoolVector = {};
std::vector<Float> newFloatVector = {};
std::vector<double> newDoubleVector = {};
std::vector<RNTMyNativeViewEventEmitter::OnIntArrayChangedYesNos> newYesNoVector = {};
std::vector<std::string> newStringVector = {};
std::vector<RNTMyNativeViewEventEmitter::OnIntArrayChangedLatLons> newLatLonVector = {};
std::vector<std::vector<int>> newIntVectorVector = {};
for (auto val : newViewProps.values) {
newVector.push_back(val * 2);
newBoolVector.push_back(val % 2 ? true : false);
newFloatVector.push_back(val * 3.14);
newDoubleVector.push_back(val / 3.14);
newYesNoVector.push_back(
val % 2 ? RNTMyNativeViewEventEmitter::OnIntArrayChangedYesNos::Yep
: RNTMyNativeViewEventEmitter::OnIntArrayChangedYesNos::Nope);
newStringVector.push_back(std::to_string(val));
newLatLonVector.push_back({-1.0 * val, 2.0 * val});
newIntVectorVector.push_back({val, val, val});
}
RNTMyNativeViewEventEmitter::OnIntArrayChanged value = {
newVector,
newBoolVector,
newFloatVector,
newDoubleVector,
newYesNoVector,
newStringVector,
newLatLonVector,
newIntVectorVector};
std::static_pointer_cast<const RNTMyNativeViewEventEmitter>(_eventEmitter)->onIntArrayChanged(value);
}
}
[super updateProps:props oldProps:oldProps];
}
- (void)onChange:(UIView *)sender
{
// No-op
// std::dynamic_pointer_cast<const ViewEventEmitter>(_eventEmitter)
// ->onChange(ViewEventEmitter::OnChange{.value = static_cast<bool>(sender.on)});
}
#pragma mark - Native Commands
- (void)handleCommand:(const NSString *)commandName args:(const NSArray *)args
{
RCTRNTMyNativeViewHandleCommand(self, commandName, args);
}
- (void)callNativeMethodToChangeBackgroundColor:(NSString *)colorString
{
[_view setBackgroundColorWithColorString:colorString];
}
- (void)callNativeMethodToAddOverlays:(const NSArray *)overlayColors
{
[_view addColorOverlays:overlayColors];
}
- (void)callNativeMethodToRemoveOverlays
{
[_view removeOverlays];
}
- (void)fireLagacyStyleEvent
{
RNTMyNativeViewEventEmitter::OnLegacyStyleEvent value = {"Legacy Style Event Fired."};
std::static_pointer_cast<const RNTMyNativeViewEventEmitter>(_eventEmitter)->onLegacyStyleEvent(value);
}
@end
Class<RCTComponentViewProtocol> RNTMyNativeViewCls(void)
{
return RNTMyNativeViewComponentView.class;
}