/** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ #import "RCTSurfaceBackedComponent.h" #import #import #import #import #import #import "RCTSurfaceBackedComponentState.h" @implementation RCTSurfaceBackedComponent + (id)initialState { return [RCTSurfaceBackedComponentState new]; } + (instancetype)newWithBridge:(RCTBridge *)bridge moduleName:(NSString *)moduleName properties:(NSDictionary *)properties options:(RCTSurfaceHostingComponentOptions)options { CKComponentScope scope(self, moduleName); RCTSurfaceBackedComponentState *state = scope.state(); if (state.surface == nil || state.surface.bridge != bridge || ![state.surface.moduleName isEqualToString:moduleName]) { RCTSurface *surface = [[RCTSurface alloc] initWithBridge:bridge moduleName:moduleName initialProperties:properties]; state = [RCTSurfaceBackedComponentState newWithSurface:surface]; CKComponentScope::replaceState(scope, state); } else { if (![state.surface.properties isEqualToDictionary:properties]) { state.surface.properties = properties; } } RCTSurfaceHostingComponent *surfaceHostingComponent = [RCTSurfaceHostingComponent newWithSurface:state.surface options:options]; CKComponent *component; if (options.activityIndicatorComponentFactory == nil || RCTSurfaceStageIsRunning(state.surface.stage)) { component = surfaceHostingComponent; } else { component = [CKOverlayLayoutComponent newWithComponent:surfaceHostingComponent overlay:options.activityIndicatorComponentFactory()]; } return [super newWithComponent:component]; } @end