react-native-lucy-radial-slider
Version:
React Native component to select or highlight a specific value from a range of values
84 lines • 3.4 kB
JavaScript
import React, { useEffect, useMemo } from 'react';
import { createRange, getExtraSize, polarToCartesian, } from '../../../utils/commonHelpers';
import Constants from '../../../constants';
const useRadialSlider = (props) => {
const { radius = 100, sliderWidth = 18, openingRadian = Math.PI / 3, thumbRadius = 18, thumbBorderWidth = 5, min = 0, max = 200, variant = 'default', step = 1, startAngle = 270, } = props;
const centerValue = Math.round((max - min) / 2);
//For default variant in radial slider
const isRadialSliderVariant = variant === Constants.radialSlider;
//For radial-circle-slider variant
const isRadialCircleVariant = variant === Constants.radialCircleSlider;
//For speedometer-marker variant
const isMarkerVariant = variant === Constants.speedoMeterMarker;
//For speedometer variant
const isSpeedoMeterVariant = variant === Constants.speedometer;
const radianValue = isRadialCircleVariant ? 0.057 : openingRadian;
useEffect(() => {
if (isMarkerVariant)
if (min < 0) {
throw 'Negative number is not allowed';
}
else if (max < 0) {
throw 'Negative number is not allowed';
}
if (max < min) {
throw 'max value should be greater than min';
}
}, [isMarkerVariant, max, min]);
const angle = (radianValue * 180.0) / Math.PI;
const addRadialCircleCount = isRadialCircleVariant ? 6 : 0;
const lineCount = (360 - angle * 2 + addRadialCircleCount);
const lines = createRange(min, lineCount + min, 1);
const svgSize = radius * 2 + getExtraSize(sliderWidth, thumbRadius, thumbBorderWidth);
const containerRef = React.createRef();
const lineHeight = getExtraSize(sliderWidth, thumbRadius, thumbBorderWidth) / 2 +
thumbBorderWidth;
const startRadian = 2 * Math.PI - radianValue;
const startPoint = polarToCartesian(startRadian, radius, sliderWidth, thumbRadius, thumbBorderWidth, startAngle, variant);
const endPoint = polarToCartesian(radianValue, radius, sliderWidth, thumbRadius, thumbBorderWidth, startAngle, variant);
const marks = useMemo(() => {
if (isMarkerVariant) {
const stepsLength = Math.round((max - min) / step);
return [...Array(stepsLength + 1)].map((_val, index) => {
const isEven = index % 2 === 0;
return {
isEven,
value: Math.round(index * step),
};
});
}
else {
const array = [];
for (let i = 0; i <= max; i++) {
array.push(i);
}
return array.map((index) => {
const isEven = index % 2 === 0;
return {
isEven,
value: Math.round(index * step),
};
});
}
}, [isMarkerVariant, max, min, step]);
return {
angle,
lineCount,
lines,
svgSize,
containerRef,
lineHeight,
startPoint,
endPoint,
startRadian,
radianValue,
isMarkerVariant,
marks,
isRadialCircleVariant,
centerValue,
isRadialSliderVariant,
isSpeedoMeterVariant,
};
};
export default useRadialSlider;
//# sourceMappingURL=useRadialSlider.js.map