@onekeyfe/react-native-segment-slider 3.0.96 → 3.0.99

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.
@@ -15,121 +15,159 @@ namespace margelo::nitro::segmentslider::views {
15
15
  using namespace facebook;
16
16
  using ConcreteStateData = react::ConcreteState<HybridSegmentSliderState>;
17
17
 
18
- void JHybridSegmentSliderStateUpdater::updateViewProps(jni::alias_ref<jni::JClass> /* class */,
19
- jni::alias_ref<JHybridSegmentSliderSpec::JavaPart> javaView,
20
- jni::alias_ref<JStateWrapper::javaobject> stateWrapperInterface) {
21
- std::shared_ptr<JHybridSegmentSliderSpec> hybridView = javaView->getJHybridSegmentSliderSpec();
22
-
18
+ std::shared_ptr<const HybridSegmentSliderProps> JHybridSegmentSliderStateUpdater::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 HybridSegmentSliderState& data = concreteState->getData();
33
- const std::shared_ptr<HybridSegmentSliderProps>& props = data.getProps();
37
+ const std::shared_ptr<const HybridSegmentSliderProps>& props = data.getProps();
34
38
  if (props == nullptr) [[unlikely]] {
35
- // Props aren't set yet!
36
39
  throw std::runtime_error("HybridSegmentSliderState'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->defaultValue.isDirty) {
41
- hybridView->setDefaultValue(props->defaultValue.value);
42
- props->defaultValue.isDirty = false;
43
- }
44
- if (props->min.isDirty) {
45
- hybridView->setMin(props->min.value);
46
- props->min.isDirty = false;
47
- }
48
- if (props->max.isDirty) {
49
- hybridView->setMax(props->max.value);
50
- props->max.isDirty = false;
51
- }
52
- if (props->segments.isDirty) {
53
- hybridView->setSegments(props->segments.value);
54
- props->segments.isDirty = false;
55
- }
56
- if (props->sliderHeight.isDirty) {
57
- hybridView->setSliderHeight(props->sliderHeight.value);
58
- props->sliderHeight.isDirty = false;
59
- }
60
- if (props->disabled.isDirty) {
61
- hybridView->setDisabled(props->disabled.value);
62
- props->disabled.isDirty = false;
63
- }
64
- if (props->showBubble.isDirty) {
65
- hybridView->setShowBubble(props->showBubble.value);
66
- props->showBubble.isDirty = false;
67
- }
68
- if (props->centerOrigin.isDirty) {
69
- hybridView->setCenterOrigin(props->centerOrigin.value);
70
- props->centerOrigin.isDirty = false;
71
- }
72
- if (props->snapTapToSegment.isDirty) {
73
- hybridView->setSnapTapToSegment(props->snapTapToSegment.value);
74
- props->snapTapToSegment.isDirty = false;
75
- }
76
- if (props->fillColor.isDirty) {
77
- hybridView->setFillColor(props->fillColor.value);
78
- props->fillColor.isDirty = false;
79
- }
80
- if (props->trackColor.isDirty) {
81
- hybridView->setTrackColor(props->trackColor.value);
82
- props->trackColor.isDirty = false;
83
- }
84
- if (props->thumbColor.isDirty) {
85
- hybridView->setThumbColor(props->thumbColor.value);
86
- props->thumbColor.isDirty = false;
87
- }
88
- if (props->thumbBorderColor.isDirty) {
89
- hybridView->setThumbBorderColor(props->thumbBorderColor.value);
90
- props->thumbBorderColor.isDirty = false;
91
- }
92
- if (props->markActiveColor.isDirty) {
93
- hybridView->setMarkActiveColor(props->markActiveColor.value);
94
- props->markActiveColor.isDirty = false;
95
- }
96
- if (props->markInactiveColor.isDirty) {
97
- hybridView->setMarkInactiveColor(props->markInactiveColor.value);
98
- props->markInactiveColor.isDirty = false;
99
- }
100
- if (props->markBorderColor.isDirty) {
101
- hybridView->setMarkBorderColor(props->markBorderColor.value);
102
- props->markBorderColor.isDirty = false;
103
- }
104
- if (props->bubbleColor.isDirty) {
105
- hybridView->setBubbleColor(props->bubbleColor.value);
106
- props->bubbleColor.isDirty = false;
107
- }
108
- if (props->bubbleTextColor.isDirty) {
109
- hybridView->setBubbleTextColor(props->bubbleTextColor.value);
110
- props->bubbleTextColor.isDirty = false;
111
- }
112
- if (props->onChange.isDirty) {
113
- hybridView->setOnChange(props->onChange.value);
114
- props->onChange.isDirty = false;
115
- }
116
- if (props->onSlideStart.isDirty) {
117
- hybridView->setOnSlideStart(props->onSlideStart.value);
118
- props->onSlideStart.isDirty = false;
44
+ void JHybridSegmentSliderStateUpdater::updateViewProps(jni::alias_ref<jni::JClass> /* class */,
45
+ jni::alias_ref<JHybridSegmentSliderSpec::JavaPart> javaView,
46
+ jni::alias_ref<JStateWrapper::javaobject> newState,
47
+ jni::alias_ref<JStateWrapper::javaobject> oldState) {
48
+ std::shared_ptr<JHybridSegmentSliderSpec> hybridView = javaView->getJHybridSegmentSliderSpec();
49
+ std::shared_ptr<const HybridSegmentSliderProps> newProps = getPropsFromStateWrapper(newState);
50
+ std::shared_ptr<const HybridSegmentSliderProps> oldProps = getPropsFromStateWrapper(oldState);
51
+ if (newProps == nullptr) [[unlikely]] {
52
+ throw std::runtime_error("Current StateWrapper doesn't contain any props!");
119
53
  }
120
- if (props->onSlideComplete.isDirty) {
121
- hybridView->setOnSlideComplete(props->onSlideComplete.value);
122
- props->onSlideComplete.isDirty = false;
54
+
55
+ // Update only props that differ from the previous State snapshot.
56
+ if (oldProps == nullptr
57
+ ? newProps->defaultValue.isProvided()
58
+ : !newProps->defaultValue.hasSameValue(oldProps->defaultValue)) {
59
+ hybridView->setDefaultValue(newProps->defaultValue.get());
60
+ }
61
+ if (oldProps == nullptr
62
+ ? newProps->min.isProvided()
63
+ : !newProps->min.hasSameValue(oldProps->min)) {
64
+ hybridView->setMin(newProps->min.get());
65
+ }
66
+ if (oldProps == nullptr
67
+ ? newProps->max.isProvided()
68
+ : !newProps->max.hasSameValue(oldProps->max)) {
69
+ hybridView->setMax(newProps->max.get());
70
+ }
71
+ if (oldProps == nullptr
72
+ ? newProps->segments.isProvided()
73
+ : !newProps->segments.hasSameValue(oldProps->segments)) {
74
+ hybridView->setSegments(newProps->segments.get());
75
+ }
76
+ if (oldProps == nullptr
77
+ ? newProps->sliderHeight.isProvided()
78
+ : !newProps->sliderHeight.hasSameValue(oldProps->sliderHeight)) {
79
+ hybridView->setSliderHeight(newProps->sliderHeight.get());
80
+ }
81
+ if (oldProps == nullptr
82
+ ? newProps->disabled.isProvided()
83
+ : !newProps->disabled.hasSameValue(oldProps->disabled)) {
84
+ hybridView->setDisabled(newProps->disabled.get());
85
+ }
86
+ if (oldProps == nullptr
87
+ ? newProps->showBubble.isProvided()
88
+ : !newProps->showBubble.hasSameValue(oldProps->showBubble)) {
89
+ hybridView->setShowBubble(newProps->showBubble.get());
90
+ }
91
+ if (oldProps == nullptr
92
+ ? newProps->centerOrigin.isProvided()
93
+ : !newProps->centerOrigin.hasSameValue(oldProps->centerOrigin)) {
94
+ hybridView->setCenterOrigin(newProps->centerOrigin.get());
95
+ }
96
+ if (oldProps == nullptr
97
+ ? newProps->snapTapToSegment.isProvided()
98
+ : !newProps->snapTapToSegment.hasSameValue(oldProps->snapTapToSegment)) {
99
+ hybridView->setSnapTapToSegment(newProps->snapTapToSegment.get());
100
+ }
101
+ if (oldProps == nullptr
102
+ ? newProps->fillColor.isProvided()
103
+ : !newProps->fillColor.hasSameValue(oldProps->fillColor)) {
104
+ hybridView->setFillColor(newProps->fillColor.get());
105
+ }
106
+ if (oldProps == nullptr
107
+ ? newProps->trackColor.isProvided()
108
+ : !newProps->trackColor.hasSameValue(oldProps->trackColor)) {
109
+ hybridView->setTrackColor(newProps->trackColor.get());
110
+ }
111
+ if (oldProps == nullptr
112
+ ? newProps->thumbColor.isProvided()
113
+ : !newProps->thumbColor.hasSameValue(oldProps->thumbColor)) {
114
+ hybridView->setThumbColor(newProps->thumbColor.get());
115
+ }
116
+ if (oldProps == nullptr
117
+ ? newProps->thumbBorderColor.isProvided()
118
+ : !newProps->thumbBorderColor.hasSameValue(oldProps->thumbBorderColor)) {
119
+ hybridView->setThumbBorderColor(newProps->thumbBorderColor.get());
120
+ }
121
+ if (oldProps == nullptr
122
+ ? newProps->markActiveColor.isProvided()
123
+ : !newProps->markActiveColor.hasSameValue(oldProps->markActiveColor)) {
124
+ hybridView->setMarkActiveColor(newProps->markActiveColor.get());
125
+ }
126
+ if (oldProps == nullptr
127
+ ? newProps->markInactiveColor.isProvided()
128
+ : !newProps->markInactiveColor.hasSameValue(oldProps->markInactiveColor)) {
129
+ hybridView->setMarkInactiveColor(newProps->markInactiveColor.get());
130
+ }
131
+ if (oldProps == nullptr
132
+ ? newProps->markBorderColor.isProvided()
133
+ : !newProps->markBorderColor.hasSameValue(oldProps->markBorderColor)) {
134
+ hybridView->setMarkBorderColor(newProps->markBorderColor.get());
135
+ }
136
+ if (oldProps == nullptr
137
+ ? newProps->bubbleColor.isProvided()
138
+ : !newProps->bubbleColor.hasSameValue(oldProps->bubbleColor)) {
139
+ hybridView->setBubbleColor(newProps->bubbleColor.get());
140
+ }
141
+ if (oldProps == nullptr
142
+ ? newProps->bubbleTextColor.isProvided()
143
+ : !newProps->bubbleTextColor.hasSameValue(oldProps->bubbleTextColor)) {
144
+ hybridView->setBubbleTextColor(newProps->bubbleTextColor.get());
145
+ }
146
+ if (oldProps == nullptr
147
+ ? newProps->onChange.isProvided()
148
+ : !newProps->onChange.hasSameValue(oldProps->onChange)) {
149
+ hybridView->setOnChange(newProps->onChange.get());
150
+ }
151
+ if (oldProps == nullptr
152
+ ? newProps->onSlideStart.isProvided()
153
+ : !newProps->onSlideStart.hasSameValue(oldProps->onSlideStart)) {
154
+ hybridView->setOnSlideStart(newProps->onSlideStart.get());
155
+ }
156
+ if (oldProps == nullptr
157
+ ? newProps->onSlideComplete.isProvided()
158
+ : !newProps->onSlideComplete.hasSameValue(oldProps->onSlideComplete)) {
159
+ hybridView->setOnSlideComplete(newProps->onSlideComplete.get());
123
160
  }
124
161
 
125
162
  // Update hybridRef if it changed
126
- if (props->hybridRef.isDirty) {
163
+ if (oldProps == nullptr
164
+ ? newProps->hybridRef.isProvided()
165
+ : !newProps->hybridRef.hasSameValue(oldProps->hybridRef)) {
127
166
  // hybridRef changed - call it with new this
128
- const auto& maybeFunc = props->hybridRef.value;
167
+ const auto& maybeFunc = newProps->hybridRef.get();
129
168
  if (maybeFunc.has_value()) {
130
169
  maybeFunc.value()(hybridView);
131
170
  }
132
- props->hybridRef.isDirty = false;
133
171
  }
134
172
  }
135
173
 
@@ -31,7 +31,12 @@ public:
31
31
  public:
32
32
  static void updateViewProps(jni::alias_ref<jni::JClass> /* class */,
33
33
  jni::alias_ref<JHybridSegmentSliderSpec::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 HybridSegmentSliderProps> 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.segmentslider.*
20
20
  * Represents the React Native `ViewManager` for the "SegmentSlider" Nitro HybridView.
21
21
  */
22
22
  public class HybridSegmentSliderManager: SimpleViewManager<View>() {
23
+ /**
24
+ * Represents the View and its last state snapshot (mutable)
25
+ */
26
+ private class HybridViewHolder(
27
+ val hybridView: HybridSegmentSlider,
28
+ var lastState: StateWrapper? = null,
29
+ )
30
+
23
31
  init {
24
32
  if (RecyclableView::class.java.isAssignableFrom(HybridSegmentSlider::class.java)) {
25
33
  // Enable view recycling
@@ -34,33 +42,41 @@ public class HybridSegmentSliderManager: SimpleViewManager<View>() {
34
42
  override fun createViewInstance(reactContext: ThemedReactContext): View {
35
43
  val hybridView = HybridSegmentSlider(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
- HybridSegmentSliderStateUpdater.updateViewProps(hybridView, stateWrapper)
58
+ HybridSegmentSliderStateUpdater.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 HybridSegmentSliderManager: SimpleViewManager<View>() {
74
90
  }
75
91
  }
76
92
 
77
- private fun getHybridView(view: View): HybridSegmentSlider? {
78
- return view.getTag(associated_hybrid_view_tag) as? HybridSegmentSlider
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 HybridSegmentSliderStateUpdater {
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: HybridSegmentSliderSpec, state: StateWrapper)
21
+ external fun updateViewProps(view: HybridSegmentSliderSpec, newState: StateWrapper, oldState: StateWrapper?)
22
22
  }
23
23
  }