Skip to content

Commit 5036ff8

Browse files
chore: handle slider value changes
1 parent 87bad13 commit 5036ff8

File tree

3 files changed

+37
-17
lines changed

3 files changed

+37
-17
lines changed

src/sliders/slider /Slider.component.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ export interface SliderProps extends ViewProps {
1818
value?: number;
1919
step?: number;
2020
centered?: boolean;
21+
damping?: number;
22+
23+
valueHeight?: number;
24+
thumbWidthActive?: number;
25+
thumbWidthInactive?: number;
2126

2227
thumbStyle?: StyleProp<ViewStyle>;
2328
valueStyle?: StyleProp<TextStyle>;
@@ -38,6 +43,7 @@ export const Slider: React.FC<SliderProps> = ({
3843

3944
step,
4045
value = 0,
46+
damping = 20,
4147
centered = false,
4248

4349
thumbStyle,
@@ -48,6 +54,10 @@ export const Slider: React.FC<SliderProps> = ({
4854
filledTrackStyle,
4955
remainingTrackStyle,
5056

57+
valueHeight,
58+
thumbWidthActive,
59+
thumbWidthInactive,
60+
5161
onChangeValue,
5262
onLayout,
5363
style,
@@ -65,7 +75,7 @@ export const Slider: React.FC<SliderProps> = ({
6575
remainingTrackAnimatedStyle,
6676
slideToTrackPoint,
6777
setUpSliderLayout,
68-
} = useSlider({max, min, step}, value, onChangeValue);
78+
} = useSlider({max, min, step, damping}, value, onChangeValue);
6979

7080
const trackPointsJustifyContent = trackPoints.length > 1 ? 'space-between' : 'flex-end';
7181

@@ -105,6 +115,9 @@ export const Slider: React.FC<SliderProps> = ({
105115
style={[styles.thumb, indicatorStyle]}
106116
thumbStyle={thumbStyle}
107117
valueStyle={valueStyle}
118+
valueHeight={valueHeight}
119+
thumbWidthActive={thumbWidthActive}
120+
thumbWidthInactive={thumbWidthInactive}
108121
/>
109122
<SliderTrack
110123
style={[{backgroundColor: secondaryContainer.background}, styles.remainingTrack, remainingTrackAnimatedStyle, remainingTrackStyle]}

src/sliders/slider /useSlider.hook.ts

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
import {useState} from 'react';
1+
import {useEffect, useState} from 'react';
22
import {Gesture} from 'react-native-gesture-handler';
33
import {interpolate, runOnJS, useAnimatedProps, useAnimatedStyle, useSharedValue, withSpring, withTiming} from 'react-native-reanimated';
44

5-
import {type SliderConfig} from './slider-config.type';
5+
import {type SliderConfig} from '../slider-config.type';
6+
import {normalize} from '../worklets/normalize.worklet';
7+
import {calcTranslationXBasedOnValue} from '../worklets/calc-translationX-based-on-value.worklet';
68

7-
export const useSlider = ({max, min, step}: SliderConfig, value: number, onChangeValue?: (value: number) => void) => {
9+
export const useSlider = ({max, min, step, damping}: SliderConfig, value: number, onChangeValue?: (value: number) => void) => {
810
const [sliderWidth, setSliderWith] = useState(0);
911

1012
const sliding = useSharedValue(0);
@@ -15,30 +17,35 @@ export const useSlider = ({max, min, step}: SliderConfig, value: number, onChang
1517
const filledTrackAnimatedStyle = useAnimatedStyle(() => ({flex: interpolate(thumbTranslationX.value, [0, sliderWidth], [0, 1])}), [sliderWidth]);
1618
const remainingTrackAnimatedStyle = useAnimatedStyle(() => ({flex: interpolate(thumbTranslationX.value, [0, sliderWidth], [1, 0])}), [sliderWidth]);
1719

20+
useEffect(() => {
21+
adjustThumbsPosition(sliderWidth, true);
22+
}, [value, sliderWidth]);
23+
1824
const calcValueBasedOnThumbTranslationX = (translationX: number) => {
1925
'worklet';
2026

2127
const valueBaseOnThumbTranslateX = Math.round(interpolate(translationX, [0, sliderWidth], [min, max]));
22-
const roundedValue = step ? Math.round(valueBaseOnThumbTranslateX / step) * step : valueBaseOnThumbTranslateX;
28+
const normalizedValue = normalize(valueBaseOnThumbTranslateX, step);
2329

24-
selectedValue.value = roundedValue;
30+
selectedValue.value = normalizedValue;
2531

26-
return roundedValue;
32+
return normalizedValue;
2733
};
2834

2935
const gesture = Gesture.Pan()
3036
.onStart(() => {
3137
sliding.value = withTiming(1);
3238
})
3339
.onUpdate((e) => {
40+
const currentTranslationX = Math.max(0, Math.min(Math.round(thumbTranslationXContext.value + e.translationX), sliderWidth));
41+
3442
if (step) {
3543
const stepSize = (sliderWidth / (max - min)) * step;
36-
const currentTranslationX = Math.max(0, Math.min(Math.round(thumbTranslationXContext.value + e.translationX), sliderWidth));
37-
const stepSnap = Math.round(currentTranslationX / stepSize) * stepSize;
44+
const stepSnap = normalize(currentTranslationX, stepSize);
3845

3946
thumbTranslationX.value = stepSnap;
4047
} else {
41-
thumbTranslationX.value = Math.max(0, Math.min(Math.round(thumbTranslationXContext.value + e.translationX), sliderWidth));
48+
thumbTranslationX.value = currentTranslationX;
4249
}
4350
})
4451
.onEnd(() => {
@@ -52,22 +59,22 @@ export const useSlider = ({max, min, step}: SliderConfig, value: number, onChang
5259
});
5360

5461
const setUpSliderLayout = (width: number) => {
55-
initializeThumbPosition(width);
62+
adjustThumbsPosition(width);
5663
setSliderWith(width);
5764
};
5865

59-
const initializeThumbPosition = (width: number) => {
60-
const initialTthumbTranslationX = ((value - min) / (max - min)) * width;
66+
const adjustThumbsPosition = (width: number, isUpdaing: boolean = false) => {
67+
const initialTthumbTranslationX = calcTranslationXBasedOnValue({min, max}, normalize(value, step), width);
6168

62-
thumbTranslationX.value = initialTthumbTranslationX;
69+
thumbTranslationX.value = isUpdaing ? withSpring(initialTthumbTranslationX, {damping}) : initialTthumbTranslationX;
6370
thumbTranslationXContext.value = initialTthumbTranslationX;
6471
};
6572

6673
const slideToTrackPoint = (pointValue: number) => {
67-
const thumbPointValueTranslationX = ((pointValue - min) / (max - min)) * sliderWidth;
74+
const thumbPointValueTranslationX = calcTranslationXBasedOnValue({min, max}, pointValue, sliderWidth);
6875

6976
sliding.value = withTiming(1);
70-
thumbTranslationX.value = withSpring(thumbPointValueTranslationX, {damping: 20}, () => {
77+
thumbTranslationX.value = withSpring(thumbPointValueTranslationX, {damping}, () => {
7178
sliding.value = withTiming(0);
7279
thumbTranslationXContext.value = thumbPointValueTranslationX;
7380

src/sliders/slider /useSliderTrackPoints.hook.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {type SliderConfig} from './slider-config.type';
1+
import {type SliderConfig} from '../slider-config.type';
22

33
export const useSliderTrackPoints = ({max, min, step, centered}: SliderConfig) => {
44
const getDiscreteSliderTrackPoints = (discreteStep: number) => {

0 commit comments

Comments
 (0)