UNPKG

@julo-ui/sliders

Version:

A React Slider component that implements input[type='range']

86 lines (83 loc) 2.44 kB
import { isMouseEvent, percentToValue, roundValueToStep } from "./chunk-Y2VS5NAR.mjs"; // src/slider/usecase/use-handle-pan-event.ts import { useCallback } from "react"; import { usePanEvent } from "@chakra-ui/react-use-pan-event"; import { _noop } from "@julo-ui/function-utils"; import { clampValue } from "@julo-ui/number-utils"; function useHandlePanEvent(options) { const { rootRef, onDraggingEnd, onDraggingStart, onFocusThumb, onChangeStart = _noop, onChangeEnd = _noop, sliderStates, trackRef, setComputedValue } = options; const getValueFromPointer = useCallback( (event) => { var _a; if (!trackRef.current) return; sliderStates.eventSource = "pointer"; const trackRect = trackRef.current.getBoundingClientRect(); const { clientX, clientY } = !isMouseEvent(event) ? (_a = event.touches) == null ? void 0 : _a[0] : event; const diff = sliderStates.isVertical ? trackRect.bottom - clientY : clientX - trackRect.left; const length = sliderStates.isVertical ? trackRect.height : trackRect.width; let percent = diff / length; if (sliderStates.isReversed) { percent = 1 - percent; } let nextValue = percentToValue( percent, sliderStates.min, sliderStates.max ); if (sliderStates.step) { nextValue = parseFloat( roundValueToStep(nextValue, sliderStates.min, sliderStates.step) ); } nextValue = clampValue(nextValue, sliderStates.min, sliderStates.max); return nextValue; }, [trackRef, sliderStates] ); function setValueFromPointer(event) { const nextValue = getValueFromPointer(event); if (nextValue != null && nextValue !== sliderStates.value) { setComputedValue(nextValue); } } usePanEvent(rootRef, { onPanSessionStart(event) { if (!sliderStates.isInteractive) return; onDraggingStart(); onFocusThumb(); setValueFromPointer(event); onChangeStart(sliderStates.value); }, onPanSessionEnd() { if (!sliderStates.isInteractive) return; onDraggingEnd(); onChangeEnd(sliderStates.value); }, onPan(event) { if (!sliderStates.isInteractive) return; setValueFromPointer(event); } }); } var use_handle_pan_event_default = useHandlePanEvent; export { use_handle_pan_event_default };