Skip to content

Commit e4b3e50

Browse files
committed
feat: introduce feature flag
1 parent cb99658 commit e4b3e50

24 files changed

+208
-80
lines changed

packages/react-native/React/Fabric/Mounting/ComponentViews/Modal/RCTModalHostViewComponentView.mm

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#import <react/renderer/components/FBReactNativeSpec/Props.h>
1515
#import <react/renderer/components/modal/ModalHostViewComponentDescriptor.h>
1616
#import <react/renderer/components/modal/ModalHostViewState.h>
17+
#import <react/featureflags/ReactNativeFeatureFlags.h>
1718

1819
#import "RCTConversions.h"
1920

@@ -251,7 +252,10 @@ - (void)boundsDidChange:(CGRect)newBounds
251252

252253
if (_state != nullptr) {
253254
auto newState = ModalHostViewState{RCTSizeFromCGSize(newBounds.size)};
254-
_state->updateState(std::move(newState), EventQueue::UpdateMode::unstable_Immediate);
255+
BOOL enableImmediateUpdateForModalDetents =
256+
ReactNativeFeatureFlags::enableImmediateUpdateForModalDetents();
257+
258+
_state->updateState(std::move(newState), enableImmediateUpdateForModalDetents ? EventQueue::UpdateMode::unstable_Immediate : EventQueue::UpdateMode::Asynchronous);
255259
}
256260
}
257261

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<3ea1ee77358d99334a7c40bed44f2d90>>
7+
* @generated SignedSource<<dc6fe1b0ab9d22a8c9b2034f1724e522>>
88
*/
99

1010
/**
@@ -192,6 +192,12 @@ public object ReactNativeFeatureFlags {
192192
@JvmStatic
193193
public fun enableImagePrefetchingOnUiThreadAndroid(): Boolean = accessor.enableImagePrefetchingOnUiThreadAndroid()
194194

195+
/**
196+
* When enabled, updates to modal detents will be applied immediately instead of being deferred to the next layout pass.
197+
*/
198+
@JvmStatic
199+
public fun enableImmediateUpdateForModalDetents(): Boolean = accessor.enableImmediateUpdateForModalDetents()
200+
195201
/**
196202
* Dispatches state updates for content offset changes synchronously on the main thread.
197203
*/

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<007a5a1235a999716b382ffd4ca23158>>
7+
* @generated SignedSource<<2df72858c4ff2678f885dc8c6cffda14>>
88
*/
99

1010
/**
@@ -47,6 +47,7 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
4747
private var enableIOSViewClipToPaddingBoxCache: Boolean? = null
4848
private var enableImagePrefetchingAndroidCache: Boolean? = null
4949
private var enableImagePrefetchingOnUiThreadAndroidCache: Boolean? = null
50+
private var enableImmediateUpdateForModalDetentsCache: Boolean? = null
5051
private var enableImmediateUpdateModeForContentOffsetChangesCache: Boolean? = null
5152
private var enableImperativeFocusCache: Boolean? = null
5253
private var enableInteropViewManagerClassLookUpOptimizationIOSCache: Boolean? = null
@@ -345,6 +346,15 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
345346
return cached
346347
}
347348

349+
override fun enableImmediateUpdateForModalDetents(): Boolean {
350+
var cached = enableImmediateUpdateForModalDetentsCache
351+
if (cached == null) {
352+
cached = ReactNativeFeatureFlagsCxxInterop.enableImmediateUpdateForModalDetents()
353+
enableImmediateUpdateForModalDetentsCache = cached
354+
}
355+
return cached
356+
}
357+
348358
override fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean {
349359
var cached = enableImmediateUpdateModeForContentOffsetChangesCache
350360
if (cached == null) {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<8a775646d455cdb6d017fd08aee3e807>>
7+
* @generated SignedSource<<86eaaf389de7ba9e424eb5797b2fcb8a>>
88
*/
99

1010
/**
@@ -82,6 +82,8 @@ public object ReactNativeFeatureFlagsCxxInterop {
8282

8383
@DoNotStrip @JvmStatic public external fun enableImagePrefetchingOnUiThreadAndroid(): Boolean
8484

85+
@DoNotStrip @JvmStatic public external fun enableImmediateUpdateForModalDetents(): Boolean
86+
8587
@DoNotStrip @JvmStatic public external fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean
8688

8789
@DoNotStrip @JvmStatic public external fun enableImperativeFocus(): Boolean

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<afccaed3066598724041c48bfb524234>>
7+
* @generated SignedSource<<ffeefbd7bbb64bd62e5818407bfd4efe>>
88
*/
99

1010
/**
@@ -77,6 +77,8 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi
7777

7878
override fun enableImagePrefetchingOnUiThreadAndroid(): Boolean = false
7979

80+
override fun enableImmediateUpdateForModalDetents(): Boolean = false
81+
8082
override fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean = false
8183

8284
override fun enableImperativeFocus(): Boolean = false

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<ebeb9b37b8d3d0e31f4d4966cbf42b3f>>
7+
* @generated SignedSource<<e7028f968b274fb1b425b0b310752a9d>>
88
*/
99

