UNPKG

@appbuckets/react-ui

Version:
229 lines (226 loc) 6.12 kB
import { __rest, __read, __assign } from 'tslib'; import * as React from 'react'; import clsx from 'clsx'; import RCSlider from 'rc-slider'; import { useAutoControlledValue } from '@appbuckets/react-ui-core'; import { useField } from '../hooks/useField.js'; import Popup from '../Popup/Popup.js'; import { useSharedClassName, useSplitStateClassName, } from '../utils/customHook.js'; import '../BucketTheme/BucketTheme.js'; import { useWithDefaultProps } from '../BucketTheme/BucketContext.js'; import Field from '../Field/Field.js'; /* -------- * Component Definition * -------- */ var Slider = function (receivedProps) { /** Get component props */ var props = useWithDefaultProps('slider', receivedProps); var _a = useSharedClassName(props), className = _a.className, _b = _a.rest, /** Strict Slider Props */ userDefinedDefaultValue = _b.defaultValue, userDefinedOnAfterChangeHandler = _b.onAfterChange, userDefinedOnBeforeChangeHandler = _b.onBeforeChange, userDefinedOnBlurHandler = _b.onBlur, userDefinedOnChangeHandler = _b.onChange, userDefinedOnFocusHandler = _b.onFocus; _b.tabIndex; var tooltip = _b.tooltip, userDefinedValue = _b.value, /** Ported props */ draggableTrack = _b.draggableTrack, dots = _b.dots, min = _b.min, marks = _b.marks, max = _b.max, step = _b.step, vertical = _b.vertical, included = _b.included, reverse = _b.reverse, startPoint = _b.startPoint, /** All other slider props */ rawRest = __rest(_b, [ 'defaultValue', 'onAfterChange', 'onBeforeChange', 'onBlur', 'onChange', 'onFocus', 'tabIndex', 'tooltip', 'value', 'draggableTrack', 'dots', 'min', 'marks', 'max', 'step', 'vertical', 'included', 'reverse', 'startPoint', ]); var _c = __read(useSplitStateClassName(rawRest), 1), stateClassName = _c[0]; // ---- // Build Field and Helpers // ---- var _d = useField(rawRest), fieldRef = _d.fieldRef, fieldProps = _d.fieldProps; _d.addClassesToField; _d.removeClassesFromField; var helpers = __rest(_d, [ 'fieldRef', 'fieldProps', 'addClassesToField', 'removeClassesFromField', ]); var disabled = fieldProps.disabled, readOnly = fieldProps.readOnly, required = fieldProps.required; // ---- // AutoControlled Value State // ---- var _e = __read( useAutoControlledValue(0, { prop: userDefinedValue, defaultProp: userDefinedDefaultValue, }), 2 ), value = _e[0], trySetValue = _e[1]; // ---- // Build Component Classes // ---- var classes = clsx( { required: required, disabled: disabled, 'max-reached': value === max, 'min-reached': value === min, }, stateClassName, className ); // ---- // Internal Props // ---- var canSlide = !disabled && !readOnly; // ---- // Internal Handlers // ---- var handleSliderBeforeChange = function () { /** If slider can't move, return */ if (!canSlide) { return; } /** Set helpers */ helpers.setFieldClicked(); /** Call user defined handler if exists */ if (typeof userDefinedOnBeforeChangeHandler === 'function') { userDefinedOnBeforeChangeHandler( null, __assign(__assign({}, props), { value: value }) ); } }; var handleSliderChange = function (newValue) { /** If slider can't move, return */ if (!canSlide || Array.isArray(newValue)) { return; } /** Call user defined handler */ if (typeof userDefinedOnChangeHandler === 'function') { userDefinedOnChangeHandler( null, __assign(__assign({}, props), { value: newValue }) ); } /** Try to set the new value */ trySetValue(newValue); }; var handleSliderAfterChange = function (newValue) { /** If slider can't move, return */ if (!canSlide || Array.isArray(newValue)) { return; } /** If value has changed, set helpers */ if (newValue !== value) { helpers.setFieldChanged(); } /** Call user defined handler */ if (typeof userDefinedOnAfterChangeHandler === 'function') { userDefinedOnAfterChangeHandler( null, __assign(__assign({}, props), { value: newValue }) ); } /** Try to set the new value */ trySetValue(newValue); }; var handleSliderFocus = function (e) { helpers.setFieldFocused(); if (typeof userDefinedOnFocusHandler === 'function') { userDefinedOnFocusHandler(e, props); } }; var handleSliderBlur = function (e) { helpers.setFieldBlurred(); if (typeof userDefinedOnBlurHandler === 'function') { userDefinedOnBlurHandler(e, props); } }; // ---- // Build Component Handler // ---- var handle = function (node, renderProps) { /** If no tooltip exists, return the handler */ if (!tooltip || renderProps.dragging) { return node; } /** Set tooltip text */ var tooltipText = typeof tooltip === 'function' ? tooltip(renderProps.value) : value; /** Return wrapped handler */ return React.createElement(Popup, { content: tooltipText, trigger: node, updateDependencies: [renderProps.value], }); }; // ---- // Component Render // ---- return React.createElement( Field, __assign({ ref: fieldRef }, fieldProps, { contentType: 'slider' }), React.createElement(RCSlider, { draggableTrack: draggableTrack, dots: dots, min: min, marks: marks, max: max, step: step, vertical: vertical, included: included, reverse: reverse, startPoint: startPoint, className: classes, value: value, handleRender: handle, onAfterChange: handleSliderAfterChange, onBeforeChange: handleSliderBeforeChange, onBlur: handleSliderBlur, onChange: handleSliderChange, onFocus: handleSliderFocus, }) ); }; Slider.displayName = 'Slider'; export { Slider as default };