MCPcopy Create free account
hub / github.com/adobe/react-spectrum / useSliderState

Function useSliderState

packages/react-stately/src/slider/useSliderState.ts:216–407  ·  view source on GitHub ↗
(
  props: SliderStateOptions<T>
)

Source from the content-addressed store, hash-verified

214 * @param props
215 */
216export function useSliderState<T extends number | number[]>(
217 props: SliderStateOptions<T>
218): SliderState {
219 const {
220 isDisabled = false,
221 minValue = DEFAULT_MIN_VALUE,
222 maxValue = DEFAULT_MAX_VALUE,
223 numberFormatter: formatter,
224 step = DEFAULT_STEP_VALUE,
225 orientation = 'horizontal'
226 } = props;
227
228 // Page step should be at least equal to step and always a multiple of the step.
229 let pageSize = useMemo(() => {
230 let calcPageSize = (maxValue - minValue) / 10;
231 calcPageSize = snapValueToStep(calcPageSize, 0, calcPageSize + step, step);
232 return Math.max(calcPageSize, step);
233 }, [step, maxValue, minValue]);
234
235 let restrictValues = useCallback(
236 (values: number[] | undefined) =>
237 values?.map((val, idx) => {
238 let min = idx === 0 ? minValue : values[idx - 1];
239 let max = idx === values.length - 1 ? maxValue : values[idx + 1];
240 return snapValueToStep(val, min, max, step);
241 }),
242 [minValue, maxValue, step]
243 );
244
245 let value = useMemo(
246 () => restrictValues(convertValue(props.value)),
247 [props.value, restrictValues]
248 );
249 let defaultValue = useMemo(
250 () => restrictValues(convertValue(props.defaultValue) ?? [minValue])!,
251 [props.defaultValue, minValue, restrictValues]
252 );
253 let onChange = createOnChange(props.value, props.defaultValue, props.onChange);
254 let onChangeEnd = createOnChange(props.value, props.defaultValue, props.onChangeEnd);
255
256 const [values, setValuesState] = useControlledState<number[]>(value, defaultValue, onChange);
257 let [initialValues] = useState(values);
258 const [isDraggings, setDraggingsState] = useState<boolean[]>(
259 new Array(values.length).fill(false)
260 );
261 const isEditablesRef = useRef<boolean[]>(new Array(values.length).fill(true));
262 const [focusedIndex, setFocusedIndex] = useState<number | undefined>(undefined);
263
264 const valuesRef = useRef<number[]>(values);
265 const isDraggingsRef = useRef<boolean[]>(isDraggings);
266
267 let setValues = (values: number[]) => {
268 valuesRef.current = values;
269 setValuesState(values);
270 };
271
272 let setDraggings = (draggings: boolean[]) => {
273 isDraggingsRef.current = draggings;

Callers 12

renderUseSliderFunction · 0.90
ExampleFunction · 0.90
RangeExampleFunction · 0.90
ExampleFunction · 0.90
StoryRangeSliderFunction · 0.90
StorySliderFunction · 0.90
StoryMultiSliderFunction · 0.90
useColorSliderStateFunction · 0.90
Slider.tsxFile · 0.90
SliderBase.tsxFile · 0.90

Calls 6

snapValueToStepFunction · 0.90
useControlledStateFunction · 0.90
createOnChangeFunction · 0.85
getValuePercentFunction · 0.85
convertValueFunction · 0.70
getFormattedValueFunction · 0.70

Tested by 4

renderUseSliderFunction · 0.72
ExampleFunction · 0.72
RangeExampleFunction · 0.72
ExampleFunction · 0.72