-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Expand file tree
/
Copy pathSlider.tsx
More file actions
94 lines (85 loc) · 2.8 KB
/
Slider.tsx
File metadata and controls
94 lines (85 loc) · 2.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import {omit} from 'ramda';
import React, {lazy, Suspense, useCallback, useMemo} from 'react';
import {
PersistedProps,
PersistenceTypes,
RangeSliderProps,
SliderProps,
} from '../types';
import rangeSlider from '../utils/LazyLoader/rangeSlider';
import './css/sliders.css';
const RealSlider = lazy(rangeSlider);
/**
* A slider component with a single handle.
*/
export default function Slider({
updatemode = 'mouseup',
// eslint-disable-next-line @typescript-eslint/no-unused-vars
persisted_props = [PersistedProps.value],
// eslint-disable-next-line @typescript-eslint/no-unused-vars
persistence_type = PersistenceTypes.local,
// eslint-disable-next-line no-magic-numbers
verticalHeight = 400,
step = undefined,
allow_direct_input = true,
setProps,
value,
drag_value,
...props
}: SliderProps) {
// This is actually a wrapper around a RangeSlider.
// We'll modify key `Slider` props to be compatible with a Range Slider.
// Some considerations for the default value of `step`:
// If the range consists of integers, default to a value of `1`
// Otherwise, leave it undefined
if (
typeof step === 'undefined' &&
Number.isInteger(props.min) &&
Number.isInteger(props.max)
) {
step = 1;
}
const mappedValue: RangeSliderProps['value'] = useMemo(() => {
return typeof value === 'number' ? [value] : value;
}, [value]);
const mappedDragValue: RangeSliderProps['drag_value'] = useMemo(() => {
return typeof drag_value === 'number' ? [drag_value] : drag_value;
}, [drag_value]);
const mappedSetProps: RangeSliderProps['setProps'] = useCallback(
newProps => {
const {value, drag_value} = newProps;
const mappedProps: Partial<SliderProps> = omit(
['value', 'drag_value', 'setProps'],
newProps
);
if ('value' in newProps) {
mappedProps.value = value ? value[0] : value;
}
if ('drag_value' in newProps) {
mappedProps.drag_value = drag_value
? drag_value[0]
: drag_value;
}
setProps(mappedProps);
},
[setProps]
);
return (
<Suspense fallback={null}>
<RealSlider
updatemode={updatemode}
verticalHeight={verticalHeight}
step={step}
allow_direct_input={allow_direct_input}
value={mappedValue}
drag_value={mappedDragValue}
setProps={mappedSetProps}
{...props}
/>
</Suspense>
);
}
Slider.dashPersistence = {
persisted_props: [PersistedProps.value],
persistence_type: PersistenceTypes.local,
};