@onekeyfe/react-native-perp-depth-bar 3.0.96 → 3.0.98

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/lib/nitrogen/generated/android/c++/views/JHybridPerpDepthBarsStateUpdater.cpp +122 -87
  2. package/lib/nitrogen/generated/android/c++/views/JHybridPerpDepthBarsStateUpdater.hpp +6 -1
  3. package/lib/nitrogen/generated/android/c++/views/JHybridPerpSideRatioStateUpdater.cpp +66 -41
  4. package/lib/nitrogen/generated/android/c++/views/JHybridPerpSideRatioStateUpdater.hpp +6 -1
  5. package/lib/nitrogen/generated/android/kotlin/com/margelo/nitro/perpdepthbar/views/HybridPerpDepthBarsManager.kt +26 -10
  6. package/lib/nitrogen/generated/android/kotlin/com/margelo/nitro/perpdepthbar/views/HybridPerpDepthBarsStateUpdater.kt +2 -2
  7. package/lib/nitrogen/generated/android/kotlin/com/margelo/nitro/perpdepthbar/views/HybridPerpSideRatioManager.kt +26 -10
  8. package/lib/nitrogen/generated/android/kotlin/com/margelo/nitro/perpdepthbar/views/HybridPerpSideRatioStateUpdater.kt +2 -2
  9. package/lib/nitrogen/generated/ios/c++/views/HybridPerpDepthBarsComponent.mm +146 -107
  10. package/lib/nitrogen/generated/ios/c++/views/HybridPerpSideRatioComponent.mm +86 -57
  11. package/lib/nitrogen/generated/shared/c++/views/HybridPerpDepthBarsComponent.cpp +23 -225
  12. package/lib/nitrogen/generated/shared/c++/views/HybridPerpDepthBarsComponent.hpp +74 -66
  13. package/lib/nitrogen/generated/shared/c++/views/HybridPerpSideRatioComponent.cpp +13 -125
  14. package/lib/nitrogen/generated/shared/c++/views/HybridPerpSideRatioComponent.hpp +44 -56
  15. package/lib/nitrogen/nitrogen/generated/android/c++/views/JHybridPerpDepthBarsStateUpdater.cpp +122 -87
  16. package/lib/nitrogen/nitrogen/generated/android/c++/views/JHybridPerpDepthBarsStateUpdater.hpp +6 -1
  17. package/lib/nitrogen/nitrogen/generated/android/c++/views/JHybridPerpSideRatioStateUpdater.cpp +66 -41
  18. package/lib/nitrogen/nitrogen/generated/android/c++/views/JHybridPerpSideRatioStateUpdater.hpp +6 -1
  19. package/lib/nitrogen/nitrogen/generated/android/kotlin/com/margelo/nitro/perpdepthbar/views/HybridPerpDepthBarsManager.kt +26 -10
  20. package/lib/nitrogen/nitrogen/generated/android/kotlin/com/margelo/nitro/perpdepthbar/views/HybridPerpDepthBarsStateUpdater.kt +2 -2
  21. package/lib/nitrogen/nitrogen/generated/android/kotlin/com/margelo/nitro/perpdepthbar/views/HybridPerpSideRatioManager.kt +26 -10
  22. package/lib/nitrogen/nitrogen/generated/android/kotlin/com/margelo/nitro/perpdepthbar/views/HybridPerpSideRatioStateUpdater.kt +2 -2
  23. package/lib/nitrogen/nitrogen/generated/ios/c++/views/HybridPerpDepthBarsComponent.mm +146 -107
  24. package/lib/nitrogen/nitrogen/generated/ios/c++/views/HybridPerpSideRatioComponent.mm +86 -57
  25. package/lib/nitrogen/nitrogen/generated/shared/c++/views/HybridPerpDepthBarsComponent.cpp +23 -225
  26. package/lib/nitrogen/nitrogen/generated/shared/c++/views/HybridPerpDepthBarsComponent.hpp +74 -66
  27. package/lib/nitrogen/nitrogen/generated/shared/c++/views/HybridPerpSideRatioComponent.cpp +13 -125
  28. package/lib/nitrogen/nitrogen/generated/shared/c++/views/HybridPerpSideRatioComponent.hpp +44 -56
  29. package/nitrogen/generated/android/c++/views/JHybridPerpDepthBarsStateUpdater.cpp +122 -87
  30. package/nitrogen/generated/android/c++/views/JHybridPerpDepthBarsStateUpdater.hpp +6 -1
  31. package/nitrogen/generated/android/c++/views/JHybridPerpSideRatioStateUpdater.cpp +66 -41
  32. package/nitrogen/generated/android/c++/views/JHybridPerpSideRatioStateUpdater.hpp +6 -1
  33. package/nitrogen/generated/android/kotlin/com/margelo/nitro/perpdepthbar/views/HybridPerpDepthBarsManager.kt +26 -10
  34. package/nitrogen/generated/android/kotlin/com/margelo/nitro/perpdepthbar/views/HybridPerpDepthBarsStateUpdater.kt +2 -2
  35. package/nitrogen/generated/android/kotlin/com/margelo/nitro/perpdepthbar/views/HybridPerpSideRatioManager.kt +26 -10
  36. package/nitrogen/generated/android/kotlin/com/margelo/nitro/perpdepthbar/views/HybridPerpSideRatioStateUpdater.kt +2 -2
  37. package/nitrogen/generated/ios/c++/views/HybridPerpDepthBarsComponent.mm +146 -107
  38. package/nitrogen/generated/ios/c++/views/HybridPerpSideRatioComponent.mm +86 -57
  39. package/nitrogen/generated/shared/c++/views/HybridPerpDepthBarsComponent.cpp +23 -225
  40. package/nitrogen/generated/shared/c++/views/HybridPerpDepthBarsComponent.hpp +74 -66
  41. package/nitrogen/generated/shared/c++/views/HybridPerpSideRatioComponent.cpp +13 -125
  42. package/nitrogen/generated/shared/c++/views/HybridPerpSideRatioComponent.hpp +44 -56
  43. package/package.json +4 -4
