11import { available , flattenStyles , toNumber , unavailable } from "@mendix/piw-native-utils-internal" ;
2- import MultiSlider , { MarkerProps } from "@ptomasroos /react-native-multi -slider" ;
3- import { ReactElement , useCallback , useRef , useState , JSX } from "react" ;
4- import { LayoutChangeEvent , Text , View } from "react-native" ;
2+ import { Slider } from "@miblanchard /react-native-slider" ;
3+ import { ReactElement , useCallback , useRef } from "react" ;
4+ import { Text , View } from "react-native" ;
55import { Big } from "big.js" ;
66
77import { RangeSliderProps } from "../typings/RangeSliderProps" ;
8- import { Marker } from "./Marker" ;
98import { defaultRangeSliderStyle , RangeSliderStyle } from "./ui/Styles" ;
109import { executeAction } from "@mendix/piw-utils-internal" ;
1110
1211export type Props = RangeSliderProps < RangeSliderStyle > ;
1312
1413export function RangeSlider ( props : Props ) : ReactElement {
15- const [ width , setWidth ] = useState < number > ( ) ;
1614 const styles = flattenStyles ( defaultRangeSliderStyle , props . style ) ;
1715
1816 const lastLowerValue = useRef < number | undefined > ( toNumber ( props . lowerValueAttribute ) ) ;
@@ -23,27 +21,13 @@ export function RangeSlider(props: Props): ReactElement {
2321 const validationMessages = validate ( props ) ;
2422 const validProps = validationMessages . length === 0 ;
2523 const editable = props . editable !== "never" && validProps ;
26- const enabledOne = editable && lowerValue !== undefined && ! props . lowerValueAttribute . readOnly ;
27- const enabledTwo = editable && upperValue !== undefined && ! props . upperValueAttribute . readOnly ;
24+ const enabledLower = editable && lowerValue !== undefined && ! props . lowerValueAttribute . readOnly ;
25+ const enabledUpper = editable && upperValue !== undefined && ! props . upperValueAttribute . readOnly ;
26+ const isEnabled = enabledLower || enabledUpper ;
2827
29- const customMarker =
30- ( markerEnabled : boolean , testID : string ) =>
31- ( markerProps : MarkerProps ) : JSX . Element =>
32- (
33- < Marker
34- { ...markerProps }
35- markerStyle = { markerEnabled ? markerProps . markerStyle : styles . markerDisabled }
36- testID = { `${ props . name } $${ testID } ` }
37- />
38- ) ;
39-
40- const onLayout = useCallback ( ( event : LayoutChangeEvent ) : void => {
41- setWidth ( event . nativeEvent . layout . width ) ;
42- } , [ ] ) ;
43-
44- const onSlide = useCallback (
28+ const onValueChange = useCallback (
4529 ( values : number [ ] ) : void => {
46- if ( values [ 0 ] === null || values [ 1 ] = == null ) {
30+ if ( values [ 0 ] == null || values [ 1 ] == null ) {
4731 return ;
4832 }
4933 props . lowerValueAttribute . setValue ( new Big ( values [ 0 ] ) ) ;
@@ -52,11 +36,11 @@ export function RangeSlider(props: Props): ReactElement {
5236 [ props . lowerValueAttribute , props . upperValueAttribute ]
5337 ) ;
5438
55- const onChange = useCallback (
39+ const onSlidingComplete = useCallback (
5640 ( values : number [ ] ) : void => {
5741 if (
58- values [ 0 ] === null ||
59- values [ 1 ] === null ||
42+ values [ 0 ] == null ||
43+ values [ 1 ] == null ||
6044 ( lastLowerValue . current === values [ 0 ] && lastUpperValue . current === values [ 1 ] )
6145 ) {
6246 return ;
@@ -73,24 +57,19 @@ export function RangeSlider(props: Props): ReactElement {
7357 ) ;
7458
7559 return (
76- < View onLayout = { onLayout } style = { styles . container } testID = { props . name } >
77- < MultiSlider
78- values = { lowerValue != null && upperValue != null ? [ lowerValue , upperValue ] : undefined }
79- min = { validProps ? toNumber ( props . minimumValue ) : undefined }
80- max = { validProps ? toNumber ( props . maximumValue ) : undefined }
81- step = { validProps ? toNumber ( props . stepSize ) : undefined }
82- enabledOne = { enabledOne }
83- enabledTwo = { enabledTwo }
84- markerStyle = { styles . marker }
85- trackStyle = { enabledOne || enabledTwo ? styles . track : styles . trackDisabled }
86- selectedStyle = { enabledOne || enabledTwo ? styles . highlight : styles . highlightDisabled }
87- pressedMarkerStyle = { styles . markerActive }
88- onValuesChange = { onSlide }
89- onValuesChangeFinish = { onChange }
90- sliderLength = { width }
91- isMarkersSeparated
92- customMarkerLeft = { customMarker ( enabledOne , "leftMarker" ) }
93- customMarkerRight = { customMarker ( enabledTwo , "rightMarker" ) }
60+ < View style = { styles . container } testID = { props . name } >
61+ < Slider
62+ value = { lowerValue != null && upperValue != null ? [ lowerValue , upperValue ] : [ 0 , 100 ] }
63+ minimumValue = { validProps ? toNumber ( props . minimumValue ) ?? 0 : 0 }
64+ maximumValue = { validProps ? toNumber ( props . maximumValue ) ?? 100 : 100 }
65+ step = { validProps ? toNumber ( props . stepSize ) ?? 1 : 1 }
66+ disabled = { ! isEnabled }
67+ trackStyle = { isEnabled ? styles . track : styles . trackDisabled }
68+ minimumTrackStyle = { isEnabled ? styles . highlight : styles . highlightDisabled }
69+ maximumTrackStyle = { isEnabled ? styles . track : styles . tracktDisabled }
70+ thumbStyle = { isEnabled ? styles . marker : styles . markerDisabled }
71+ onValueChange = { onValueChange }
72+ onSlidingComplete = { onSlidingComplete }
9473 />
9574 { props . lowerValueAttribute . validation && (
9675 < Text style = { styles . validationMessage } > { props . lowerValueAttribute . validation } </ Text >
0 commit comments