1313#include < string>
1414#include < cctype>
1515#include < react/renderer/uimanager/UIManagerBinding.h>
16+ #include < cassert>
1617
1718namespace margelo ::nitro::cssnitro {
1819
1920 using jsi::Runtime;
2021 using reactnativecss::Observable;
2122 namespace nitro_ns = ::margelo::nitro;
2223
23- namespace {
24- bool containsColorInsensitive (const std::string &key) {
24+ ShadowTreeUpdateManager::ShadowTreeUpdateManager () = default ;
25+
26+ struct VariantConverter {
27+ private:
28+ static bool containsColorInsensitive (const std::string &key) {
2529 if (key.size () < 5 ) return false ;
2630 std::string lower;
2731 lower.reserve (key.size ());
@@ -30,9 +34,8 @@ namespace margelo::nitro::cssnitro {
3034 static_cast <char >(::tolower (static_cast <unsigned char >(c))));
3135 return lower.find (" color" ) != std::string::npos;
3236 }
33- }
3437
35- struct VariantConverter {
38+ public:
3639 static folly::dynamic convert (ShadowTreeUpdateManager &self,
3740 Runtime &runtime,
3841 const nitro_ns::VariantType &var) {
@@ -72,26 +75,25 @@ namespace margelo::nitro::cssnitro {
7275 },
7376 var);
7477 }
75- };
7678
77- // Convert a single style entry (AnyMap) into an update object, applying color processing only for keys containing "color"
78- folly::dynamic ShadowTreeUpdateManager::styleEntryToUpdate (Runtime &runtime,
79- const nitro_ns::AnyMap &entry) {
80- folly::dynamic obj = folly::dynamic::object ();
81- const auto &map = entry.getMap ();
82- for (const auto &kv: map) {
83- const auto &var = static_cast <const nitro_ns::VariantType &>(kv.second );
84- auto dynVal = VariantConverter::convert (*this , runtime, var);
85- if (containsColorInsensitive (kv.first )) {
86- obj[kv.first ] = processColorDynamic (runtime, dynVal);
87- } else {
88- obj[kv.first ] = std::move (dynVal);
79+ // Overload: convert an AnyMap directly (top-level style entry)
80+ static folly::dynamic convert (ShadowTreeUpdateManager &self,
81+ Runtime &runtime,
82+ const nitro_ns::AnyMap &entry) {
83+ folly::dynamic obj = folly::dynamic::object ();
84+ // Iterate key-value pairs from AnyMap
85+ for (const auto &kv: entry.getMap ()) {
86+ const auto &v = static_cast <const nitro_ns::VariantType &>(kv.second );
87+ auto dynVal = convert (self, runtime, v);
88+ if (containsColorInsensitive (kv.first )) {
89+ obj[kv.first ] = self.processColorDynamic (runtime, dynVal);
90+ } else {
91+ obj[kv.first ] = std::move (dynVal);
92+ }
8993 }
94+ return obj;
9095 }
91- return obj;
92- }
93-
94- ShadowTreeUpdateManager::ShadowTreeUpdateManager () = default ;
96+ };
9597
9698 void ShadowTreeUpdateManager::linkComponent (Runtime &runtime,
9799 const std::string &componentId,
@@ -125,7 +127,7 @@ namespace margelo::nitro::cssnitro {
125127 if (!p) {
126128 continue ;
127129 }
128- auto obj = styleEntryToUpdate ( *link.runtime , *p);
130+ auto obj = VariantConverter::convert (* this , *link.runtime , *p);
129131 if (obj.isObject ()) {
130132 for (auto &kv: obj.items ()) {
131133 payload[kv.first ] = std::move (kv.second );
0 commit comments