@@ -7,14 +7,15 @@
7
7
 
8
8
  #pragma once
9
9
 
10
- #include <optional>
11
- #include <NitroModules/NitroDefines.hpp>
12
- #include <NitroModules/NitroHash.hpp>
13
- #include <NitroModules/CachedProp.hpp>
14
- #include <react/renderer/core/ConcreteComponentDescriptor.h>
15
- #include <react/renderer/core/PropsParserContext.h>
10
+ #include <NitroModules/ReactProp.hpp>
11
+ #include <NitroModules/ViewComponentDescriptor.hpp>
12
+ #include <NitroModules/ViewPropsHolderState.hpp>
16
13
  #include <react/renderer/components/view/ConcreteViewShadowNode.h>
17
14
  #include <react/renderer/components/view/ViewProps.h>
15
+ #include <react/renderer/core/PropsParserContext.h>
16
+ #include <react/renderer/core/RawProps.h>
17
+
18
+ #include <string>
18
19
 
19
20
  #include <string>
20
21
  #include <memory>
@@ -42,15 +43,41 @@ namespace margelo::nitro::perpdepthbar::views {
42
43
  const react::RawProps& rawProps);
43
44
 
44
45
  public:
45
- CachedProp<double> bidPercentage;
46
- CachedProp<double> askPercentage;
47
- CachedProp<std::string> longColor;
48
- CachedProp<std::string> shortColor;
49
- CachedProp<double> segmentHeight;
50
- CachedProp<double> cornerRadius;
51
- CachedProp<double> gap;
52
- CachedProp<bool> reducedMotion;
53
- CachedProp<std::optional<std::function<void(const std::shared_ptr<HybridPerpSideRatioSpec>& /* ref */)>>> hybridRef;
46
+ nitro::ReactProp<double> bidPercentage;
47
+ nitro::ReactProp<double> askPercentage;
48
+ nitro::ReactProp<std::string> longColor;
49
+ nitro::ReactProp<std::string> shortColor;
50
+ nitro::ReactProp<double> segmentHeight;
51
+ nitro::ReactProp<double> cornerRadius;
52
+ nitro::ReactProp<double> gap;
53
+ nitro::ReactProp<bool> reducedMotion;
54
+ nitro::ReactProp<std::optional<std::function<void(const std::shared_ptr<HybridPerpSideRatioSpec>& /* ref */)>>> hybridRef;
55
+
56
+ [[nodiscard]]
57
+ bool hasSameProps(const HybridPerpSideRatioProps& other) const noexcept {
58
+ return bidPercentage.hasSameValue(other.bidPercentage) &&
59
+ askPercentage.hasSameValue(other.askPercentage) &&
60
+ longColor.hasSameValue(other.longColor) &&
61
+ shortColor.hasSameValue(other.shortColor) &&
62
+ segmentHeight.hasSameValue(other.segmentHeight) &&
63
+ cornerRadius.hasSameValue(other.cornerRadius) &&
64
+ gap.hasSameValue(other.gap) &&
65
+ reducedMotion.hasSameValue(other.reducedMotion) &&
66
+ hybridRef.hasSameValue(other.hybridRef);
67
+ }
68
+
69
+ [[nodiscard]]
70
+ bool hasAnyProvidedProps() const noexcept {
71
+ return bidPercentage.isProvided() ||
72
+ askPercentage.isProvided() ||
73
+ longColor.isProvided() ||
74
+ shortColor.isProvided() ||
75
+ segmentHeight.isProvided() ||
76
+ cornerRadius.isProvided() ||
77
+ gap.isProvided() ||
78
+ reducedMotion.isProvided() ||
79
+ hybridRef.isProvided();
80
+ }
54
81
 
55
82
  private:
56
83
  static bool filterObjectKeys(const std::string& propName);
