diff --git a/packages/react-native/ReactCommon/react/renderer/core/DynamicEventPayload.cpp b/packages/react-native/ReactCommon/react/renderer/core/DynamicEventPayload.cpp new file mode 100644 index 00000000000..76001da3b28 --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/core/DynamicEventPayload.cpp @@ -0,0 +1,44 @@ +/* + * 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. + */ + +#include "DynamicEventPayload.h" + +#include + +namespace facebook::react { + +DynamicEventPayload::DynamicEventPayload(folly::dynamic&& payload) + : payload_(std::move(payload)) {} + +jsi::Value DynamicEventPayload::asJSIValue(jsi::Runtime& runtime) const { + return jsi::valueFromDynamic(runtime, payload_); +} + +EventPayloadType DynamicEventPayload::getType() const { + return EventPayloadType::ValueFactory; +} + +std::optional DynamicEventPayload::extractValue( + const std::vector& path) const { + auto dynamic = payload_; + for (auto& key : path) { + auto type = dynamic.type(); + if ((type == folly::dynamic::Type::OBJECT || + type == folly::dynamic::Type::ARRAY) && + !dynamic.empty()) { + dynamic = folly::dynamic(dynamic[key]); + } + } + if (dynamic.type() == folly::dynamic::Type::DOUBLE) { + return dynamic.asDouble(); + } else if (dynamic.type() == folly::dynamic::Type::INT64) { + return dynamic.asInt(); + } + return std::nullopt; +} + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/core/DynamicEventPayload.h b/packages/react-native/ReactCommon/react/renderer/core/DynamicEventPayload.h new file mode 100644 index 00000000000..26f55299fa9 --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/core/DynamicEventPayload.h @@ -0,0 +1,30 @@ +/* + * 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. + */ + +#pragma once + +#include +#include + +namespace facebook::react { + +struct DynamicEventPayload : public EventPayload { + explicit DynamicEventPayload(folly::dynamic&& payload); + + /* + * EventPayload implementations + */ + jsi::Value asJSIValue(jsi::Runtime& runtime) const override; + EventPayloadType getType() const override; + std::optional extractValue( + const std::vector& path) const override; + + private: + folly::dynamic payload_; +}; + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.cpp b/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.cpp index b606197c4c8..b2e5bf04b54 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.cpp @@ -9,9 +9,9 @@ #include #include -#include #include +#include "DynamicEventPayload.h" #include "RawEvent.h" namespace facebook::react { @@ -61,18 +61,16 @@ void EventEmitter::dispatchEvent( RawEvent::Category category) const { dispatchEvent( std::move(type), - [payload](jsi::Runtime& runtime) { - return valueFromDynamic(runtime, payload); - }, + std::make_shared(folly::dynamic(payload)), category); } void EventEmitter::dispatchUniqueEvent( std::string type, const folly::dynamic& payload) const { - dispatchUniqueEvent(std::move(type), [payload](jsi::Runtime& runtime) { - return valueFromDynamic(runtime, payload); - }); + dispatchUniqueEvent( + std::move(type), + std::make_shared(folly::dynamic(payload))); } void EventEmitter::dispatchEvent(