{"mappings":"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","sources":["packages/react-stately/src/slider/useSliderState.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {clamp, snapValueToStep} from '../utils/number';\n\nimport {LabelableProps, Orientation, RangeInputBase, ValueBase} from '@react-types/shared';\nimport {useCallback, useMemo, useRef, useState} from 'react';\nimport {useControlledState} from '../utils/useControlledState';\n\nexport interface SliderProps<T = number | number[]> extends RangeInputBase<number>, ValueBase<T>, LabelableProps {\n  /**\n   * The orientation of the Slider.\n   * @default 'horizontal'\n   */\n  orientation?: Orientation,\n  /** Whether the whole Slider is disabled. */\n  isDisabled?: boolean,\n  /** Fired when the slider stops moving, due to being let go. */\n  onChangeEnd?: (value: T) => void,\n  // These are duplicated from ValueBase to define defaults for the docs.\n  /**\n   * The slider's minimum value.\n   * @default 0\n   */\n  minValue?: number,\n  /**\n   * The slider's maximum value.\n   * @default 100\n   */\n  maxValue?: number,\n  /**\n   * The slider's step value.\n   * @default 1\n   */\n  step?: number\n}\n\nexport interface SliderState {\n  /**\n   * Values managed by the slider by thumb index.\n   */\n  readonly values: number[],\n  /**\n   * The default values for each thumb.\n   */\n  readonly defaultValues: number[],\n  /**\n   * Get the value for the specified thumb.\n   * @param index\n   */\n  getThumbValue(index: number): number,\n\n  /**\n   * Sets the value for the specified thumb.\n   * The actual value set will be clamped and rounded according to min/max/step.\n   * @param index\n   * @param value\n   */\n  setThumbValue(index: number, value: number): void,\n\n  /**\n   * Sets value for the specified thumb by percent offset (between 0 and 1).\n   * @param index\n   * @param percent\n   */\n  setThumbPercent(index: number, percent: number): void,\n\n  /**\n   * Whether the specific thumb is being dragged.\n   * @param index\n   */\n  isThumbDragging(index: number): boolean,\n  /**\n   * Set is dragging on the specified thumb.\n   * @param index\n   * @param dragging\n   */\n  setThumbDragging(index: number, dragging: boolean): void,\n\n  /**\n   * Currently-focused thumb index.\n   */\n  readonly focusedThumb: number | undefined,\n  /**\n   * Set focused true on specified thumb. This will remove focus from\n   * any thumb that had it before.\n   * @param index\n   */\n  setFocusedThumb(index: number | undefined): void,\n\n  /**\n   * Returns the specified thumb's value as a percentage from 0 to 1.\n   * @param index\n   */\n  getThumbPercent(index: number): number,\n\n  /**\n   * Returns the value as a percent between the min and max of the slider.\n   * @param index\n   */\n  getValuePercent(value: number): number,\n\n  /**\n   * Returns the string label for the specified thumb's value, per props.formatOptions.\n   * @param index\n   */\n  getThumbValueLabel(index: number): string,\n\n  /**\n   * Returns the string label for the value, per props.formatOptions.\n   * @param index\n   */\n  getFormattedValue(value: number): string,\n\n  /**\n   * Returns the min allowed value for the specified thumb.\n   * @param index\n   */\n  getThumbMinValue(index: number): number,\n\n  /**\n   * Returns the max allowed value for the specified thumb.\n   * @param index\n   */\n  getThumbMaxValue(index: number): number,\n\n  /**\n   * Converts a percent along track (between 0 and 1) to the corresponding value.\n   * @param percent\n   */\n  getPercentValue(percent: number): number,\n\n  /**\n   * Returns if the specified thumb is editable.\n   * @param index\n   */\n  isThumbEditable(index: number): boolean,\n\n  /**\n   * Set the specified thumb's editable state.\n   * @param index\n   * @param editable\n   */\n  setThumbEditable(index: number, editable: boolean): void,\n\n  /**\n   * Increments the value of the thumb by the step or page amount.\n   */\n  incrementThumb(index: number, stepSize?: number): void,\n  /**\n   * Decrements the value of the thumb by the step or page amount.\n   */\n  decrementThumb(index: number, stepSize?: number): void,\n\n  /**\n   * The step amount for the slider.\n   */\n  readonly step: number,\n\n  /**\n   * The page size for the slider, used to do a bigger step.\n   */\n  readonly pageSize: number,\n\n  /** The orientation of the slider. */\n  readonly orientation: Orientation,\n\n  /** Whether the slider is disabled. */\n  readonly isDisabled: boolean\n}\n\nconst DEFAULT_MIN_VALUE = 0;\nconst DEFAULT_MAX_VALUE = 100;\nconst DEFAULT_STEP_VALUE = 1;\n\nexport interface SliderStateOptions<T> extends SliderProps<T> {\n  numberFormatter: Intl.NumberFormat\n}\n\n/**\n * Provides state management for a slider component. Stores values for all thumbs,\n * formats values for localization, and provides methods to update the position\n * of any thumbs.\n * @param props\n */\nexport function useSliderState<T extends number | number[]>(props: SliderStateOptions<T>): SliderState {\n  const {\n    isDisabled = false,\n    minValue = DEFAULT_MIN_VALUE,\n    maxValue = DEFAULT_MAX_VALUE,\n    numberFormatter: formatter,\n    step = DEFAULT_STEP_VALUE,\n    orientation = 'horizontal'\n  } = props;\n\n  // Page step should be at least equal to step and always a multiple of the step.\n  let pageSize = useMemo(() => {\n    let calcPageSize = (maxValue - minValue) / 10;\n    calcPageSize = snapValueToStep(calcPageSize, 0, calcPageSize + step, step);\n    return Math.max(calcPageSize, step);\n  }, [step, maxValue, minValue]);\n\n  let restrictValues = useCallback((values: number[] | undefined) => values?.map((val, idx) => {\n    let min = idx === 0 ? minValue : values[idx - 1];\n    let max = idx === values.length - 1 ? maxValue : values[idx + 1];\n    return snapValueToStep(val, min, max, step);\n  }), [minValue, maxValue, step]);\n\n  let value = useMemo(() => restrictValues(convertValue(props.value)), [props.value, restrictValues]);\n  let defaultValue = useMemo(() => restrictValues(convertValue(props.defaultValue) ?? [minValue])!, [props.defaultValue, minValue, restrictValues]);\n  let onChange = createOnChange(props.value, props.defaultValue, props.onChange);\n  let onChangeEnd = createOnChange(props.value, props.defaultValue, props.onChangeEnd);\n\n  const [values, setValuesState] = useControlledState<number[]>(\n    value,\n    defaultValue,\n    onChange\n  );\n  let [initialValues] = useState(values);\n  const [isDraggings, setDraggingsState] = useState<boolean[]>(new Array(values.length).fill(false));\n  const isEditablesRef = useRef<boolean[]>(new Array(values.length).fill(true));\n  const [focusedIndex, setFocusedIndex] = useState<number | undefined>(undefined);\n\n  const valuesRef = useRef<number[]>(values);\n  const isDraggingsRef = useRef<boolean[]>(isDraggings);\n\n  let setValues = (values: number[]) => {\n    valuesRef.current = values;\n    setValuesState(values);\n  };\n\n  let setDraggings = (draggings: boolean[]) => {\n    isDraggingsRef.current = draggings;\n    setDraggingsState(draggings);\n  };\n\n  function getValuePercent(value: number) {\n    return (value - minValue) / (maxValue - minValue);\n  }\n\n  function getThumbMinValue(index: number) {\n    return index === 0 ? minValue : values[index - 1];\n  }\n  function getThumbMaxValue(index: number) {\n    return index === values.length - 1 ? maxValue : values[index + 1];\n  }\n\n  function isThumbEditable(index: number) {\n    return isEditablesRef.current[index];\n  }\n\n  function setThumbEditable(index: number, editable: boolean) {\n    isEditablesRef.current[index] = editable;\n  }\n\n  function updateValue(index: number, value: number) {\n    if (isDisabled || !isThumbEditable(index)) {\n      return;\n    }\n    const thisMin = getThumbMinValue(index);\n    const thisMax = getThumbMaxValue(index);\n\n    // Round value to multiple of step, clamp value between min and max\n    value = snapValueToStep(value, thisMin, thisMax, step);\n    let newValues = replaceIndex(valuesRef.current, index, value);\n    setValues(newValues);\n  }\n\n  function updateDragging(index: number, dragging: boolean) {\n    if (isDisabled || !isThumbEditable(index)) {\n      return;\n    }\n    if (dragging) {\n      valuesRef.current = values;\n    }\n\n    const wasDragging = isDraggingsRef.current[index];\n    isDraggingsRef.current = replaceIndex(isDraggingsRef.current, index, dragging);\n    setDraggings(isDraggingsRef.current);\n\n    // Call onChangeEnd if no handles are dragging.\n    if (onChangeEnd && wasDragging && !isDraggingsRef.current.some(Boolean)) {\n      onChangeEnd(valuesRef.current);\n    }\n  }\n\n  function getFormattedValue(value: number) {\n    return formatter.format(value);\n  }\n\n  function setThumbPercent(index: number, percent: number) {\n    updateValue(index, getPercentValue(percent));\n  }\n\n  function getRoundedValue(value: number) {\n    return Math.round((value - minValue) / step) * step + minValue;\n  }\n\n  function getPercentValue(percent: number) {\n    const val = percent * (maxValue - minValue) + minValue;\n    return clamp(getRoundedValue(val), minValue, maxValue);\n  }\n\n  function incrementThumb(index: number, stepSize: number = 1) {\n    let s = Math.max(stepSize, step);\n    updateValue(index, snapValueToStep(values[index] + s, minValue, maxValue, step));\n  }\n\n  function decrementThumb(index: number, stepSize: number = 1) {\n    let s = Math.max(stepSize, step);\n    updateValue(index, snapValueToStep(values[index] - s, minValue, maxValue, step));\n  }\n\n  return {\n    values: values,\n    defaultValues: props.defaultValue !== undefined ? defaultValue : initialValues,\n    getThumbValue: (index: number) => values[index],\n    setThumbValue: updateValue,\n    setThumbPercent,\n    isThumbDragging: (index: number) => isDraggings[index],\n    setThumbDragging: updateDragging,\n    focusedThumb: focusedIndex,\n    setFocusedThumb: setFocusedIndex,\n    getThumbPercent: (index: number) => getValuePercent(values[index]),\n    getValuePercent,\n    getThumbValueLabel: (index: number) => getFormattedValue(values[index]),\n    getFormattedValue,\n    getThumbMinValue,\n    getThumbMaxValue,\n    getPercentValue,\n    isThumbEditable,\n    setThumbEditable,\n    incrementThumb,\n    decrementThumb,\n    step,\n    pageSize,\n    orientation,\n    isDisabled\n  };\n}\n\nfunction replaceIndex<T>(array: T[], index: number, value: T) {\n  if (array[index] === value) {\n    return array;\n  }\n\n  return [...array.slice(0, index), value, ...array.slice(index + 1)];\n}\n\nfunction convertValue(value?: number | number[]) {\n  if (value == null) {\n    return undefined;\n  }\n\n  return Array.isArray(value) ? value : [value];\n}\n\nfunction createOnChange(value, defaultValue, onChange) {\n  return (newValue: number[]) => {\n    if (typeof value === 'number' || typeof defaultValue === 'number') {\n      onChange?.(newValue[0]);\n    } else {\n      onChange?.(newValue);\n    }\n  };\n}\n"],"names":[],"version":3,"file":"useSliderState.cjs.map"}