diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp index 130360aea461cf..919751a119043c 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp @@ -326,6 +326,16 @@ void Scheduler::uiManagerShouldSynchronouslyUpdateViewOnUIThread( } } +void Scheduler::uiManagerShouldAddEventListener( + std::shared_ptr listener) { + addEventListener(listener); +} + +void Scheduler::uiManagerShouldRemoveEventListener( + const std::shared_ptr& listener) { + removeEventListener(listener); +} + void Scheduler::reportMount(SurfaceId surfaceId) const { uiManager_->reportMount(surfaceId); } diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h index 4e7c63284f1de3..8cd071387d840b 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.h @@ -97,6 +97,10 @@ class Scheduler final : public UIManagerDelegate { void uiManagerShouldSynchronouslyUpdateViewOnUIThread( Tag tag, const folly::dynamic& props) override; + void uiManagerShouldAddEventListener( + std::shared_ptr listener) final; + void uiManagerShouldRemoveEventListener( + const std::shared_ptr& listener) final; #pragma mark - ContextContainer ContextContainer::Shared getContextContainer() const; diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp index 402399dcc5ede7..3120b863e17cb9 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp @@ -681,4 +681,20 @@ void UIManager::synchronouslyUpdateViewOnUIThread( } } +#pragma mark - Add & Remove event listener + +void UIManager::addEventListener( + std::shared_ptr listener) { + if (delegate_ != nullptr) { + delegate_->uiManagerShouldAddEventListener(listener); + } +} + +void UIManager::removeEventListener( + const std::shared_ptr& listener) { + if (delegate_ != nullptr) { + delegate_->uiManagerShouldRemoveEventListener(listener); + } +} + } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.h b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.h index d22db831f510dd..2c7e73fdd0a8c2 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.h @@ -205,6 +205,13 @@ class UIManager final : public ShadowTreeDelegate { void updateShadowTree( const std::unordered_map& tagToProps); +#pragma mark - Add & Remove event listener + + void addEventListener(std::shared_ptr listener); + + void removeEventListener( + const std::shared_ptr& listener); + private: friend class UIManagerBinding; friend class Scheduler; diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerDelegate.h b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerDelegate.h index 581a1096ba7bda..4e27e1795ed2fd 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerDelegate.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerDelegate.h @@ -65,6 +65,18 @@ class UIManagerDelegate { Tag tag, const folly::dynamic& props) = 0; + /* + * Add event listener. + */ + virtual void uiManagerShouldAddEventListener( + std::shared_ptr listener) = 0; + + /* + * Remove event listener. + */ + virtual void uiManagerShouldRemoveEventListener( + const std::shared_ptr& listener) = 0; + virtual ~UIManagerDelegate() noexcept = default; };