{"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[]>\n  extends RangeInputBase<number>, ValueBase<T>, LabelableProps {\n  /**\n   * The orientation of the Slider.\n   *\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   *\n   * @default 0\n   */\n  minValue?: number;\n  /**\n   * The slider's maximum value.\n   *\n   * @default 100\n   */\n  maxValue?: number;\n  /**\n   * The slider's step value.\n   *\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   *\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   *\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   *\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   *\n   * @param index\n   */\n  isThumbDragging(index: number): boolean;\n  /**\n   * Set is dragging on the specified thumb.\n   *\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   *\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   *\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   *\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   *\n   * @param index\n   */\n  getThumbValueLabel(index: number): string;\n\n  /**\n   * Returns the string label for the value, per props.formatOptions.\n   *\n   * @param value\n   */\n  getFormattedValue(value?: number | number[]): string;\n\n  /**\n   * Returns the min allowed value for the specified thumb.\n   *\n   * @param index\n   */\n  getThumbMinValue(index: number): number;\n\n  /**\n   * Returns the max allowed value for the specified thumb.\n   *\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   *\n   * @param percent\n   */\n  getPercentValue(percent: number): number;\n\n  /**\n   * Returns if the specified thumb is editable.\n   *\n   * @param index\n   */\n  isThumbEditable(index: number): boolean;\n\n  /**\n   * Set the specified thumb's editable state.\n   *\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 *\n * @param props\n */\nexport function useSliderState<T extends number | number[]>(\n  props: SliderStateOptions<T>\n): 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(\n    (values: number[] | undefined) =>\n      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      }),\n    [minValue, maxValue, step]\n  );\n\n  let value = useMemo(\n    () => restrictValues(convertValue(props.value)),\n    [props.value, restrictValues]\n  );\n  let defaultValue = useMemo(\n    () => restrictValues(convertValue(props.defaultValue) ?? [minValue])!,\n    [props.defaultValue, minValue, restrictValues]\n  );\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[]>(value, defaultValue, onChange);\n  let [initialValues] = useState(values);\n  const [isDraggings, setDraggingsState] = useState<boolean[]>(\n    new Array(values.length).fill(false)\n  );\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  let listFormatRef = useRef<Intl.ListFormat | null>(null);\n\n  function getFormattedValue(valueParam: number | number[] = values) {\n    if (typeof valueParam === 'number') {\n      valueParam = [valueParam];\n    }\n\n    switch (valueParam.length) {\n      case 0:\n        return '';\n      case 1:\n        return formatter.format(valueParam[0]);\n      case 2:\n        return formatter.formatRange(valueParam[0], valueParam[1]);\n      default: {\n        let formatted = valueParam.map(value => formatter.format(value));\n        let listFormat = listFormatRef.current;\n        if (\n          !listFormat ||\n          listFormat.resolvedOptions().locale !== formatter.resolvedOptions().locale\n        ) {\n          listFormat = listFormatRef.current = new Intl.ListFormat(\n            formatter.resolvedOptions().locale,\n            {type: 'unit'}\n          );\n        }\n        return listFormat.format(formatted);\n      }\n    }\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"}