Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(js-ts): Convert app/components/UI/SlippageSlider/index.js to TypeScript #11816

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -126,9 +126,7 @@ exports[`SlippageSlider should render correctly 1`] = `
resizeMode="stretch"
source={
{
"default": {
"uri": "MockImage",
},
"uri": "MockImage",
}
}
style={
Expand Down Expand Up @@ -183,7 +181,7 @@ exports[`SlippageSlider should render correctly 1`] = `
}
}
>
undefined%
0%
</Text>
</ForwardRef>
<ForwardRef
Expand Down
3 changes: 1 addition & 2 deletions app/components/UI/SlippageSlider/index.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@ describe('SlippageSlider', () => {
range={[1, 5]}
increment={1}
onChange={() => undefined}
formatTooltipText={(text) => `${text}%`}
/>,
formatTooltipText={(text) => `${text}%`} value={0} />,
);
expect(wrapper).toMatchSnapshot();
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,16 @@ import {
StyleSheet,
Text,
Image,
GestureResponderEvent,
PanResponderGestureState,
} from 'react-native';
import PropTypes from 'prop-types';
import { fontStyles } from '../../../styles/common';
import { useTheme } from '../../../util/theme';
import Svg, { Path } from 'react-native-svg';

/* eslint-disable import/no-commonjs */
const SlippageSliderBgImg = require('../../../images/slippage-slider-bg.png');
import SlippageSliderBgImg from '../../../images/slippage-slider-bg.png';
import { Colors, Shadows } from 'app/util/theme/models';
/* eslint-enable import/no-commonjs */

const DIAMETER = 30;
Expand All @@ -29,7 +31,7 @@ const TOOLTIP_HEIGHT = 36;
const TOOLTIP_WIDTH = 40;
const COMPONENT_HEIGHT = DIAMETER + TOOLTIP_HEIGHT + 10;

const createStyles = (colors, shadows) =>
const createStyles = (colors: Colors, shadows: Shadows) =>
StyleSheet.create({
root: {
position: 'relative',
Expand Down Expand Up @@ -97,10 +99,10 @@ const createStyles = (colors, shadows) =>
},
});

const setAnimatedValue = (animatedValue, value) =>
const setAnimatedValue = (animatedValue: Animated.Value, value: number) =>
animatedValue.setValue(value);

const SlippageSlider = ({
const SlippageSlider: React.FC<SlippageSliderProps> = ({
range,
increment,
onChange,
Expand Down Expand Up @@ -128,7 +130,7 @@ const SlippageSlider = ({
const [temporaryValue, setTemporaryValue] = useState(value);

/* Pan and slider position
/* Pan will handle the gesture and update slider */
/* Pan will handle the gesture and update slider */
const pan = useRef(new Animated.Value(0)).current;
const slider = useRef(new Animated.Value(0)).current;
const sliderPosition = slider.interpolate({
Expand Down Expand Up @@ -171,45 +173,55 @@ const SlippageSlider = ({
onMoveShouldSetPanResponder: () => !disabled,
onPanResponderGrant: () => {
setIsResponderGranted(true);
pan.setOffset(pan._value);
pan.extractOffset();
},
/**
* When the slider is being dragged, this handler will figure out which tick
* it should snap to
*/
onPanResponderMove: (ev, gestureState) => {
onPanResponderMove: (
_: GestureResponderEvent,
gestureState: PanResponderGestureState,
) => {
pan.setValue(gestureState.dx);
const relativeValue = pan
.interpolate({
inputRange: [0, trackWidth],
outputRange: [0, trackWidth],
extrapolate: 'clamp',
})
.__getValue();

const [sliderValue, newValue] = getValuesByProgress(
relativeValue / trackWidth,
);
if (!changeOnRelease) {
onChange(newValue);
} else {
setTemporaryValue(newValue);
}
const relativeValue = Animated.add(
pan,
new Animated.Value(0),
).interpolate({
inputRange: [0, trackWidth],
outputRange: [0, trackWidth],
extrapolate: 'clamp',
});

setAnimatedValue(slider, sliderValue);
relativeValue.addListener((currentValue) => {
const [sliderValue, newValue] = getValuesByProgress(
currentValue.value / trackWidth,
);
slider.setValue(sliderValue);
setTemporaryValue(newValue);
if (!changeOnRelease && onChange) {
onChange(newValue);
}
});
},
onPanResponderRelease: () => {
pan.flattenOffset();
const relativeValue = Math.min(Math.max(0, pan._value), trackWidth);
pan.setValue(relativeValue);
if (changeOnRelease && onChange) {
const progress = relativeValue / trackWidth;
const [, newValue] = getValuesByProgress(progress);
onChange(newValue);
}
setIsResponderGranted(false);
pan.addListener((panValue) => {
const relativeValue = Math.min(
Math.max(0, panValue.value),
trackWidth,
);
pan.setValue(relativeValue);
if (changeOnRelease && onChange) {
const progress = relativeValue / trackWidth;
const [, newValue] = getValuesByProgress(progress);
onChange(newValue);
}
});
},
}),

[
changeOnRelease,
disabled,
Expand All @@ -235,7 +247,7 @@ const SlippageSlider = ({
onLayout={(e) => setTrackWidth(e.nativeEvent.layout.width)}
>
<View style={styles.trackBack}>
{new Array(ticksLength + 1).fill().map((_, i) => (
{new Array(ticksLength + 1).fill(undefined).map((_, i) => (
<View key={i} style={styles.tick} />
))}
</View>
Expand Down Expand Up @@ -290,35 +302,35 @@ const SlippageSlider = ({
);
};

SlippageSlider.propTypes = {
interface SlippageSliderProps {
/**
* Range of the slider
*/
range: PropTypes.arrayOf(PropTypes.number),
range: number[];
/**
* The increments between the range that are selectable
*/
increment: PropTypes.number,
increment: number;
/**
* Value for the slider
*/
value: PropTypes.number,
value: number;
/**
* Action to execute when value changes
*/
onChange: PropTypes.func,
onChange: (value: number) => void;
/**
* Function to format/compose the text in the tooltip
* Value that decides whether or not the slider is disabled
*/
formatTooltipText: PropTypes.func,
formatTooltipText: (value: number) => number | string | undefined;
/**
* Value that decides whether or not the slider is disabled
*/
disabled: PropTypes.bool,
disabled?: boolean;
/**
* Wether to call onChange only on gesture release
*/
changeOnRelease: PropTypes.bool,
};
changeOnRelease?: boolean;
}

export default SlippageSlider;
Loading