diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventQueue.cpp b/packages/react-native/ReactCommon/react/renderer/core/EventQueue.cpp index c8f9b5c9342..45e650b33df 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventQueue.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/EventQueue.cpp @@ -29,40 +29,40 @@ EventQueue::EventQueue( void EventQueue::enqueueEvent(RawEvent&& rawEvent) const { { std::scoped_lock lock(queueMutex_); - eventQueue_.push_back(std::move(rawEvent)); + + if (rawEvent.isUnique) { + auto repeatedEvent = eventQueue_.rend(); + + for (auto it = eventQueue_.rbegin(); it != eventQueue_.rend(); ++it) { + if (it->type == rawEvent.type && + it->eventTarget == rawEvent.eventTarget) { + repeatedEvent = it; + break; + } else if (it->eventTarget == rawEvent.eventTarget) { + // It is necessary to maintain order of different event types + // for the same target. If the same target has event types A1, B1 + // in the event queue and event A2 occurs. A1 has to stay in the + // queue. + break; + } + } + + if (repeatedEvent == eventQueue_.rend()) { + eventQueue_.push_back(std::move(rawEvent)); + } else { + *repeatedEvent = std::move(rawEvent); + } + } else { + eventQueue_.push_back(std::move(rawEvent)); + } } onEnqueue(); } void EventQueue::enqueueUniqueEvent(RawEvent&& rawEvent) const { - { - std::scoped_lock lock(queueMutex_); - - auto repeatedEvent = eventQueue_.rend(); - - for (auto it = eventQueue_.rbegin(); it != eventQueue_.rend(); ++it) { - if (it->type == rawEvent.type && - it->eventTarget == rawEvent.eventTarget) { - repeatedEvent = it; - break; - } else if (it->eventTarget == rawEvent.eventTarget) { - // It is necessary to maintain order of different event types - // for the same target. If the same target has event types A1, B1 - // in the event queue and event A2 occurs. A1 has to stay in the - // queue. - break; - } - } - - if (repeatedEvent == eventQueue_.rend()) { - eventQueue_.push_back(std::move(rawEvent)); - } else { - *repeatedEvent = std::move(rawEvent); - } - } - - onEnqueue(); + rawEvent.isUnique = true; + enqueueEvent(std::move(rawEvent)); } void EventQueue::enqueueStateUpdate(StateUpdate&& stateUpdate) const { diff --git a/packages/react-native/ReactCommon/react/renderer/core/RawEvent.cpp b/packages/react-native/ReactCommon/react/renderer/core/RawEvent.cpp index d0fa7f28466..8d5a5308c93 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/RawEvent.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/RawEvent.cpp @@ -13,10 +13,12 @@ RawEvent::RawEvent( std::string type, SharedEventPayload eventPayload, SharedEventTarget eventTarget, - Category category) + Category category, + bool isUnique) : type(std::move(type)), eventPayload(std::move(eventPayload)), eventTarget(std::move(eventTarget)), - category(category) {} + category(category), + isUnique(isUnique) {} } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/core/RawEvent.h b/packages/react-native/ReactCommon/react/renderer/core/RawEvent.h index e701c12d869..e2aa3b3fe7d 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/RawEvent.h +++ b/packages/react-native/ReactCommon/react/renderer/core/RawEvent.h @@ -69,13 +69,15 @@ struct RawEvent { std::string type, SharedEventPayload eventPayload, SharedEventTarget eventTarget, - Category category = Category::Unspecified); + Category category = Category::Unspecified, + bool isUnique = false); std::string type; SharedEventPayload eventPayload; SharedEventTarget eventTarget; Category category; EventTag loggingTag{0}; + bool isUnique{false}; // The client may specify a platform-specific timestamp for the event start // time, for example when MotionEvent was triggered on the Android native