@@ -59,32 +86,7 @@ namespace margelo::nitro::perpdepthbar::views {
59
86
  /**
60
87
  * State for the "PerpSideRatio" View.
61
88
  */
62
- class HybridPerpSideRatioState final {
63
- public:
64
- HybridPerpSideRatioState() = default;
65
- explicit HybridPerpSideRatioState(const std::shared_ptr<HybridPerpSideRatioProps>& props):
66
- _props(props) {}
67
-
68
- public:
69
- [[nodiscard]]
70
- const std::shared_ptr<HybridPerpSideRatioProps>& getProps() const {
71
- return _props;
72
- }
73
-
74
- public:
75
- #ifdef ANDROID
76
- HybridPerpSideRatioState(const HybridPerpSideRatioState& /* previousState */, folly::dynamic /* data */) {}
77
- folly::dynamic getDynamic() const {
78
- throw std::runtime_error("HybridPerpSideRatioState does not support folly!");
79
- }
80
- react::MapBuffer getMapBuffer() const {
81
- throw std::runtime_error("HybridPerpSideRatioState does not support MapBuffer!");
82
- };
83
- #endif
84
-
85
- private:
86
- std::shared_ptr<HybridPerpSideRatioProps> _props;
87
- };
89
+ using HybridPerpSideRatioState = nitro::ViewPropsHolderState<HybridPerpSideRatioProps>;
88
90
 
89
91
  /**
90
92
  * The Shadow Node for the "PerpSideRatio" View.
@@ -97,21 +99,7 @@ namespace margelo::nitro::perpdepthbar::views {
97
99
  /**
98
100
  * The Component Descriptor for the "PerpSideRatio" View.
99
101
  */
100
- class HybridPerpSideRatioComponentDescriptor final: public react::ConcreteComponentDescriptor<HybridPerpSideRatioShadowNode> {
101
- public:
102
- explicit HybridPerpSideRatioComponentDescriptor(const react::ComponentDescriptorParameters& parameters);
103
-
104
- public:
105
- /**
106
- * A faster path for cloning props - reuses the caching logic from `HybridPerpSideRatioProps`.
107
- */
108
- std::shared_ptr<const react::Props> cloneProps(const react::PropsParserContext& context,
109
- const std::shared_ptr<const react::Props>& props,
110
- react::RawProps rawProps) const override;
111
- #ifdef ANDROID
112
- void adopt(react::ShadowNode& shadowNode) const override;
113
- #endif
114
- };
102
+ using HybridPerpSideRatioComponentDescriptor = nitro::ViewComponentDescriptor<HybridPerpSideRatioShadowNode>;
115
103
 
116
104
  /* The actual view for "PerpSideRatio" needs to be implemented in platform-specific code. */
117
105
 
@@ -15,109 +15,144 @@ namespace margelo::nitro::perpdepthbar::views {
15
15
  using namespace facebook;
16
16
  using ConcreteStateData = react::ConcreteState<HybridPerpDepthBarsState>;
17
17
 
18
- void JHybridPerpDepthBarsStateUpdater::updateViewProps(jni::alias_ref<jni::JClass> /* class */,
19
- jni::alias_ref<JHybridPerpDepthBarsSpec::JavaPart> javaView,
20
- jni::alias_ref<JStateWrapper::javaobject> stateWrapperInterface) {
21
- std::shared_ptr<JHybridPerpDepthBarsSpec> hybridView = javaView->getJHybridPerpDepthBarsSpec();
22
-
18
+ std::shared_ptr<const HybridPerpDepthBarsProps> JHybridPerpDepthBarsStateUpdater::getPropsFromStateWrapper(
19
+ jni::alias_ref<JStateWrapper::javaobject> stateWrapper) {
20
+ if (stateWrapper.get() == nullptr) {
21
+ return nullptr;
22
+ }
23
23
  // Get concrete StateWrapperImpl from passed StateWrapper interface object
24
- jobject rawStateWrapper = stateWrapperInterface.get();
25
- if (!stateWrapperInterface->isInstanceOf(react::StateWrapperImpl::javaClassStatic())) [[unlikely]] {
26
- throw std::runtime_error("StateWrapper is not a StateWrapperImpl");
24
+ jobject rawStateWrapper = stateWrapper.get();
25
+ if (!stateWrapper->isInstanceOf(react::StateWrapperImpl::javaClassStatic())) [[unlikely]] {
26
+ throw std::runtime_error("StateWrapper is not a StateWrapperImpl");
27
+ }
28
+ auto stateWrapperImpl = jni::alias_ref<react::StateWrapperImpl::javaobject>{
29
+ static_cast<react::StateWrapperImpl::javaobject>(rawStateWrapper)
30
+ };
31
+ std::shared_ptr<const react::State> state = stateWrapperImpl->cthis()->getState();
32
+ if (state == nullptr) {
33
+ return nullptr;
27
34
  }
28
- auto stateWrapper = jni::alias_ref<react::StateWrapperImpl::javaobject>{
29
- static_cast<react::StateWrapperImpl::javaobject>(rawStateWrapper)};
30
- std::shared_ptr<const react::State> state = stateWrapper->cthis()->getState();
31
35
  auto concreteState = std::static_pointer_cast<const ConcreteStateData>(state);
32
36
  const HybridPerpDepthBarsState& data = concreteState->getData();
33
- const std::shared_ptr<HybridPerpDepthBarsProps>& props = data.getProps();
37
+ const std::shared_ptr<const HybridPerpDepthBarsProps>& props = data.getProps();
34
38
  if (props == nullptr) [[unlikely]] {
35
- // Props aren't set yet!
36
39
  throw std::runtime_error("HybridPerpDepthBarsState's data doesn't contain any props!");
37
40
  }
41
+ return props;
42
+ }
38
43
 
39
- // Update all props if they are dirty
40
- if (props->percents.isDirty) {
41
- hybridView->setPercents(props->percents.value);
42
- props->percents.isDirty = false;
43
- }
44
- if (props->rowHeight.isDirty) {
45
- hybridView->setRowHeight(props->rowHeight.value);
46
- props->rowHeight.isDirty = false;
47
- }
48
- if (props->rowMarginTop.isDirty) {
49
- hybridView->setRowMarginTop(props->rowMarginTop.value);
50
- props->rowMarginTop.isDirty = false;
51
- }
52
- if (props->barInset.isDirty) {
53
- hybridView->setBarInset(props->barInset.value);
54
- props->barInset.isDirty = false;
55
- }
56
- if (props->color.isDirty) {
57
- hybridView->setColor(props->color.value);
58
- props->color.isDirty = false;
59
- }
60
- if (props->origin.isDirty) {
61
- hybridView->setOrigin(props->origin.value);
62
- props->origin.isDirty = false;
63
- }
64
- if (props->reducedMotion.isDirty) {
65
- hybridView->setReducedMotion(props->reducedMotion.value);
66
- props->reducedMotion.isDirty = false;
67
- }
68
- if (props->epoch.isDirty) {
69
- hybridView->setEpoch(props->epoch.value);
70
- props->epoch.isDirty = false;
71
- }
72
- if (props->prices.isDirty) {
73
- hybridView->setPrices(props->prices.value);
74
- props->prices.isDirty = false;
75
- }
76
- if (props->sizes.isDirty) {
77
- hybridView->setSizes(props->sizes.value);
78
- props->sizes.isDirty = false;
79
- }
80
- if (props->priceColor.isDirty) {
81
- hybridView->setPriceColor(props->priceColor.value);
82
- props->priceColor.isDirty = false;
83
- }
84
- if (props->sizeColor.isDirty) {
85
- hybridView->setSizeColor(props->sizeColor.value);
86
- props->sizeColor.isDirty = false;
87
- }
88
- if (props->priceFontSize.isDirty) {
89
- hybridView->setPriceFontSize(props->priceFontSize.value);
90
- props->priceFontSize.isDirty = false;
91
- }
92
- if (props->sizeFontSize.isDirty) {
93
- hybridView->setSizeFontSize(props->sizeFontSize.value);
94
- props->sizeFontSize.isDirty = false;
95
- }
96
- if (props->textInset.isDirty) {
97
- hybridView->setTextInset(props->textInset.value);
98
- props->textInset.isDirty = false;
99
- }
100
- if (props->placeholderText.isDirty) {
101
- hybridView->setPlaceholderText(props->placeholderText.value);
102
- props->placeholderText.isDirty = false;
103
- }
104
- if (props->placeholderRows.isDirty) {
105
- hybridView->setPlaceholderRows(props->placeholderRows.value);
106
- props->placeholderRows.isDirty = false;
44
+ void JHybridPerpDepthBarsStateUpdater::updateViewProps(jni::alias_ref<jni::JClass> /* class */,
45
+ jni::alias_ref<JHybridPerpDepthBarsSpec::JavaPart> javaView,
46
+ jni::alias_ref<JStateWrapper::javaobject> newState,
47
+ jni::alias_ref<JStateWrapper::javaobject> oldState) {
48
+ std::shared_ptr<JHybridPerpDepthBarsSpec> hybridView = javaView->getJHybridPerpDepthBarsSpec();
49
+ std::shared_ptr<const HybridPerpDepthBarsProps> newProps = getPropsFromStateWrapper(newState);
50
+ std::shared_ptr<const HybridPerpDepthBarsProps> oldProps = getPropsFromStateWrapper(oldState);
51
+ if (newProps == nullptr) [[unlikely]] {
52
+ throw std::runtime_error("Current StateWrapper doesn't contain any props!");
107
53
  }
108
- if (props->onRowPress.isDirty) {
109
- hybridView->setOnRowPress(props->onRowPress.value);
110
- props->onRowPress.isDirty = false;
54
+
55
+ // Update only props that differ from the previous State snapshot.
56
+ if (oldProps == nullptr
57
+ ? newProps->percents.isProvided()
58
+ : !newProps->percents.hasSameValue(oldProps->percents)) {
59
+ hybridView->setPercents(newProps->percents.get());
60
+ }
61
+ if (oldProps == nullptr
62
+ ? newProps->rowHeight.isProvided()
63
+ : !newProps->rowHeight.hasSameValue(oldProps->rowHeight)) {
64
+ hybridView->setRowHeight(newProps->rowHeight.get());
65
+ }
66
+ if (oldProps == nullptr
67
+ ? newProps->rowMarginTop.isProvided()
68
+ : !newProps->rowMarginTop.hasSameValue(oldProps->rowMarginTop)) {
69
+ hybridView->setRowMarginTop(newProps->rowMarginTop.get());
70
+ }
71
+ if (oldProps == nullptr
72
+ ? newProps->barInset.isProvided()
73
+ : !newProps->barInset.hasSameValue(oldProps->barInset)) {
74
+ hybridView->setBarInset(newProps->barInset.get());
75
+ }
76
+ if (oldProps == nullptr
77
+ ? newProps->color.isProvided()
78
+ : !newProps->color.hasSameValue(oldProps->color)) {
79
+ hybridView->setColor(newProps->color.get());
80
+ }
81
+ if (oldProps == nullptr
82
+ ? newProps->origin.isProvided()
83
+ : !newProps->origin.hasSameValue(oldProps->origin)) {
84
+ hybridView->setOrigin(newProps->origin.get());
85
+ }
86
+ if (oldProps == nullptr
87
+ ? newProps->reducedMotion.isProvided()
88
+ : !newProps->reducedMotion.hasSameValue(oldProps->reducedMotion)) {
89
+ hybridView->setReducedMotion(newProps->reducedMotion.get());
90
+ }
91
+ if (oldProps == nullptr
92
+ ? newProps->epoch.isProvided()
93
+ : !newProps->epoch.hasSameValue(oldProps->epoch)) {
94
+ hybridView->setEpoch(newProps->epoch.get());
95
+ }
96
+ if (oldProps == nullptr
97
+ ? newProps->prices.isProvided()
98
+ : !newProps->prices.hasSameValue(oldProps->prices)) {
99
+ hybridView->setPrices(newProps->prices.get());
100
+ }
101
+ if (oldProps == nullptr
102
+ ? newProps->sizes.isProvided()
103
+ : !newProps->sizes.hasSameValue(oldProps->sizes)) {
104
+ hybridView->setSizes(newProps->sizes.get());
105
+ }
106
+ if (oldProps == nullptr
107
+ ? newProps->priceColor.isProvided()
108
+ : !newProps->priceColor.hasSameValue(oldProps->priceColor)) {
109
+ hybridView->setPriceColor(newProps->priceColor.get());
110
+ }
111
+ if (oldProps == nullptr
112
+ ? newProps->sizeColor.isProvided()
113
+ : !newProps->sizeColor.hasSameValue(oldProps->sizeColor)) {
114
+ hybridView->setSizeColor(newProps->sizeColor.get());
115
+ }
116
+ if (oldProps == nullptr
117
+ ? newProps->priceFontSize.isProvided()
118
+ : !newProps->priceFontSize.hasSameValue(oldProps->priceFontSize)) {
119
+ hybridView->setPriceFontSize(newProps->priceFontSize.get());
120
+ }
121
+ if (oldProps == nullptr
122
+ ? newProps->sizeFontSize.isProvided()
123
+ : !newProps->sizeFontSize.hasSameValue(oldProps->sizeFontSize)) {
124
+ hybridView->setSizeFontSize(newProps->sizeFontSize.get());
125
+ }
126
+ if (oldProps == nullptr
127
+ ? newProps->textInset.isProvided()
128
+ : !newProps->textInset.hasSameValue(oldProps->textInset)) {
129
+ hybridView->setTextInset(newProps->textInset.get());
130
+ }
131
+ if (oldProps == nullptr
132
+ ? newProps->placeholderText.isProvided()
133
+ : !newProps->placeholderText.hasSameValue(oldProps->placeholderText)) {
134
+ hybridView->setPlaceholderText(newProps->placeholderText.get());
135
+ }
136
+ if (oldProps == nullptr
137
+ ? newProps->placeholderRows.isProvided()
138
+ : !newProps->placeholderRows.hasSameValue(oldProps->placeholderRows)) {
139
+ hybridView->setPlaceholderRows(newProps->placeholderRows.get());
140
+ }
141
+ if (oldProps == nullptr
142
+ ? newProps->onRowPress.isProvided()
143
+ : !newProps->onRowPress.hasSameValue(oldProps->onRowPress)) {
144
+ hybridView->setOnRowPress(newProps->onRowPress.get());
111
145
  }
112
146
 
113
147
  // Update hybridRef if it changed
114
- if (props->hybridRef.isDirty) {
148
+ if (oldProps == nullptr
149
+ ? newProps->hybridRef.isProvided()
150
+ : !newProps->hybridRef.hasSameValue(oldProps->hybridRef)) {
115
151
  // hybridRef changed - call it with new this
116
- const auto& maybeFunc = props->hybridRef.value;
152
+ const auto& maybeFunc = newProps->hybridRef.get();
117
153
  if (maybeFunc.has_value()) {
118
154
  maybeFunc.value()(hybridView);
119
155
  }
120
- props->hybridRef.isDirty = false;
121
156
  }
122
157
  }
123
158
 
@@ -31,7 +31,12 @@ public:
31
31
  public:
32
32
  static void updateViewProps(jni::alias_ref<jni::JClass> /* class */,
33
33
  jni::alias_ref<JHybridPerpDepthBarsSpec::JavaPart> view,
34
- jni::alias_ref<JStateWrapper::javaobject> stateWrapperInterface);
34
+ jni::alias_ref<JStateWrapper::javaobject> newState,
35
+ jni::alias_ref<JStateWrapper::javaobject> oldState);
36
+
37
+ private:
38
+ static std::shared_ptr<const HybridPerpDepthBarsProps> getPropsFromStateWrapper(
39
+ jni::alias_ref<JStateWrapper::javaobject> stateWrapper);
35
40
 
36
41
  public:
37
42
  static void registerNatives() {
@@ -15,69 +15,94 @@ namespace margelo::nitro::perpdepthbar::views {
15
15
  using namespace facebook;
16
16
  using ConcreteStateData = react::ConcreteState<HybridPerpSideRatioState>;
17
17
 
18
- void JHybridPerpSideRatioStateUpdater::updateViewProps(jni::alias_ref<jni::JClass> /* class */,
19
- jni::alias_ref<JHybridPerpSideRatioSpec::JavaPart> javaView,
20
- jni::alias_ref<JStateWrapper::javaobject> stateWrapperInterface) {
21
- std::shared_ptr<JHybridPerpSideRatioSpec> hybridView = javaView->getJHybridPerpSideRatioSpec();
22
-
18
+ std::shared_ptr<const HybridPerpSideRatioProps> JHybridPerpSideRatioStateUpdater::getPropsFromStateWrapper(
19
+ jni::alias_ref<JStateWrapper::javaobject> stateWrapper) {
20
+ if (stateWrapper.get() == nullptr) {
21
+ return nullptr;
22
+ }
23
23
  // Get concrete StateWrapperImpl from passed StateWrapper interface object
24
- jobject rawStateWrapper = stateWrapperInterface.get();
25
- if (!stateWrapperInterface->isInstanceOf(react::StateWrapperImpl::javaClassStatic())) [[unlikely]] {
26
- throw std::runtime_error("StateWrapper is not a StateWrapperImpl");
24
+ jobject rawStateWrapper = stateWrapper.get();
25
+ if (!stateWrapper->isInstanceOf(react::StateWrapperImpl::javaClassStatic())) [[unlikely]] {
26
+ throw std::runtime_error("StateWrapper is not a StateWrapperImpl");
27
+ }
28
+ auto stateWrapperImpl = jni::alias_ref<react::StateWrapperImpl::javaobject>{
29
+ static_cast<react::StateWrapperImpl::javaobject>(rawStateWrapper)
30
+ };
31
+ std::shared_ptr<const react::State> state = stateWrapperImpl->cthis()->getState();
32
+ if (state == nullptr) {
33
+ return nullptr;
27
34
  }
28
- auto stateWrapper = jni::alias_ref<react::StateWrapperImpl::javaobject>{
29
- static_cast<react::StateWrapperImpl::javaobject>(rawStateWrapper)};
30
- std::shared_ptr<const react::State> state = stateWrapper->cthis()->getState();
31
35
  auto concreteState = std::static_pointer_cast<const ConcreteStateData>(state);
32
36
  const HybridPerpSideRatioState& data = concreteState->getData();
33
- const std::shared_ptr<HybridPerpSideRatioProps>& props = data.getProps();
37
+ const std::shared_ptr<const HybridPerpSideRatioProps>& props = data.getProps();
34
38
  if (props == nullptr) [[unlikely]] {
35
- // Props aren't set yet!
36
39
  throw std::runtime_error("HybridPerpSideRatioState's data doesn't contain any props!");
37
40
  }
41
+ return props;
42
+ }
43
+
44
+ void JHybridPerpSideRatioStateUpdater::updateViewProps(jni::alias_ref<jni::JClass> /* class */,
45
+ jni::alias_ref<JHybridPerpSideRatioSpec::JavaPart> javaView,
46
+ jni::alias_ref<JStateWrapper::javaobject> newState,
47
+ jni::alias_ref<JStateWrapper::javaobject> oldState) {
48
+ std::shared_ptr<JHybridPerpSideRatioSpec> hybridView = javaView->getJHybridPerpSideRatioSpec();
49
+ std::shared_ptr<const HybridPerpSideRatioProps> newProps = getPropsFromStateWrapper(newState);
50
+ std::shared_ptr<const HybridPerpSideRatioProps> oldProps = getPropsFromStateWrapper(oldState);
51
+ if (newProps == nullptr) [[unlikely]] {
52
+ throw std::runtime_error("Current StateWrapper doesn't contain any props!");
53
+ }
38
54
 
39
- // Update all props if they are dirty
40
- if (props->bidPercentage.isDirty) {
41
- hybridView->setBidPercentage(props->bidPercentage.value);
42
- props->bidPercentage.isDirty = false;
55
+ // Update only props that differ from the previous State snapshot.
56
+ if (oldProps == nullptr
57
+ ? newProps->bidPercentage.isProvided()
58
+ : !newProps->bidPercentage.hasSameValue(oldProps->bidPercentage)) {
59
+ hybridView->setBidPercentage(newProps->bidPercentage.get());
43
60
  }
44
- if (props->askPercentage.isDirty) {
45
- hybridView->setAskPercentage(props->askPercentage.value);
46
- props->askPercentage.isDirty = false;
61
+ if (oldProps == nullptr
62
+ ? newProps->askPercentage.isProvided()
63
+ : !newProps->askPercentage.hasSameValue(oldProps->askPercentage)) {
64
+ hybridView->setAskPercentage(newProps->askPercentage.get());
47
65
  }
48
- if (props->longColor.isDirty) {
49
- hybridView->setLongColor(props->longColor.value);
50
- props->longColor.isDirty = false;
66
+ if (oldProps == nullptr
67
+ ? newProps->longColor.isProvided()
68
+ : !newProps->longColor.hasSameValue(oldProps->longColor)) {
69
+ hybridView->setLongColor(newProps->longColor.get());
51
70
  }
52
- if (props->shortColor.isDirty) {
53
- hybridView->setShortColor(props->shortColor.value);
54
- props->shortColor.isDirty = false;
71
+ if (oldProps == nullptr
72
+ ? newProps->shortColor.isProvided()
73
+ : !newProps->shortColor.hasSameValue(oldProps->shortColor)) {
74
+ hybridView->setShortColor(newProps->shortColor.get());
55
75
  }
56
- if (props->segmentHeight.isDirty) {
57
- hybridView->setSegmentHeight(props->segmentHeight.value);
58
- props->segmentHeight.isDirty = false;
76
+ if (oldProps == nullptr
77
+ ? newProps->segmentHeight.isProvided()
78
+ : !newProps->segmentHeight.hasSameValue(oldProps->segmentHeight)) {
79
+ hybridView->setSegmentHeight(newProps->segmentHeight.get());
59
80
  }
60
- if (props->cornerRadius.isDirty) {
61
- hybridView->setCornerRadius(props->cornerRadius.value);
62
- props->cornerRadius.isDirty = false;
81
+ if (oldProps == nullptr
82
+ ? newProps->cornerRadius.isProvided()
83
+ : !newProps->cornerRadius.hasSameValue(oldProps->cornerRadius)) {
84
+ hybridView->setCornerRadius(newProps->cornerRadius.get());
63
85
  }
64
- if (props->gap.isDirty) {
65
- hybridView->setGap(props->gap.value);
66
- props->gap.isDirty = false;
86
+ if (oldProps == nullptr
87
+ ? newProps->gap.isProvided()
88
+ : !newProps->gap.hasSameValue(oldProps->gap)) {
89
+ hybridView->setGap(newProps->gap.get());
67
90
  }
68
- if (props->reducedMotion.isDirty) {
69
- hybridView->setReducedMotion(props->reducedMotion.value);
70
- props->reducedMotion.isDirty = false;
91
+ if (oldProps == nullptr
92
+ ? newProps->reducedMotion.isProvided()
93
+ : !newProps->reducedMotion.hasSameValue(oldProps->reducedMotion)) {
94
+ hybridView->setReducedMotion(newProps->reducedMotion.get());
71
95
  }
72
96
 
73
97
  // Update hybridRef if it changed
74
- if (props->hybridRef.isDirty) {
98
+ if (oldProps == nullptr
99
+ ? newProps->hybridRef.isProvided()
100
+ : !newProps->hybridRef.hasSameValue(oldProps->hybridRef)) {
75
101
  // hybridRef changed - call it with new this
76
- const auto& maybeFunc = props->hybridRef.value;
102
+ const auto& maybeFunc = newProps->hybridRef.get();
77
103
  if (maybeFunc.has_value()) {
78
104
  maybeFunc.value()(hybridView);
79
105
  }
80
- props->hybridRef.isDirty = false;
81
106
  }
82
107
  }
83
108
 
@@ -31,7 +31,12 @@ public:
31
31
  public:
32
32
  static void updateViewProps(jni::alias_ref<jni::JClass> /* class */,
33
33
  jni::alias_ref<JHybridPerpSideRatioSpec::JavaPart> view,
34
- jni::alias_ref<JStateWrapper::javaobject> stateWrapperInterface);
34
+ jni::alias_ref<JStateWrapper::javaobject> newState,
35
+ jni::alias_ref<JStateWrapper::javaobject> oldState);
36
+
37
+ private:
38
+ static std::shared_ptr<const HybridPerpSideRatioProps> getPropsFromStateWrapper(
39
+ jni::alias_ref<JStateWrapper::javaobject> stateWrapper);
35
40
 
36
41
  public:
37
42
  static void registerNatives() {
@@ -20,6 +20,14 @@ import com.margelo.nitro.perpdepthbar.*
20
20
  * Represents the React Native `ViewManager` for the "PerpDepthBars" Nitro HybridView.
21
21
  */
22
22
  public class HybridPerpDepthBarsManager: SimpleViewManager<View>() {
23
+ /**
24
+ * Represents the View and its last state snapshot (mutable)
25
+ */
26
+ private class HybridViewHolder(
27
+ val hybridView: HybridPerpDepthBars,
28
+ var lastState: StateWrapper? = null,
29
+ )
30
+
23
31
  init {
24
32
  if (RecyclableView::class.java.isAssignableFrom(HybridPerpDepthBars::class.java)) {
25
33
  // Enable view recycling
@@ -34,33 +42,41 @@ public class HybridPerpDepthBarsManager: SimpleViewManager<View>() {
34
42
  override fun createViewInstance(reactContext: ThemedReactContext): View {
35
43
  val hybridView = HybridPerpDepthBars(reactContext)
36
44
  val view = hybridView.view
37
- view.setTag(associated_hybrid_view_tag, hybridView)
45
+ view.setTag(associated_hybrid_view_tag, HybridViewHolder(hybridView))
38
46
  return view
39
47
  }
40
48
 
41
49
  override fun updateState(view: View, props: ReactStylesDiffMap, stateWrapper: StateWrapper): Any? {
42
- val hybridView = getHybridView(view)
50
+ val holder = getHybridViewHolder(view)
43
51
  ?: throw Error("Couldn't find view $view in local views table!")
52
+ val hybridView = holder.hybridView
53
+ val oldState = holder.lastState
54
+ val newState = stateWrapper
44
55
 
45
56
  // 1. Update each prop individually
46
57
  hybridView.beforeUpdate()
47
- HybridPerpDepthBarsStateUpdater.updateViewProps(hybridView, stateWrapper)
58
+ HybridPerpDepthBarsStateUpdater.updateViewProps(hybridView, newState, oldState)
48
59
  hybridView.afterUpdate()
60
+ holder.lastState = newState
49
61
 
50
62
  // 2. Continue in base View props
51
- return super.updateState(view, props, stateWrapper)
63
+ return super.updateState(view, props, newState)
52
64
  }
53
65
 
54
66
  override fun onDropViewInstance(view: View) {
55
- val hybridView = getHybridView(view)
56
- hybridView?.onDropView()
67
+ val holder = getHybridViewHolder(view)
68
+ holder?.lastState = null
69
+ holder?.hybridView?.onDropView()
57
70
  return super.onDropViewInstance(view)
58
71
  }
59
72
 
60
73
  protected override fun prepareToRecycleView(reactContext: ThemedReactContext, view: View): View? {
61
- super.prepareToRecycleView(reactContext, view)
62
- val hybridView = getHybridView(view)
74
+ val preparedView = super.prepareToRecycleView(reactContext, view)
75
+ ?: return null
76
+ val holder = getHybridViewHolder(preparedView)
63
77
  ?: return null
78
+ val hybridView = holder.hybridView
79
+ holder.lastState = null
64
80
 
65
81
  @Suppress("USELESS_IS_CHECK")
66
82
  if (hybridView is RecyclableView) {
@@ -74,7 +90,7 @@ public class HybridPerpDepthBarsManager: SimpleViewManager<View>() {
74
90
  }
75
91
  }
76
92
 
77
- private fun getHybridView(view: View): HybridPerpDepthBars? {
78
- return view.getTag(associated_hybrid_view_tag) as? HybridPerpDepthBars
93
+ private fun getHybridViewHolder(view: View): HybridViewHolder? {
94
+ return view.getTag(associated_hybrid_view_tag) as? HybridViewHolder
79
95
  }
80
96
  }
@@ -14,10 +14,10 @@ internal class HybridPerpDepthBarsStateUpdater {
14
14
  companion object {
15
15
  /**
16
16
  * Updates the props for [view] through C++.
17
- * The [state] prop is expected to contain [view]'s props as wrapped Fabric state.
17
+ * The [newState] prop is expected to contain [view]'s props as wrapped Fabric state.
18
18
  */
19
19
  @Suppress("KotlinJniMissingFunction")
20
20
  @JvmStatic
21
- external fun updateViewProps(view: HybridPerpDepthBarsSpec, state: StateWrapper)
21
+ external fun updateViewProps(view: HybridPerpDepthBarsSpec, newState: StateWrapper, oldState: StateWrapper?)
22
22
  }
23
23
  }