@@ -90,26 +90,30 @@ const SegmentedControl = (props: SegmentedControlProps) => {
90
90
91
91
const segmentsStyle = useRef ( [ ] as { x : number ; width : number } [ ] ) ;
92
92
const segmentedControlHeight = useRef ( 0 ) ;
93
+ const indexRef = useRef ( 0 ) ;
93
94
const segmentsCounter = useRef ( 0 ) ;
94
95
const animatedValue = useRef ( new Reanimated . Value ( initialIndex ) ) ;
95
96
96
- const updateSelectedSegment = useCallback ( ( index : number ) => {
97
- Reanimated . timing ( animatedValue . current , {
98
- toValue : index ,
99
- duration : 300 ,
100
- easing : Easing . bezier ( 0.33 , 1 , 0.68 , 1 )
101
- } ) . start ( ) ;
102
-
103
- return setSelectedSegment ( index ) ;
104
- } , [ ] ) ;
97
+ const changeIndex = useCallback ( _ . throttle ( ( ) => {
98
+ onChangeIndex ?.( indexRef . current ) ;
99
+ } ,
100
+ 400 ,
101
+ { trailing : true , leading : false } ) ,
102
+ [ ] ) ;
105
103
106
104
const onSegmentPress = useCallback ( ( index : number ) => {
107
105
if ( selectedSegment !== index ) {
108
- onChangeIndex ?.( index ) ;
109
- updateSelectedSegment ( index ) ;
106
+ setSelectedSegment ( index ) ;
107
+ indexRef . current = index ;
108
+
109
+ Reanimated . timing ( animatedValue . current , {
110
+ toValue : index ,
111
+ duration : 300 ,
112
+ easing : Easing . bezier ( 0.33 , 1 , 0.68 , 1 )
113
+ } ) . start ( changeIndex ) ;
110
114
}
111
115
} ,
112
- [ onChangeIndex , selectedSegment , updateSelectedSegment ] ) ;
116
+ [ onChangeIndex , selectedSegment ] ) ;
113
117
114
118
const onLayout = useCallback ( ( index : number , event : LayoutChangeEvent ) => {
115
119
const { x, width, height} = event . nativeEvent . layout ;
@@ -125,12 +129,12 @@ const SegmentedControl = (props: SegmentedControlProps) => {
125
129
if ( segmentsCounter . current === segments ?. length ) {
126
130
const left = interpolate ( animatedValue . current , {
127
131
inputRange : _ . times ( segmentsCounter . current ) ,
128
- outputRange : _ . map ( segmentsStyle . current , segment => segment . x - BORDER_WIDTH )
132
+ outputRange : _ . map ( segmentsStyle . current , segment => segment . x )
129
133
} ) ;
130
134
131
135
const width = interpolate ( animatedValue . current , {
132
136
inputRange : _ . times ( segmentsCounter . current ) ,
133
- outputRange : _ . map ( segmentsStyle . current , segment => segment . width )
137
+ outputRange : _ . map ( segmentsStyle . current , segment => segment . width - 2 * BORDER_WIDTH )
134
138
} ) ;
135
139
136
140
return { width, left} ;
0 commit comments