diff --git a/FabricExample/App.tsx b/FabricExample/App.tsx index e5d153146f..d711c7c622 100644 --- a/FabricExample/App.tsx +++ b/FabricExample/App.tsx @@ -6,9 +6,6 @@ featureFlags.experiment.synchronousHeaderConfigUpdatesEnabled = false; featureFlags.experiment.synchronousHeaderSubviewUpdatesEnabled = false; featureFlags.experiment.androidResetScreenShadowStateOnOrientationChangeEnabled = true; -featureFlags.experiment.iosPreventReattachmentOfDismissedScreens = true; -featureFlags.experiment.iosPreventReattachmentOfDismissedModals = true; -featureFlags.experiment.ios26AllowInteractionsDuringTransition = true; featureFlags.stable.debugLogging = true; export default App; diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt index 9fd2c8c768..377f803e77 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt @@ -68,20 +68,6 @@ class ScreenStackViewManager : StackFinishTransitioningEvent.EVENT_NAME to mutableMapOf("registrationName" to "onFinishTransitioning"), ) - // iosPreventReattachmentOfDismissedScreens is not available on Android, - // however we must override the setter - override fun setIosPreventReattachmentOfDismissedScreens( - view: ScreenStack?, - value: Boolean, - ) = Unit - - // iosPreventReattachmentOfDismissedModals is not available on Android, - // however we must override the setter - override fun setIosPreventReattachmentOfDismissedModals( - view: ScreenStack?, - value: Boolean, - ) = Unit - // nativeContainerBackgroundColor is iOS-only because the native view hierarchy // differs between platforms. On Android, ScreenStack is used directly as the // container, so `style.backgroundColor` achieves the same effect. diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt index 2987072537..4cb201bbd0 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt @@ -323,11 +323,6 @@ open class ScreenViewManager : value: Boolean, ) = Unit - override fun setIos26AllowInteractionsDuringTransition( - view: Screen?, - value: Boolean, - ) = Unit - // END mark: iOS-only override fun setAndroidResetScreenShadowStateOnOrientationChangeEnabled( diff --git a/ios/RNSScreen.h b/ios/RNSScreen.h index 2328248441..3d3c574ff8 100644 --- a/ios/RNSScreen.h +++ b/ios/RNSScreen.h @@ -9,7 +9,6 @@ #import "RNSScreenContentWrapper.h" #import "RNSScrollEdgeEffectApplicator.h" #import "RNSScrollViewBehaviorOverriding.h" -#import "RNSViewInteractionManager.h" #if !TARGET_OS_TV #import "RNSOrientationProviding.h" @@ -155,12 +154,6 @@ NS_ASSUME_NONNULL_BEGIN - (BOOL)isModal; - (BOOL)isPresentedAsNativeModal; -/** - * Holds a shared instance to a service that finds the view that needs to have interactions disabled for stack to not - * have multiple screen transitions at once. - */ -+ (RNSViewInteractionManager *)viewInteractionManagerInstance; - /** * Tell `Screen` component that it has been removed from react state and can safely cleanup * any retained resources. diff --git a/ios/RNSScreen.mm b/ios/RNSScreen.mm index 69d4d9a470..6c3a40d716 100644 --- a/ios/RNSScreen.mm +++ b/ios/RNSScreen.mm @@ -105,17 +105,6 @@ - (void)initCommonProps _markedForUnmountInCurrentTransaction = NO; } -+ (RNSViewInteractionManager *)viewInteractionManagerInstance -{ - static RNSViewInteractionManager *manager = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - manager = [[RNSViewInteractionManager alloc] init]; - }); - - return manager; -} - - (BOOL)getFullScreenSwipeShadowEnabled { if (@available(iOS 26, *)) { @@ -648,22 +637,6 @@ - (void)notifyTransitionProgress:(double)progress closing:(BOOL)closing goingFor [self postNotificationForEventDispatcherObserversWithEvent:event]; } -- (void)willMoveToWindow:(UIWindow *)newWindow -{ - if (@available(iOS 26, *)) { - // In iOS 26, as soon as another screen appears in transition, it is interactable - // To avoid glitches resulting from clicking buttons mid transition, we temporarily disable all interactions - // Disabling interactions for parent navigation controller won't be enough in case of nested stack - // Furthermore, a stack put inside a modal will exist in an entirely different hierarchy - - // Use RNSViewInteractionManager util to find a suitable subtree to disable interations on, - // starting from reactSuperview - if (![self isPresentedAsNativeModal]) { - [RNSScreenView.viewInteractionManagerInstance disableInteractionsForSubtreeWith:self.reactSuperview]; - } - } -} - - (BOOL)presentationControllerShouldDismiss:(UIPresentationController *)presentationController { if (_preventNativeDismiss) { @@ -674,11 +647,6 @@ - (BOOL)presentationControllerShouldDismiss:(UIPresentationController *)presenta - (void)presentationControllerDidAttemptToDismiss:(UIPresentationController *)presentationController { - if (@available(iOS 26, *)) { - // Reenable interactions - [RNSScreenView.viewInteractionManagerInstance enableInteractionsForLastSubtree]; - } - // NOTE(kkafar): We should consider depracating the use of gesture cancel here & align // with usePreventRemove API of react-navigation v7. [self notifyGestureCancel]; @@ -689,12 +657,6 @@ - (void)presentationControllerDidAttemptToDismiss:(UIPresentationController *)pr - (void)presentationControllerDidDismiss:(UIPresentationController *)presentationController { - if (@available(iOS 26, *)) { - // Reenable interactions - // Dismissed screen doesn't hold a reference to window, but presentingViewController.view does - [RNSScreenView.viewInteractionManagerInstance enableInteractionsForLastSubtree]; - } - [_controller notifyPresentedControllerDismissed]; if ([_reactSuperview respondsToSelector:@selector(presentationControllerDidDismiss:)]) { @@ -1298,8 +1260,6 @@ - (void)updateProps:(react::Props::Shared const &)props oldProps:(react::Props:: [self setSynchronousShadowStateUpdatesEnabled:newScreenProps.synchronousShadowStateUpdatesEnabled]; - [RNSScreenView.viewInteractionManagerInstance setDisabled:newScreenProps.ios26AllowInteractionsDuringTransition]; - #if !TARGET_OS_TV if (newScreenProps.statusBarHidden != oldScreenProps.statusBarHidden) { [self setStatusBarHidden:newScreenProps.statusBarHidden]; @@ -1541,10 +1501,6 @@ - (void)viewWillDisappear:(BOOL)animated - (void)viewDidAppear:(BOOL)animated { - if (@available(iOS 26, *)) { - // Reenable interactions, see willMoveToWindow - [RNSScreenView.viewInteractionManagerInstance enableInteractionsForLastSubtree]; - } [super viewDidAppear:animated]; if (!_isSwiping || _shouldNotify) { // we are going forward or dismissing without swipe @@ -1581,11 +1537,6 @@ - (void)viewDidDisappear:(BOOL)animated _isSwiping = NO; _shouldNotify = YES; - - if (@available(iOS 26, *)) { - // Reenable interactions, see willMoveToWindow - [RNSScreenView.viewInteractionManagerInstance enableInteractionsForLastSubtree]; - } } - (void)viewDidLayoutSubviews diff --git a/ios/RNSScreenStack.h b/ios/RNSScreenStack.h index 5139e02f3c..9331c69ed5 100644 --- a/ios/RNSScreenStack.h +++ b/ios/RNSScreenStack.h @@ -32,9 +32,6 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic) BOOL customAnimation; @property (nonatomic) BOOL disableSwipeBack; -@property (nonatomic, readwrite) BOOL iosPreventReattachmentOfDismissedScreens; -@property (nonatomic, readwrite) BOOL iosPreventReattachmentOfDismissedModals; - @end #pragma mark-- Integration diff --git a/ios/RNSScreenStack.mm b/ios/RNSScreenStack.mm index bfd0a519a0..002e703a1e 100644 --- a/ios/RNSScreenStack.mm +++ b/ios/RNSScreenStack.mm @@ -19,7 +19,6 @@ #import "RNSScreenWindowTraits.h" #import "RNSScrollViewFinder.h" #import "RNSTabsScreenViewController.h" -#import "RNSViewInteractionAware.h" #import "UIScrollView+RNScreens.h" #import "UIView+RNSUtility.h" #import "integrations/RNSDismissibleModalProtocol.h" @@ -32,7 +31,6 @@ @interface RNSScreenStackView () < UIAdaptivePresentationControllerDelegate, UIGestureRecognizerDelegate, UIViewControllerTransitioningDelegate, - RNSViewInteractionAware, RCTMountingTransactionObserving> @property (nonatomic) NSMutableArray *presentedModals; @@ -178,7 +176,6 @@ @implementation RNSScreenStackView { RNSPercentDrivenInteractiveTransition *_interactionController; __weak RNSScreenStackManager *_manager; BOOL _updateScheduled; - UIPanGestureRecognizer *_sinkEventsPanGestureRecognizer; } - (instancetype)initWithFrame:(CGRect)frame @@ -208,10 +205,7 @@ - (void)initCommonProps _presentedModals = [NSMutableArray new]; _controller = [RNSNavigationController new]; _controller.delegate = self; - _sinkEventsPanGestureRecognizer = [[UIPanGestureRecognizer alloc] init]; _nativeContainerBackgroundColor = nil; - _iosPreventReattachmentOfDismissedScreens = YES; - _iosPreventReattachmentOfDismissedModals = YES; #if !TARGET_OS_TV && !TARGET_OS_VISION [self setupGestureHandlers]; #endif @@ -288,12 +282,6 @@ - (void)didMoveToWindow [super didMoveToWindow]; // for handling nested stacks [self maybeAddToParentAndUpdateContainer]; - if (self.window == nil) { - // When hot reload happens that would remove the whole stack, disabling the interaction on a screen out transition - // will not be matched with enabling the interactions on another screen's in transition. We need to make sure - // that the subtree is interactive again - [RNSScreenView.viewInteractionManagerInstance enableInteractionsForLastSubtree]; - } } - (void)maybeAddToParentAndUpdateContainer @@ -710,8 +698,7 @@ - (void)updateContainer /// callback fires correctly on the JS side. This breaks the general assumption that a screen /// removed from the hierarchy will never be reattached. /// See: https://github.com/software-mansion/react-native-screens/issues/3885 - if (_iosPreventReattachmentOfDismissedScreens && screen.controller.isRemovedFromParent && - !screen.preventNativeDismiss) { + if (screen.controller.isRemovedFromParent && !screen.preventNativeDismiss) { continue; } [pushControllers addObject:screen.controller]; @@ -724,7 +711,7 @@ - (void)updateContainer /// Since view recycling is disabled, once we detect that a modal has been removed from the view /// hierarchy, it won't be reused. This allows us to safely filter out dismissed modal from modals coming /// from JS state via `controllers`. - if (_iosPreventReattachmentOfDismissedModals && screen.controller.isRemovedFromParent) { + if (screen.controller.isRemovedFromParent) { continue; } [modalControllers addObject:screen.controller]; @@ -795,20 +782,6 @@ - (void)cancelTouchesInParent [[self rnscreens_findTouchHandlerInAncestorChain] rnscreens_cancelTouches]; } -- (void)rnscreens_disableInteractions -{ - // When transitioning between screens, disable interactions on stack subview which wraps the screens - // and sink all gesture events. This should work for nested stacks and stack inside tabs, inside stack. - self.subviews[0].userInteractionEnabled = NO; - [self addGestureRecognizer:_sinkEventsPanGestureRecognizer]; -} - -- (void)rnscreens_enableInteractions -{ - self.subviews[0].userInteractionEnabled = YES; - [self removeGestureRecognizer:_sinkEventsPanGestureRecognizer]; -} - - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { if (_disableSwipeBack) { @@ -1191,15 +1164,6 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { - if (otherGestureRecognizer == _sinkEventsPanGestureRecognizer) { - // When transition happens between two stack screens, a special "sink" recognizer is added, and then removed. - // It captures all gestures for the time of transition and does nothing, so that in nested stack scenario, - // the outer most stack does not recognize swipe gestures, otherwise it would dismiss the whole nested stack. - // For the recognizer to work as described, it should have precedence over all other recognizers. - // see also: rnscreens_enableInteractions, rnscreens_disableInteractions - return YES; - } - if (@available(iOS 26, *)) { if (gestureRecognizer == _controller.interactiveContentPopGestureRecognizer && [self isScrollViewPanGestureRecognizer:otherGestureRecognizer]) { @@ -1309,16 +1273,6 @@ - (void)updateProps:(const facebook::react::Props::Shared &)props const auto &oldScreenProps = *std::static_pointer_cast(_props); const auto &newScreenProps = *std::static_pointer_cast(props); - if (newScreenProps.iosPreventReattachmentOfDismissedScreens != - oldScreenProps.iosPreventReattachmentOfDismissedScreens) { - [self setIosPreventReattachmentOfDismissedScreens:newScreenProps.iosPreventReattachmentOfDismissedScreens]; - } - - if (newScreenProps.iosPreventReattachmentOfDismissedModals != - oldScreenProps.iosPreventReattachmentOfDismissedModals) { - [self setIosPreventReattachmentOfDismissedModals:newScreenProps.iosPreventReattachmentOfDismissedModals]; - } - if (newScreenProps.nativeContainerBackgroundColor != oldScreenProps.nativeContainerBackgroundColor) { _nativeContainerBackgroundColor = RCTUIColorFromSharedColor(newScreenProps.nativeContainerBackgroundColor); _controller.view.backgroundColor = _nativeContainerBackgroundColor; diff --git a/ios/helpers/RNSViewInteractionAware.h b/ios/helpers/RNSViewInteractionAware.h deleted file mode 100644 index f659c112f1..0000000000 --- a/ios/helpers/RNSViewInteractionAware.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -@protocol RNSViewInteractionAware - -- (void)rnscreens_disableInteractions; - -- (void)rnscreens_enableInteractions; - -@end diff --git a/ios/helpers/RNSViewInteractionManager.h b/ios/helpers/RNSViewInteractionManager.h deleted file mode 100644 index fda20af452..0000000000 --- a/ios/helpers/RNSViewInteractionManager.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -@interface RNSViewInteractionManager : NSObject - -/** - * The behavior is controlled by `ios26AllowInteractionsDuringTransition` feature flag. - * The default is `true`, which means that `disableInteractions`/`enableInteractions` do nothing. - */ -@property (nonatomic) BOOL disabled; - -- (instancetype)init; - -/** - * Given a view, traverse its ancestors hierarchy and find a view that supports RNSViewInteractionAware protocol - * and can disable interactions for the time of screen transition. Make sure that at most one view is disabled at any - * time, re-enabling interactions on previously affected views when necessary. - */ -- (void)disableInteractionsForSubtreeWith:(UIView *)view; - -/** - * Re-enable interactions on the view that had them previously disabled. - */ -- (void)enableInteractionsForLastSubtree; - -@end diff --git a/ios/helpers/RNSViewInteractionManager.mm b/ios/helpers/RNSViewInteractionManager.mm deleted file mode 100644 index cd14115bce..0000000000 --- a/ios/helpers/RNSViewInteractionManager.mm +++ /dev/null @@ -1,64 +0,0 @@ -#import "RNSViewInteractionManager.h" -#import "RNSTabsScreenComponentView.h" -#import "RNSViewInteractionAware.h" - -@implementation RNSViewInteractionManager { - __weak UIView *lastRootWithInteractionsDisabled; -} - -- (instancetype)init -{ - if (self = [super init]) { - lastRootWithInteractionsDisabled = nil; - _disabled = YES; - } - return self; -} - -- (void)disableInteractionsForSubtreeWith:(UIView *)view -{ - if (_disabled) { - return; - } - - UIView *current = view; - while (current && ![current isKindOfClass:UIWindow.class] && - ![current respondsToSelector:@selector(rnscreens_disableInteractions)]) { - current = current.superview; - } - - if (current) { - if (lastRootWithInteractionsDisabled && lastRootWithInteractionsDisabled != current) { - // When one view already has interactions disabled, and we request a different view, - // we need to restore the first one - [self enableInteractionsForLastSubtree]; - } - - if ([current respondsToSelector:@selector(rnscreens_disableInteractions)]) { - [static_cast>(current) rnscreens_disableInteractions]; - } else { - current.userInteractionEnabled = NO; - } - - lastRootWithInteractionsDisabled = current; - } -} - -- (void)enableInteractionsForLastSubtree -{ - if (_disabled) { - return; - } - - if (lastRootWithInteractionsDisabled) { - if ([lastRootWithInteractionsDisabled respondsToSelector:@selector(rnscreens_enableInteractions)]) { - [static_cast>(lastRootWithInteractionsDisabled) rnscreens_enableInteractions]; - } else { - lastRootWithInteractionsDisabled.userInteractionEnabled = YES; - } - - lastRootWithInteractionsDisabled = nil; - } -} - -@end diff --git a/src/components/Screen.tsx b/src/components/Screen.tsx index 8304d216df..4e6bb04536 100644 --- a/src/components/Screen.tsx +++ b/src/components/Screen.tsx @@ -30,7 +30,6 @@ import { } from './helpers/sheet'; import { parseBooleanToOptionalBooleanNativeProp } from '../utils'; import featureFlags from '../flags'; -import warnOnce from 'warn-once'; type NativeProps = ScreenNativeComponentProps | ModalScreenNativeComponentProps; const AnimatedNativeScreen = Animated.createAnimatedComponent( @@ -164,13 +163,6 @@ export const InnerScreen = React.forwardRef( activityState = active !== 0 ? 2 : 0; // in the new version, we need one of the screens to have value of 2 after the transition } - warnOnce( - Platform.OS === 'ios' && - featureFlags.experiment.ios26AllowInteractionsDuringTransition && - !featureFlags.experiment.iosPreventReattachmentOfDismissedScreens, - '[RNScreens] Using featureFlags `ios26AllowInteractionsDuringTransition` with `iosPreventReattachmentOfDismissedScreens` disabled is discouraged and will result in visual bugs on screen transitions. See flags description for details.', - ); - if ( isNativeStack && prevActivityState !== undefined && @@ -285,9 +277,6 @@ export const InnerScreen = React.forwardRef( androidResetScreenShadowStateOnOrientationChangeEnabled={ featureFlags.experiment .androidResetScreenShadowStateOnOrientationChangeEnabled - } - ios26AllowInteractionsDuringTransition={ - featureFlags.experiment.ios26AllowInteractionsDuringTransition }> {!isNativeStack ? ( // see comment of this prop in types.tsx for information why it is needed children diff --git a/src/components/ScreenStack.tsx b/src/components/ScreenStack.tsx index 3f9c998ddd..f43254c74f 100644 --- a/src/components/ScreenStack.tsx +++ b/src/components/ScreenStack.tsx @@ -15,8 +15,6 @@ import warnOnce from 'warn-once'; import ScreenStackNativeComponent, { NativeProps, } from '../fabric/ScreenStackNativeComponent'; -import featureFlags from '../flags'; - const assertGHProvider = ( ScreenGestureDetector: ( props: PropsWithChildren, @@ -95,17 +93,6 @@ function ScreenStack(props: ScreenStackProps) { currentScreenId={currentScreenId}> ; - ios26AllowInteractionsDuringTransition?: CT.WithDefault; } export default codegenNativeComponent('RNSScreen', { diff --git a/src/fabric/ScreenStackNativeComponent.ts b/src/fabric/ScreenStackNativeComponent.ts index f74934d6fe..49dcb8004a 100644 --- a/src/fabric/ScreenStackNativeComponent.ts +++ b/src/fabric/ScreenStackNativeComponent.ts @@ -7,9 +7,6 @@ import type { CodegenTypes as CT, ViewProps, ColorValue } from 'react-native'; type FinishTransitioningEvent = Readonly<{}>; export interface NativeProps extends ViewProps { - iosPreventReattachmentOfDismissedScreens?: CT.WithDefault; - iosPreventReattachmentOfDismissedModals?: CT.WithDefault; - nativeContainerBackgroundColor?: ColorValue; onFinishTransitioning?: CT.DirectEventHandler; diff --git a/src/flags.ts b/src/flags.ts index 6c89d7257d..0ff6f938c1 100644 --- a/src/flags.ts +++ b/src/flags.ts @@ -4,9 +4,6 @@ const RNS_SYNCHRONOUS_HEADER_SUBVIEW_STATE_UPDATES_DEFAULT = false; const RNS_ANDROID_LEGACY_TOP_INSET_BEHAVIOR_DEFAULT = false; const RNS_ANDROID_RESET_SCREEN_SHADOW_STATE_ON_ORIENTATION_CHANGE_DEFAULT = true; -const RNS_IOS_PREVENT_REATTACHMENT_OF_DISMISSED_SCREENS = true; -const RNS_IOS_PREVENT_REATTACHMENT_OF_DISMISSED_MODALS = true; -const RNS_IOS_26_ALLOW_INTERACTIONS_DURING_TRANSITION = true; const RNS_DEBUG_LOGGING = false; // TODO: Migrate freeze here @@ -81,12 +78,6 @@ const _featureFlags = { RNS_ANDROID_LEGACY_TOP_INSET_BEHAVIOR_DEFAULT, androidResetScreenShadowStateOnOrientationChangeEnabled: RNS_ANDROID_RESET_SCREEN_SHADOW_STATE_ON_ORIENTATION_CHANGE_DEFAULT, - iosPreventReattachmentOfDismissedScreens: - RNS_IOS_PREVENT_REATTACHMENT_OF_DISMISSED_SCREENS, - iosPreventReattachmentOfDismissedModals: - RNS_IOS_PREVENT_REATTACHMENT_OF_DISMISSED_MODALS, - ios26AllowInteractionsDuringTransition: - RNS_IOS_26_ALLOW_INTERACTIONS_DURING_TRANSITION, }, stable: { debugLogging: RNS_DEBUG_LOGGING, @@ -164,21 +155,6 @@ const androidResetScreenShadowStateOnOrientationChangeAccessor = 'androidResetScreenShadowStateOnOrientationChangeEnabled', RNS_ANDROID_RESET_SCREEN_SHADOW_STATE_ON_ORIENTATION_CHANGE_DEFAULT, ); -const iosPreventReattachmentOfDismissedScreensAccessor = - createExperimentalFeatureFlagAccessor( - 'iosPreventReattachmentOfDismissedScreens', - RNS_IOS_PREVENT_REATTACHMENT_OF_DISMISSED_SCREENS, - ); -const iosPreventReattachmentOfDismissedModalsAccessor = - createExperimentalFeatureFlagAccessor( - 'iosPreventReattachmentOfDismissedModals', - RNS_IOS_PREVENT_REATTACHMENT_OF_DISMISSED_MODALS, - ); -const ios26AllowInteractionsDuringTransitionAccessor = - createExperimentalFeatureFlagAccessor( - 'ios26AllowInteractionsDuringTransition', - RNS_IOS_26_ALLOW_INTERACTIONS_DURING_TRANSITION, - ); const rnsDebugLoggingAccessor = createStableFeatureFlagAccessor( 'debugLogging', RNS_DEBUG_LOGGING, @@ -227,38 +203,26 @@ export const featureFlags = { androidResetScreenShadowStateOnOrientationChangeAccessor.set(value); }, /** - * Enables the fix for native / JS state desynchronization in Stack. On by default. - * PR: https://github.com/software-mansion/react-native-screens/pull/3584 + * @deprecated This flag is no longer configurable and always returns `true`. */ get iosPreventReattachmentOfDismissedScreens() { - return iosPreventReattachmentOfDismissedScreensAccessor.get(); - }, - set iosPreventReattachmentOfDismissedScreens(value: boolean) { - iosPreventReattachmentOfDismissedScreensAccessor.set(value); + return true; }, + set iosPreventReattachmentOfDismissedScreens(_value: boolean) {}, /** - * Enables the fix for native / JS state desynchronization for Modals. On by default. - * PR: https://github.com/software-mansion/react-native-screens/pull/3760 + * @deprecated This flag is no longer configurable and always returns `true`. */ get iosPreventReattachmentOfDismissedModals() { - return iosPreventReattachmentOfDismissedModalsAccessor.get(); - }, - set iosPreventReattachmentOfDismissedModals(value: boolean) { - iosPreventReattachmentOfDismissedModalsAccessor.set(value); + return true; }, + set iosPreventReattachmentOfDismissedModals(_value: boolean) {}, /** - * Disables the behavior that blocks interactions during Stack Screen transition. - * The application should immediately react to user gestures, dismissing more screens at once, etc. - * Use only with `iosPreventReattachmentOfDismissedScreens = true` to enable the fix - * for native / JS state desynchronization. On by default. - * PR: https://github.com/software-mansion/react-native-screens/pull/3631 + * @deprecated This flag is no longer configurable and always returns `true`. */ get ios26AllowInteractionsDuringTransition() { - return ios26AllowInteractionsDuringTransitionAccessor.get(); - }, - set ios26AllowInteractionsDuringTransition(value: boolean) { - ios26AllowInteractionsDuringTransitionAccessor.set(value); + return true; }, + set ios26AllowInteractionsDuringTransition(_value: boolean) {}, }, /** * Section for stable flags, which can be used to configure library behaviour.