@appbuckets/react-ui
Version:
Just Another React UI Framework
262 lines (255 loc) • 7.13 kB
JavaScript
'use strict';
var tslib = require('tslib');
var React = require('react');
var clsx = require('clsx');
var RCSlider = require('rc-slider');
var reactUiCore = require('@appbuckets/react-ui-core');
var useField = require('../hooks/useField.js');
var Popup = require('../Popup/Popup.js');
var customHook = require('../utils/customHook.js');
require('../BucketTheme/BucketTheme.js');
var BucketContext = require('../BucketTheme/BucketContext.js');
var Field = require('../Field/Field.js');
function _interopDefaultLegacy(e) {
return e && typeof e === 'object' && 'default' in e ? e : { default: e };
}
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(
n,
k,
d.get
? d
: {
enumerable: true,
get: function () {
return e[k];
},
}
);
}
});
}
n['default'] = e;
return Object.freeze(n);
}
var React__namespace = /*#__PURE__*/ _interopNamespace(React);
var clsx__default = /*#__PURE__*/ _interopDefaultLegacy(clsx);
var RCSlider__default = /*#__PURE__*/ _interopDefaultLegacy(RCSlider);
/* --------
* Component Definition
* -------- */
var Slider = function (receivedProps) {
/** Get component props */
var props = BucketContext.useWithDefaultProps('slider', receivedProps);
var _a = customHook.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 = tslib.__rest(_b, [
'defaultValue',
'onAfterChange',
'onBeforeChange',
'onBlur',
'onChange',
'onFocus',
'tabIndex',
'tooltip',
'value',
'draggableTrack',
'dots',
'min',
'marks',
'max',
'step',
'vertical',
'included',
'reverse',
'startPoint',
]);
var _c = tslib.__read(customHook.useSplitStateClassName(rawRest), 1),
stateClassName = _c[0];
// ----
// Build Field and Helpers
// ----
var _d = useField.useField(rawRest),
fieldRef = _d.fieldRef,
fieldProps = _d.fieldProps;
_d.addClassesToField;
_d.removeClassesFromField;
var helpers = tslib.__rest(_d, [
'fieldRef',
'fieldProps',
'addClassesToField',
'removeClassesFromField',
]);
var disabled = fieldProps.disabled,
readOnly = fieldProps.readOnly,
required = fieldProps.required;
// ----
// AutoControlled Value State
// ----
var _e = tslib.__read(
reactUiCore.useAutoControlledValue(0, {
prop: userDefinedValue,
defaultProp: userDefinedDefaultValue,
}),
2
),
value = _e[0],
trySetValue = _e[1];
// ----
// Build Component Classes
// ----
var classes = clsx__default['default'](
{
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,
tslib.__assign(tslib.__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,
tslib.__assign(tslib.__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,
tslib.__assign(tslib.__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__namespace.createElement(Popup, {
content: tooltipText,
trigger: node,
updateDependencies: [renderProps.value],
});
};
// ----
// Component Render
// ----
return React__namespace.createElement(
Field,
tslib.__assign({ ref: fieldRef }, fieldProps, { contentType: 'slider' }),
React__namespace.createElement(RCSlider__default['default'], {
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';
module.exports = Slider;