@@ -5,6 +5,7 @@ import { makeStyles, mergeClasses } from '@griffel/react';
5
5
import { useTabListContext_unstable } from '../TabList/TabListContext' ;
6
6
import { TabRegisterData } from '../TabList/TabList.types' ;
7
7
import { tokens } from '@fluentui/react-theme' ;
8
+ import { useAnimationFrame } from '@fluentui/react-utilities' ;
8
9
9
10
// eslint-disable-next-line @typescript-eslint/naming-convention
10
11
const tabIndicatorCssVars_unstable = {
@@ -80,39 +81,36 @@ export const useTabAnimatedIndicatorStyles_unstable = (state: TabState): TabStat
80
81
const [ animationValues , setAnimationValues ] = React . useState ( { offset : 0 , scale : 1 } ) ;
81
82
const getRegisteredTabs = useTabListContext_unstable ( ctx => ctx . getRegisteredTabs ) ;
82
83
83
- React . useEffect ( ( ) => {
84
- if ( isValueDefined ( lastAnimatedFrom ) ) {
85
- setAnimationValues ( { offset : 0 , scale : 1 } ) ;
86
- }
87
- } , [ lastAnimatedFrom ] ) ;
84
+ const [ requestAnimationFrame ] = useAnimationFrame ( ) ;
85
+
86
+ if ( selected ) {
87
+ const { previousSelectedValue, selectedValue, registeredTabs } = getRegisteredTabs ( ) ;
88
88
89
- React . useEffect ( ( ) => {
90
- if ( selected ) {
91
- const { previousSelectedValue , selectedValue , registeredTabs } = getRegisteredTabs ( ) ;
89
+ if ( isValueDefined ( previousSelectedValue ) && lastAnimatedFrom !== previousSelectedValue ) {
90
+ const previousSelectedTabRect = getRegisteredTabRect ( registeredTabs , previousSelectedValue ) ;
91
+ const selectedTabRect = getRegisteredTabRect ( registeredTabs , selectedValue ) ;
92
92
93
- if ( isValueDefined ( previousSelectedValue ) && lastAnimatedFrom !== previousSelectedValue ) {
94
- const previousSelectedTabRect = getRegisteredTabRect ( registeredTabs , previousSelectedValue ) ;
95
- const selectedTabRect = getRegisteredTabRect ( registeredTabs , selectedValue ) ;
93
+ if ( selectedTabRect && previousSelectedTabRect ) {
94
+ const offset = vertical
95
+ ? previousSelectedTabRect . y - selectedTabRect . y
96
+ : previousSelectedTabRect . x - selectedTabRect . x ;
96
97
97
- if ( selectedTabRect && previousSelectedTabRect ) {
98
- const offset = vertical
99
- ? previousSelectedTabRect . y - selectedTabRect . y
100
- : previousSelectedTabRect . x - selectedTabRect . x ;
98
+ const scale = vertical
99
+ ? previousSelectedTabRect . height / selectedTabRect . height
100
+ : previousSelectedTabRect . width / selectedTabRect . width ;
101
101
102
- const scale = vertical
103
- ? previousSelectedTabRect . height / selectedTabRect . height
104
- : previousSelectedTabRect . width / selectedTabRect . width ;
102
+ setAnimationValues ( { offset, scale } ) ;
103
+ setLastAnimatedFrom ( previousSelectedValue ) ;
105
104
106
- setAnimationValues ( { offset, scale } ) ;
107
- setLastAnimatedFrom ( previousSelectedValue ) ;
108
- }
105
+ // Reset the animation values after the animation is complete
106
+ requestAnimationFrame ( ( ) => setAnimationValues ( { offset : 0 , scale : 1 } ) ) ;
109
107
}
110
- } else if ( isValueDefined ( lastAnimatedFrom ) ) {
111
- // need to clear the last animated from so that if this tab is selected again
112
- // from the same previous tab as last time, that animation still happens.
113
- setLastAnimatedFrom ( undefined ) ;
114
108
}
115
- } , [ selected , getRegisteredTabs , lastAnimatedFrom , vertical ] ) ;
109
+ } else if ( isValueDefined ( lastAnimatedFrom ) ) {
110
+ // need to clear the last animated from so that if this tab is selected again
111
+ // from the same previous tab as last time, that animation still happens.
112
+ setLastAnimatedFrom ( undefined ) ;
113
+ }
116
114
117
115
// do not apply any animation if the tab is disabled
118
116
if ( disabled ) {
0 commit comments