1010
/**
@@ -51,6 +51,7 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
5151
private var enableIOSViewClipToPaddingBoxCache: Boolean? = null
5252
private var enableImagePrefetchingAndroidCache: Boolean? = null
5353
private var enableImagePrefetchingOnUiThreadAndroidCache: Boolean? = null
54+
private var enableImmediateUpdateForModalDetentsCache: Boolean? = null
5455
private var enableImmediateUpdateModeForContentOffsetChangesCache: Boolean? = null
5556
private var enableImperativeFocusCache: Boolean? = null
5657
private var enableInteropViewManagerClassLookUpOptimizationIOSCache: Boolean? = null
@@ -376,6 +377,16 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
376377
return cached
377378
}
378379

380+
override fun enableImmediateUpdateForModalDetents(): Boolean {
381+
var cached = enableImmediateUpdateForModalDetentsCache
382+
if (cached == null) {
383+
cached = currentProvider.enableImmediateUpdateForModalDetents()
384+
accessedFeatureFlags.add("enableImmediateUpdateForModalDetents")
385+
enableImmediateUpdateForModalDetentsCache = cached
386+
}
387+
return cached
388+
}
389+
379390
override fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean {
380391
var cached = enableImmediateUpdateModeForContentOffsetChangesCache
381392
if (cached == null) {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsOverrides_RNOSS_Experimental_Android.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<dffc5db0f80501f6246f9d6087c6fb4a>>
7+
* @generated SignedSource<<144aa9984009c2c26681ccbb23129927>>
88
*/
99

1010
/**
@@ -25,6 +25,8 @@ public open class ReactNativeFeatureFlagsOverrides_RNOSS_Experimental_Android :
2525

2626
override fun enableAccessibilityOrder(): Boolean = true
2727

28+
override fun enableImmediateUpdateForModalDetents(): Boolean = true
29+
2830
override fun enableSwiftUIBasedFilters(): Boolean = true
2931

3032
override fun preventShadowTreeCommitExhaustion(): Boolean = true

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<1c4ea60d119996f37742542976fedcc8>>
7+
* @generated SignedSource<<bd69726ef1f51033123a1e70588a25e4>>
88
*/
99

1010
/**
@@ -77,6 +77,8 @@ public interface ReactNativeFeatureFlagsProvider {
7777

7878
@DoNotStrip public fun enableImagePrefetchingOnUiThreadAndroid(): Boolean
7979

80+
@DoNotStrip public fun enableImmediateUpdateForModalDetents(): Boolean
81+
8082
@DoNotStrip public fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean
8183

8284
@DoNotStrip public fun enableImperativeFocus(): Boolean

packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<d04720bbbd42eaf338be612a0f3e36a6>>
7+
* @generated SignedSource<<9d6ca4ab85f104654c347ed949eb669e>>
88
*/
99

1010
/**
@@ -201,6 +201,12 @@ class ReactNativeFeatureFlagsJavaProvider
201201
return method(javaProvider_);
202202
}
203203

204+
bool enableImmediateUpdateForModalDetents() override {
205+
static const auto method =
206+
getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("enableImmediateUpdateForModalDetents");
207+
return method(javaProvider_);
208+
}
209+
204210
bool enableImmediateUpdateModeForContentOffsetChanges() override {
205211
static const auto method =
206212
getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("enableImmediateUpdateModeForContentOffsetChanges");
@@ -664,6 +670,11 @@ bool JReactNativeFeatureFlagsCxxInterop::enableImagePrefetchingOnUiThreadAndroid
664670
return ReactNativeFeatureFlags::enableImagePrefetchingOnUiThreadAndroid();
665671
}
666672

673+
bool JReactNativeFeatureFlagsCxxInterop::enableImmediateUpdateForModalDetents(
674+
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
675+
return ReactNativeFeatureFlags::enableImmediateUpdateForModalDetents();
676+
}
677+
667678
bool JReactNativeFeatureFlagsCxxInterop::enableImmediateUpdateModeForContentOffsetChanges(
668679
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
669680
return ReactNativeFeatureFlags::enableImmediateUpdateModeForContentOffsetChanges();
@@ -1046,6 +1057,9 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() {
10461057
makeNativeMethod(
10471058
"enableImagePrefetchingOnUiThreadAndroid",
10481059
JReactNativeFeatureFlagsCxxInterop::enableImagePrefetchingOnUiThreadAndroid),
1060+
makeNativeMethod(
1061+
"enableImmediateUpdateForModalDetents",
1062+
JReactNativeFeatureFlagsCxxInterop::enableImmediateUpdateForModalDetents),
10491063
makeNativeMethod(
10501064
"enableImmediateUpdateModeForContentOffsetChanges",
10511065
JReactNativeFeatureFlagsCxxInterop::enableImmediateUpdateModeForContentOffsetChanges),

packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<7679a91daba1f8941b78a4be4baea6ef>>
7+
* @generated SignedSource<<c66a36424e101da05a9be8c545a1daf7>>
88
*/
99

1010
/**
@@ -111,6 +111,9 @@ class JReactNativeFeatureFlagsCxxInterop
111111
static bool enableImagePrefetchingOnUiThreadAndroid(
112112
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
113113

114+
static bool enableImmediateUpdateForModalDetents(
115+
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
116+
114117
static bool enableImmediateUpdateModeForContentOffsetChanges(
115118
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
116119

0 commit comments

Comments
 (0)