/* * 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 "RCTMountingTransactionObserverCoordinator.h" #import "RCTMountingTransactionObserving.h" using namespace facebook::react; void RCTMountingTransactionObserverCoordinator::registerViewComponentDescriptor( RCTComponentViewDescriptor const &componentViewDescriptor, SurfaceId surfaceId) { if (!componentViewDescriptor.observesMountingTransactionWillMount && !componentViewDescriptor.observesMountingTransactionDidMount) { return; } auto &surfaceRegistry = registry_[surfaceId]; assert(surfaceRegistry.count(componentViewDescriptor) == 0); surfaceRegistry.insert(componentViewDescriptor); } void RCTMountingTransactionObserverCoordinator::unregisterViewComponentDescriptor( RCTComponentViewDescriptor const &componentViewDescriptor, SurfaceId surfaceId) { if (!componentViewDescriptor.observesMountingTransactionWillMount && !componentViewDescriptor.observesMountingTransactionDidMount) { return; } auto &surfaceRegistry = registry_[surfaceId]; assert(surfaceRegistry.count(componentViewDescriptor) == 1); surfaceRegistry.erase(componentViewDescriptor); } void RCTMountingTransactionObserverCoordinator::notifyObserversMountingTransactionWillMount( MountingTransaction const &transaction, SurfaceTelemetry const &surfaceTelemetry) const { auto surfaceId = transaction.getSurfaceId(); auto surfaceRegistryIterator = registry_.find(surfaceId); if (surfaceRegistryIterator == registry_.end()) { return; } auto &surfaceRegistry = surfaceRegistryIterator->second; for (auto const &componentViewDescriptor : surfaceRegistry) { if (componentViewDescriptor.observesMountingTransactionWillMount) { [(id)componentViewDescriptor.view mountingTransactionWillMount:transaction withSurfaceTelemetry:surfaceTelemetry]; } } } void RCTMountingTransactionObserverCoordinator::notifyObserversMountingTransactionDidMount( MountingTransaction const &transaction, SurfaceTelemetry const &surfaceTelemetry) const { auto surfaceId = transaction.getSurfaceId(); auto surfaceRegistryIterator = registry_.find(surfaceId); if (surfaceRegistryIterator == registry_.end()) { return; } auto &surfaceRegistry = surfaceRegistryIterator->second; for (auto const &componentViewDescriptor : surfaceRegistry) { if (componentViewDescriptor.observesMountingTransactionDidMount) { [(id)componentViewDescriptor.view mountingTransactionDidMount:transaction withSurfaceTelemetry:surfaceTelemetry]; } } }