Skip to content

Commit 866eeba

Browse files
committed
fix: force bottom navigation animation completion
1 parent ff0df54 commit 866eeba

File tree

1 file changed

+30
-4
lines changed

1 file changed

+30
-4
lines changed

src/components/BottomNavigation/BottomNavigationBar.tsx

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,7 @@ const BottomNavigationBar = <Route extends BaseRoute>({
380380
* Animation for the background color ripple, used to determine it's scale and opacity.
381381
*/
382382
const rippleAnim = useAnimatedValue(MIN_RIPPLE_SCALE);
383+
const targetIndexRef = React.useRef(navigationState.index);
383384

384385
/**
385386
* Layout of the navigation bar. The width is used to determine the size and position of the ripple.
@@ -412,6 +413,7 @@ const BottomNavigationBar = <Route extends BaseRoute>({
412413

413414
const animateToIndex = React.useCallback(
414415
(index: number) => {
416+
targetIndexRef.current = index;
415417
// Reset the ripple to avoid glitch if it's currently animating
416418
rippleAnim.setValue(MIN_RIPPLE_SCALE);
417419

@@ -429,13 +431,37 @@ const BottomNavigationBar = <Route extends BaseRoute>({
429431
easing: animationEasing,
430432
})
431433
),
432-
]).start(() => {
433-
// Workaround a bug in native animations where this is reset after first animation
434-
tabsAnims.map((tab, i) => tab.setValue(i === index ? 1 : 0));
434+
]).start((result) => {
435+
if (targetIndexRef.current !== index) {
436+
return;
437+
}
438+
439+
// Explicitly finish animation state to avoid RN 0.80 drops leaving tabs half-focused
440+
tabsAnims.forEach((tab, i) => {
441+
tab.stopAnimation();
442+
tab.setValue(i === index ? 1 : 0);
443+
});
435444

436-
// Update the index to change bar's background color and then hide the ripple
445+
indexAnim.stopAnimation();
437446
indexAnim.setValue(index);
447+
448+
rippleAnim.stopAnimation();
438449
rippleAnim.setValue(MIN_RIPPLE_SCALE);
450+
451+
if (result?.finished === false) {
452+
requestAnimationFrame(() => {
453+
if (targetIndexRef.current !== index) {
454+
return;
455+
}
456+
457+
tabsAnims.forEach((tab, i) => {
458+
tab.stopAnimation();
459+
tab.setValue(i === index ? 1 : 0);
460+
});
461+
indexAnim.setValue(index);
462+
rippleAnim.setValue(MIN_RIPPLE_SCALE);
463+
});
464+
}
439465
});
440466
},
441467
[

0 commit comments

Comments
 (0)