/* * 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 #import #import #import #import "RCTFabricComponentsPlugins.h" using namespace facebook::react; @interface RNTMyNativeViewComponentView () @end @implementation RNTMyNativeViewComponentView { UIView *_view; } + (ComponentDescriptorProvider)componentDescriptorProvider { return concreteComponentDescriptorProvider(); } // 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(); _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(_props); const auto &newViewProps = *std::static_pointer_cast(props); if (oldViewProps.values != newViewProps.values) { if (_eventEmitter) { std::vector newVector = {}; std::vector newBoolVector = {}; std::vector newFloatVector = {}; std::vector newDoubleVector = {}; std::vector newYesNoVector = {}; std::vector newStringVector = {}; std::vector newLatLonVector = {}; std::vector> 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(_eventEmitter)->onIntArrayChanged(value); } } [super updateProps:props oldProps:oldProps]; } - (void)onChange:(UIView *)sender { // No-op // std::dynamic_pointer_cast(_eventEmitter) // ->onChange(ViewEventEmitter::OnChange{.value = static_cast(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(_eventEmitter)->onLegacyStyleEvent(value); } @end Class RNTMyNativeViewCls(void) { return RNTMyNativeViewComponentView.class; }