@geist-ui/react
Version:
Modern and minimalist React UI library.
165 lines (146 loc) • 6.79 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
var _excluded = ["hideValue", "disabled", "type", "step", "max", "min", "initialValue", "value", "onChange", "className", "showMarkers"];
import _JSXStyle from "../styled-jsx.es.js";
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import useTheme from '../use-theme';
import useDrag from '../utils/use-drag';
import useCurrentState from '../utils/use-current-state';
import SliderDot from './slider-dot';
import SliderMark from './slider-mark';
import { getColors } from './styles';
import useScaleable, { withPureProps, withScaleable } from '../use-scaleable';
var defaultProps = {
hideValue: false,
type: 'default',
initialValue: 0,
step: 1,
min: 0,
max: 100,
disabled: false,
showMarkers: false,
className: ''
};
var getRefWidth = function getRefWidth(elementRef) {
if (!elementRef || !elementRef.current) return 0;
var rect = elementRef.current.getBoundingClientRect();
return rect.width || rect.right - rect.left;
};
var getValue = function getValue(max, min, step, offsetX, railWidth) {
if (offsetX < 0) return min;
if (offsetX > railWidth) return max;
var widthForEachStep = railWidth / (max - min) * step;
if (widthForEachStep <= 0) return min;
var slideDistance = Math.round(offsetX / widthForEachStep) * step + min;
return Number.isInteger(slideDistance) ? slideDistance : Number.parseFloat(slideDistance.toFixed(1));
};
var SliderComponent = function SliderComponent(_ref) {
var hideValue = _ref.hideValue,
disabled = _ref.disabled,
type = _ref.type,
step = _ref.step,
max = _ref.max,
min = _ref.min,
initialValue = _ref.initialValue,
customValue = _ref.value,
onChange = _ref.onChange,
className = _ref.className,
showMarkers = _ref.showMarkers,
props = _objectWithoutProperties(_ref, _excluded);
var theme = useTheme();
var _useScaleable = useScaleable(),
SCALES = _useScaleable.SCALES;
var _useState = useState(initialValue),
_useState2 = _slicedToArray(_useState, 2),
value = _useState2[0],
setValue = _useState2[1];
var _useCurrentState = useCurrentState(0),
_useCurrentState2 = _slicedToArray(_useCurrentState, 3),
setSliderWidth = _useCurrentState2[1],
sideWidthRef = _useCurrentState2[2];
var _useCurrentState3 = useCurrentState(0),
_useCurrentState4 = _slicedToArray(_useCurrentState3, 3),
setLastDargOffset = _useCurrentState4[1],
lastDargOffsetRef = _useCurrentState4[2];
var _useState3 = useState(false),
_useState4 = _slicedToArray(_useState3, 2),
isClick = _useState4[0],
setIsClick = _useState4[1];
var sliderRef = useRef(null);
var dotRef = useRef(null);
var currentRatio = useMemo(function () {
return (value - min) / (max - min) * 100;
}, [value, max, min]);
var setLastOffsetManually = function setLastOffsetManually(val) {
var width = getRefWidth(sliderRef);
var shouldOffset = (val - min) / (max - min) * width;
setLastDargOffset(shouldOffset);
};
var updateValue = useCallback(function (offset) {
var currentValue = getValue(max, min, step, offset, sideWidthRef.current);
setValue(currentValue);
onChange && onChange(currentValue);
}, [max, min, step, sideWidthRef]);
var _useMemo = useMemo(function () {
return getColors(theme.palette, type);
}, [theme.palette, type]),
bg = _useMemo.bg;
var dragHandler = function dragHandler(event) {
if (disabled) return;
var currentOffset = event.currentX - event.startX;
var offset = currentOffset + lastDargOffsetRef.current;
updateValue(offset);
};
var dragStartHandler = function dragStartHandler() {
setIsClick(false);
setSliderWidth(getRefWidth(sliderRef));
};
var dragEndHandler = function dragEndHandler(event) {
if (disabled) return;
var offset = event.currentX - event.startX;
var currentOffset = offset + lastDargOffsetRef.current;
var boundOffset = currentOffset < 0 ? 0 : Math.min(currentOffset, sideWidthRef.current);
setLastDargOffset(boundOffset);
};
var clickHandler = function clickHandler(event) {
if (disabled) return;
if (!sliderRef || !sliderRef.current) return;
setIsClick(true);
setSliderWidth(getRefWidth(sliderRef));
var clickOffset = event.clientX - sliderRef.current.getBoundingClientRect().x;
setLastDargOffset(clickOffset);
updateValue(clickOffset);
};
useDrag(dotRef, dragHandler, dragStartHandler, dragEndHandler);
useEffect(function () {
if (customValue === undefined) return;
if (customValue === value) return;
setValue(customValue);
}, [customValue, value]);
useEffect(function () {
initialValue && setLastOffsetManually(initialValue);
}, []);
return /*#__PURE__*/React.createElement("div", _extends({
onClick: clickHandler,
ref: sliderRef
}, withPureProps(props), {
className: _JSXStyle.dynamic([["219401708", [disabled ? theme.palette.accents_2 : bg, disabled ? 'not-allow' : 'pointer', SCALES.font(1), SCALES.width(1, '100%'), SCALES.height(0.5), SCALES.pt(0), SCALES.pr(0), SCALES.pb(0), SCALES.pl(0), SCALES.mt(0), SCALES.mr(0), SCALES.mb(0), SCALES.ml(0)]]]) + " " + "slider ".concat(className)
}), /*#__PURE__*/React.createElement(SliderDot, {
disabled: disabled,
ref: dotRef,
isClick: isClick,
left: currentRatio
}, hideValue || value), showMarkers && /*#__PURE__*/React.createElement(SliderMark, {
max: max,
min: min,
step: step
}), /*#__PURE__*/React.createElement(_JSXStyle, {
id: "219401708",
dynamic: [disabled ? theme.palette.accents_2 : bg, disabled ? 'not-allow' : 'pointer', SCALES.font(1), SCALES.width(1, '100%'), SCALES.height(0.5), SCALES.pt(0), SCALES.pr(0), SCALES.pb(0), SCALES.pl(0), SCALES.mt(0), SCALES.mr(0), SCALES.mb(0), SCALES.ml(0)]
}, ".slider.__jsx-style-dynamic-selector{border-radius:50px;background-color:".concat(disabled ? theme.palette.accents_2 : bg, ";position:relative;cursor:").concat(disabled ? 'not-allow' : 'pointer', ";--slider-font-size:").concat(SCALES.font(1), ";width:").concat(SCALES.width(1, '100%'), ";height:").concat(SCALES.height(0.5), ";padding:").concat(SCALES.pt(0), " ").concat(SCALES.pr(0), " ").concat(SCALES.pb(0), " ").concat(SCALES.pl(0), ";margin:").concat(SCALES.mt(0), " ").concat(SCALES.mr(0), " ").concat(SCALES.mb(0), " ").concat(SCALES.ml(0), ";}")));
};
SliderComponent.defaultProps = defaultProps;
SliderComponent.displayName = 'GeistSlider';
var Slider = withScaleable(SliderComponent);
export default Slider;