diff --git a/packages/react-native/Libraries/Animated/__tests__/Animated-test.js b/packages/react-native/Libraries/Animated/__tests__/Animated-test.js index ba471e03a12..fde378c260b 100644 --- a/packages/react-native/Libraries/Animated/__tests__/Animated-test.js +++ b/packages/react-native/Libraries/Animated/__tests__/Animated-test.js @@ -121,10 +121,12 @@ describe('Animated', () => { await unmount(root); + expect(callback).not.toBeCalled(); + await jest.runOnlyPendingTimersAsync(); expect(callback).toBeCalledWith({finished: false}); }); - it('triggers callback when spring is at rest', () => { + it('triggers callback when spring is at rest', async () => { const anim = new Animated.Value(0); const callback = jest.fn(); Animated.spring(anim, { @@ -132,7 +134,10 @@ describe('Animated', () => { velocity: 0, useNativeDriver: false, }).start(callback); - expect(callback).toBeCalled(); + + expect(callback).not.toBeCalled(); + await jest.runOnlyPendingTimersAsync(); + expect(callback).toBeCalledWith({finished: true}); }); it('send toValue when a critically damped spring stops', () => { diff --git a/packages/react-native/Libraries/Animated/animations/Animation.js b/packages/react-native/Libraries/Animated/animations/Animation.js index ad5163b8ab4..7d26ce2617b 100644 --- a/packages/react-native/Libraries/Animated/animations/Animation.js +++ b/packages/react-native/Libraries/Animated/animations/Animation.js @@ -165,11 +165,7 @@ export default class Animation { const callback = this.#onEnd; if (callback != null) { this.#onEnd = null; - if (ReactNativeFeatureFlags.scheduleAnimatedEndCallbackInMicrotask()) { - queueMicrotask(() => callback(result)); - } else { - callback(result); - } + queueMicrotask(() => callback(result)); } } } diff --git a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js index 0aa841bcaaf..e6e7a5a2a71 100644 --- a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js +++ b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js @@ -560,15 +560,6 @@ const definitions: FeatureFlagDefinitions = { purpose: 'release', }, }, - scheduleAnimatedEndCallbackInMicrotask: { - defaultValue: false, - metadata: { - dateAdded: '2024-09-27', - description: - 'Changes the completion callback supplied via `Animation#start` to be scheduled in a microtask instead of synchronously executed.', - purpose: 'experimentation', - }, - }, shouldSkipStateUpdatesForLoopingAnimations: { defaultValue: false, metadata: { diff --git a/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js b/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js index 7d796d79846..10977d3603e 100644 --- a/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js +++ b/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<650ba11a0ac49b9779c6c98f57f7369f>> + * @generated SignedSource<<716c4507093099c254b57d744366bd05>> * @flow strict */ @@ -37,7 +37,6 @@ export type ReactNativeFeatureFlagsJsOnly = { enableAnimatedPropsMemo: Getter, enableOptimisedVirtualizedCells: Getter, isLayoutAnimationEnabled: Getter, - scheduleAnimatedEndCallbackInMicrotask: Getter, shouldSkipStateUpdatesForLoopingAnimations: Getter, shouldUseAnimatedObjectForTransform: Getter, shouldUseRemoveClippedSubviewsAsDefaultOnIOS: Getter, @@ -154,11 +153,6 @@ export const enableOptimisedVirtualizedCells: Getter = createJavaScript */ export const isLayoutAnimationEnabled: Getter = createJavaScriptFlagGetter('isLayoutAnimationEnabled', true); -/** - * Changes the completion callback supplied via `Animation#start` to be scheduled in a microtask instead of synchronously executed. - */ -export const scheduleAnimatedEndCallbackInMicrotask: Getter = createJavaScriptFlagGetter('scheduleAnimatedEndCallbackInMicrotask', false); - /** * If the animation is within Animated.loop, we do not send state updates to React. */