[d565449] | 1 | import { useEffect, useRef } from 'react';
|
---|
| 2 | import { isBrowser, noop, off, on } from './misc/util';
|
---|
| 3 | import useMountedState from './useMountedState';
|
---|
| 4 | import useSetState from './useSetState';
|
---|
| 5 | var useSlider = function (ref, options) {
|
---|
| 6 | if (options === void 0) { options = {}; }
|
---|
| 7 | var isMounted = useMountedState();
|
---|
| 8 | var isSliding = useRef(false);
|
---|
| 9 | var valueRef = useRef(0);
|
---|
| 10 | var frame = useRef(0);
|
---|
| 11 | var _a = useSetState({
|
---|
| 12 | isSliding: false,
|
---|
| 13 | value: 0,
|
---|
| 14 | }), state = _a[0], setState = _a[1];
|
---|
| 15 | valueRef.current = state.value;
|
---|
| 16 | useEffect(function () {
|
---|
| 17 | if (isBrowser) {
|
---|
| 18 | var styles = options.styles === undefined ? true : options.styles;
|
---|
| 19 | var reverse_1 = options.reverse === undefined ? false : options.reverse;
|
---|
| 20 | if (ref.current && styles) {
|
---|
| 21 | ref.current.style.userSelect = 'none';
|
---|
| 22 | }
|
---|
| 23 | var startScrubbing_1 = function () {
|
---|
| 24 | if (!isSliding.current && isMounted()) {
|
---|
| 25 | (options.onScrubStart || noop)();
|
---|
| 26 | isSliding.current = true;
|
---|
| 27 | setState({ isSliding: true });
|
---|
| 28 | bindEvents_1();
|
---|
| 29 | }
|
---|
| 30 | };
|
---|
| 31 | var stopScrubbing_1 = function () {
|
---|
| 32 | if (isSliding.current && isMounted()) {
|
---|
| 33 | (options.onScrubStop || noop)(valueRef.current);
|
---|
| 34 | isSliding.current = false;
|
---|
| 35 | setState({ isSliding: false });
|
---|
| 36 | unbindEvents_1();
|
---|
| 37 | }
|
---|
| 38 | };
|
---|
| 39 | var onMouseDown_1 = function (event) {
|
---|
| 40 | startScrubbing_1();
|
---|
| 41 | onMouseMove_1(event);
|
---|
| 42 | };
|
---|
| 43 | var onMouseMove_1 = options.vertical
|
---|
| 44 | ? function (event) { return onScrub_1(event.clientY); }
|
---|
| 45 | : function (event) { return onScrub_1(event.clientX); };
|
---|
| 46 | var onTouchStart_1 = function (event) {
|
---|
| 47 | startScrubbing_1();
|
---|
| 48 | onTouchMove_1(event);
|
---|
| 49 | };
|
---|
| 50 | var onTouchMove_1 = options.vertical
|
---|
| 51 | ? function (event) { return onScrub_1(event.changedTouches[0].clientY); }
|
---|
| 52 | : function (event) { return onScrub_1(event.changedTouches[0].clientX); };
|
---|
| 53 | var bindEvents_1 = function () {
|
---|
| 54 | on(document, 'mousemove', onMouseMove_1);
|
---|
| 55 | on(document, 'mouseup', stopScrubbing_1);
|
---|
| 56 | on(document, 'touchmove', onTouchMove_1);
|
---|
| 57 | on(document, 'touchend', stopScrubbing_1);
|
---|
| 58 | };
|
---|
| 59 | var unbindEvents_1 = function () {
|
---|
| 60 | off(document, 'mousemove', onMouseMove_1);
|
---|
| 61 | off(document, 'mouseup', stopScrubbing_1);
|
---|
| 62 | off(document, 'touchmove', onTouchMove_1);
|
---|
| 63 | off(document, 'touchend', stopScrubbing_1);
|
---|
| 64 | };
|
---|
| 65 | var onScrub_1 = function (clientXY) {
|
---|
| 66 | cancelAnimationFrame(frame.current);
|
---|
| 67 | frame.current = requestAnimationFrame(function () {
|
---|
| 68 | if (isMounted() && ref.current) {
|
---|
| 69 | var rect = ref.current.getBoundingClientRect();
|
---|
| 70 | var pos = options.vertical ? rect.top : rect.left;
|
---|
| 71 | var length_1 = options.vertical ? rect.height : rect.width;
|
---|
| 72 | // Prevent returning 0 when element is hidden by CSS
|
---|
| 73 | if (!length_1) {
|
---|
| 74 | return;
|
---|
| 75 | }
|
---|
| 76 | var value = (clientXY - pos) / length_1;
|
---|
| 77 | if (value > 1) {
|
---|
| 78 | value = 1;
|
---|
| 79 | }
|
---|
| 80 | else if (value < 0) {
|
---|
| 81 | value = 0;
|
---|
| 82 | }
|
---|
| 83 | if (reverse_1) {
|
---|
| 84 | value = 1 - value;
|
---|
| 85 | }
|
---|
| 86 | setState({
|
---|
| 87 | value: value,
|
---|
| 88 | });
|
---|
| 89 | (options.onScrub || noop)(value);
|
---|
| 90 | }
|
---|
| 91 | });
|
---|
| 92 | };
|
---|
| 93 | on(ref.current, 'mousedown', onMouseDown_1);
|
---|
| 94 | on(ref.current, 'touchstart', onTouchStart_1);
|
---|
| 95 | return function () {
|
---|
| 96 | off(ref.current, 'mousedown', onMouseDown_1);
|
---|
| 97 | off(ref.current, 'touchstart', onTouchStart_1);
|
---|
| 98 | };
|
---|
| 99 | }
|
---|
| 100 | else {
|
---|
| 101 | return undefined;
|
---|
| 102 | }
|
---|
| 103 | }, [ref, options.vertical]);
|
---|
| 104 | return state;
|
---|
| 105 | };
|
---|
| 106 | export default useSlider;
|
---|