diff --git a/ReactCommon/fabric/events/EventEmitter.cpp b/ReactCommon/fabric/events/EventEmitter.cpp index cd823647a79..016ecc9e370 100644 --- a/ReactCommon/fabric/events/EventEmitter.cpp +++ b/ReactCommon/fabric/events/EventEmitter.cpp @@ -40,7 +40,6 @@ EventEmitter::EventEmitter( WeakEventDispatcher eventDispatcher) : eventTarget_(std::move(eventTarget)), weakEventTarget_({}), - tag_(tag), eventDispatcher_(std::move(eventDispatcher)) {} void EventEmitter::dispatchEvent( @@ -48,19 +47,14 @@ void EventEmitter::dispatchEvent( const folly::dynamic &payload, const EventPriority &priority) const { SystraceSection s("EventEmitter::dispatchEvent"); + auto eventDispatcher = eventDispatcher_.lock(); if (!eventDispatcher) { return; } - // Mixing `target` into `payload`. - assert(payload.isObject()); - folly::dynamic extendedPayload = folly::dynamic::object("target", tag_); - extendedPayload.merge_patch(payload); - eventDispatcher->dispatchEvent( - RawEvent(normalizeEventType(type), extendedPayload, eventTarget_), - priority); + RawEvent(normalizeEventType(type), payload, eventTarget_), priority); } void EventEmitter::enable() const { diff --git a/ReactCommon/fabric/events/EventEmitter.h b/ReactCommon/fabric/events/EventEmitter.h index a974822d0cb..a4ef8772fd0 100644 --- a/ReactCommon/fabric/events/EventEmitter.h +++ b/ReactCommon/fabric/events/EventEmitter.h @@ -84,7 +84,6 @@ class EventEmitter { mutable SharedEventTarget eventTarget_; mutable WeakEventTarget weakEventTarget_; - Tag tag_; WeakEventDispatcher eventDispatcher_; mutable int enableCounter_{0}; }; diff --git a/ReactCommon/fabric/uimanager/UIManagerBinding.cpp b/ReactCommon/fabric/uimanager/UIManagerBinding.cpp index 870ceca9677..06f706e5ca5 100644 --- a/ReactCommon/fabric/uimanager/UIManagerBinding.cpp +++ b/ReactCommon/fabric/uimanager/UIManagerBinding.cpp @@ -71,6 +71,7 @@ void UIManagerBinding::dispatchEvent( SystraceSection s("UIManagerBinding::dispatchEvent"); auto eventTargetValue = jsi::Value::null(); + folly::dynamic extendedPayload; if (eventTarget) { auto &eventTargetWrapper = @@ -79,6 +80,13 @@ void UIManagerBinding::dispatchEvent( if (eventTargetValue.isUndefined()) { return; } + + // Mixing `target` into `payload`. + assert(payload.isObject()); + extendedPayload = folly::dynamic::object("target", eventTargetWrapper.tag); + extendedPayload.merge_patch(payload); + } else { + extendedPayload = payload; } auto &eventHandlerWrapper = @@ -87,7 +95,7 @@ void UIManagerBinding::dispatchEvent( runtime, {std::move(eventTargetValue), jsi::String::createFromUtf8(runtime, type), - jsi::valueFromDynamic(runtime, payload)}); + jsi::valueFromDynamic(runtime, extendedPayload)}); } void UIManagerBinding::invalidate() const { @@ -119,7 +127,7 @@ jsi::Value UIManagerBinding::get( componentNameFromValue(runtime, arguments[1]), surfaceIdFromValue(runtime, arguments[2]), rawPropsFromValue(runtime, arguments[3]), - eventTargetFromValue(runtime, arguments[4]))); + eventTargetFromValue(runtime, arguments[4], arguments[0]))); }); } diff --git a/ReactCommon/fabric/uimanager/primitives.h b/ReactCommon/fabric/uimanager/primitives.h index 8400116a2ba..c49d9700c7d 100644 --- a/ReactCommon/fabric/uimanager/primitives.h +++ b/ReactCommon/fabric/uimanager/primitives.h @@ -31,10 +31,11 @@ inline RawProps rawPropsFromDynamic(const folly::dynamic object) noexcept { } struct EventTargetWrapper : public EventTarget { - EventTargetWrapper(jsi::WeakObject instanceHandle) - : instanceHandle(std::move(instanceHandle)) {} + EventTargetWrapper(jsi::WeakObject instanceHandle, Tag tag) + : instanceHandle(std::move(instanceHandle)), tag(tag) {} mutable jsi::WeakObject instanceHandle; + mutable Tag tag; }; struct EventHandlerWrapper : public EventHandler { @@ -97,9 +98,11 @@ inline static RawProps rawPropsFromValue( inline static SharedEventTarget eventTargetFromValue( jsi::Runtime &runtime, - const jsi::Value &value) { + const jsi::Value &eventTargetValue, + const jsi::Value &tagValue) { return std::make_shared( - jsi::WeakObject(runtime, value.getObject(runtime))); + jsi::WeakObject(runtime, eventTargetValue.getObject(runtime)), + tagValue.getNumber()); } inline static Tag tagFromValue(jsi::Runtime &runtime, const jsi::Value &value) {