@appbuckets/react-ui
Version:
Just Another React UI Framework
229 lines (226 loc) • 6.12 kB
JavaScript
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 };