@julo-ui/sliders
Version:
A React Slider component that implements input[type='range']
86 lines (83 loc) • 2.44 kB
JavaScript
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
};