UNPKG

17.5 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4var _typeof3 = require("@babel/runtime/helpers/typeof");
5Object.defineProperty(exports, "__esModule", {
6 value: true
7});
8exports.default = void 0;
9var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
12var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
13var React = _interopRequireWildcard(require("react"));
14var _classnames = _interopRequireDefault(require("classnames"));
15var _isEqual = _interopRequireDefault(require("rc-util/lib/isEqual"));
16var _useMergedState3 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState"));
17var _Handles = _interopRequireDefault(require("./Handles"));
18var _useDrag3 = _interopRequireDefault(require("./hooks/useDrag"));
19var _context = _interopRequireDefault(require("./context"));
20var _Tracks = _interopRequireDefault(require("./Tracks"));
21var _Marks = _interopRequireDefault(require("./Marks"));
22var _Steps = _interopRequireDefault(require("./Steps"));
23var _useOffset3 = _interopRequireDefault(require("./hooks/useOffset"));
24var _warning = _interopRequireDefault(require("rc-util/lib/warning"));
25function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
26function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof3(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
27var Slider = /*#__PURE__*/React.forwardRef(function (props, ref) {
28 var _classNames;
29 var _props$prefixCls = props.prefixCls,
30 prefixCls = _props$prefixCls === void 0 ? 'rc-slider' : _props$prefixCls,
31 className = props.className,
32 style = props.style,
33 _props$disabled = props.disabled,
34 disabled = _props$disabled === void 0 ? false : _props$disabled,
35 _props$keyboard = props.keyboard,
36 keyboard = _props$keyboard === void 0 ? true : _props$keyboard,
37 autoFocus = props.autoFocus,
38 onFocus = props.onFocus,
39 onBlur = props.onBlur,
40 _props$min = props.min,
41 min = _props$min === void 0 ? 0 : _props$min,
42 _props$max = props.max,
43 max = _props$max === void 0 ? 100 : _props$max,
44 _props$step = props.step,
45 step = _props$step === void 0 ? 1 : _props$step,
46 value = props.value,
47 defaultValue = props.defaultValue,
48 range = props.range,
49 count = props.count,
50 onChange = props.onChange,
51 onBeforeChange = props.onBeforeChange,
52 onAfterChange = props.onAfterChange,
53 _props$allowCross = props.allowCross,
54 allowCross = _props$allowCross === void 0 ? true : _props$allowCross,
55 _props$pushable = props.pushable,
56 pushable = _props$pushable === void 0 ? false : _props$pushable,
57 draggableTrack = props.draggableTrack,
58 reverse = props.reverse,
59 vertical = props.vertical,
60 _props$included = props.included,
61 included = _props$included === void 0 ? true : _props$included,
62 startPoint = props.startPoint,
63 trackStyle = props.trackStyle,
64 handleStyle = props.handleStyle,
65 railStyle = props.railStyle,
66 dotStyle = props.dotStyle,
67 activeDotStyle = props.activeDotStyle,
68 marks = props.marks,
69 dots = props.dots,
70 handleRender = props.handleRender,
71 _props$tabIndex = props.tabIndex,
72 tabIndex = _props$tabIndex === void 0 ? 0 : _props$tabIndex,
73 ariaLabelForHandle = props.ariaLabelForHandle,
74 ariaLabelledByForHandle = props.ariaLabelledByForHandle,
75 ariaValueTextFormatterForHandle = props.ariaValueTextFormatterForHandle;
76 var handlesRef = React.useRef();
77 var containerRef = React.useRef();
78 var direction = React.useMemo(function () {
79 if (vertical) {
80 return reverse ? 'ttb' : 'btt';
81 }
82 return reverse ? 'rtl' : 'ltr';
83 }, [reverse, vertical]);
84 // ============================ Range =============================
85 var mergedMin = React.useMemo(function () {
86 return isFinite(min) ? min : 0;
87 }, [min]);
88 var mergedMax = React.useMemo(function () {
89 return isFinite(max) ? max : 100;
90 }, [max]);
91 // ============================= Step =============================
92 var mergedStep = React.useMemo(function () {
93 return step !== null && step <= 0 ? 1 : step;
94 }, [step]);
95 // ============================= Push =============================
96 var mergedPush = React.useMemo(function () {
97 if (typeof pushable === 'boolean') {
98 return pushable ? mergedStep : false;
99 }
100 return pushable >= 0 ? pushable : false;
101 }, [pushable, mergedStep]);
102 // ============================ Marks =============================
103 var markList = React.useMemo(function () {
104 var keys = Object.keys(marks || {});
105 return keys.map(function (key) {
106 var mark = marks[key];
107 var markObj = {
108 value: Number(key)
109 };
110 if (mark && (0, _typeof2.default)(mark) === 'object' && ! /*#__PURE__*/React.isValidElement(mark) && ('label' in mark || 'style' in mark)) {
111 markObj.style = mark.style;
112 markObj.label = mark.label;
113 } else {
114 markObj.label = mark;
115 }
116 return markObj;
117 }).filter(function (_ref) {
118 var label = _ref.label;
119 return label || typeof label === 'number';
120 }).sort(function (a, b) {
121 return a.value - b.value;
122 });
123 }, [marks]);
124 // ============================ Format ============================
125 var _useOffset = (0, _useOffset3.default)(mergedMin, mergedMax, mergedStep, markList, allowCross, mergedPush),
126 _useOffset2 = (0, _slicedToArray2.default)(_useOffset, 2),
127 formatValue = _useOffset2[0],
128 offsetValues = _useOffset2[1];
129 // ============================ Values ============================
130 var _useMergedState = (0, _useMergedState3.default)(defaultValue, {
131 value: value
132 }),
133 _useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2),
134 mergedValue = _useMergedState2[0],
135 setValue = _useMergedState2[1];
136 var rawValues = React.useMemo(function () {
137 var valueList = mergedValue === null || mergedValue === undefined ? [] : Array.isArray(mergedValue) ? mergedValue : [mergedValue];
138 var _valueList = (0, _slicedToArray2.default)(valueList, 1),
139 _valueList$ = _valueList[0],
140 val0 = _valueList$ === void 0 ? mergedMin : _valueList$;
141 var returnValues = mergedValue === null ? [] : [val0];
142 // Format as range
143 if (range) {
144 returnValues = (0, _toConsumableArray2.default)(valueList);
145 // When count provided or value is `undefined`, we fill values
146 if (count || mergedValue === undefined) {
147 var pointCount = count >= 0 ? count + 1 : 2;
148 returnValues = returnValues.slice(0, pointCount);
149 // Fill with count
150 while (returnValues.length < pointCount) {
151 var _returnValues;
152 returnValues.push((_returnValues = returnValues[returnValues.length - 1]) !== null && _returnValues !== void 0 ? _returnValues : mergedMin);
153 }
154 }
155 returnValues.sort(function (a, b) {
156 return a - b;
157 });
158 }
159 // Align in range
160 returnValues.forEach(function (val, index) {
161 returnValues[index] = formatValue(val);
162 });
163 return returnValues;
164 }, [mergedValue, range, mergedMin, count, formatValue]);
165 // =========================== onChange ===========================
166 var rawValuesRef = React.useRef(rawValues);
167 rawValuesRef.current = rawValues;
168 var getTriggerValue = function getTriggerValue(triggerValues) {
169 return range ? triggerValues : triggerValues[0];
170 };
171 var triggerChange = function triggerChange(nextValues) {
172 // Order first
173 var cloneNextValues = (0, _toConsumableArray2.default)(nextValues).sort(function (a, b) {
174 return a - b;
175 });
176 // Trigger event if needed
177 if (onChange && !(0, _isEqual.default)(cloneNextValues, rawValuesRef.current, true)) {
178 onChange(getTriggerValue(cloneNextValues));
179 }
180 // We set this later since it will re-render component immediately
181 setValue(cloneNextValues);
182 };
183 var changeToCloseValue = function changeToCloseValue(newValue) {
184 if (!disabled) {
185 var valueIndex = 0;
186 var valueDist = mergedMax - mergedMin;
187 rawValues.forEach(function (val, index) {
188 var dist = Math.abs(newValue - val);
189 if (dist <= valueDist) {
190 valueDist = dist;
191 valueIndex = index;
192 }
193 });
194 // Create new values
195 var cloneNextValues = (0, _toConsumableArray2.default)(rawValues);
196 cloneNextValues[valueIndex] = newValue;
197 // Fill value to match default 2
198 if (range && !rawValues.length && count === undefined) {
199 cloneNextValues.push(newValue);
200 }
201 onBeforeChange === null || onBeforeChange === void 0 ? void 0 : onBeforeChange(getTriggerValue(cloneNextValues));
202 triggerChange(cloneNextValues);
203 onAfterChange === null || onAfterChange === void 0 ? void 0 : onAfterChange(getTriggerValue(cloneNextValues));
204 }
205 };
206 // ============================ Click =============================
207 var onSliderMouseDown = function onSliderMouseDown(e) {
208 e.preventDefault();
209 var _containerRef$current = containerRef.current.getBoundingClientRect(),
210 width = _containerRef$current.width,
211 height = _containerRef$current.height,
212 left = _containerRef$current.left,
213 top = _containerRef$current.top,
214 bottom = _containerRef$current.bottom,
215 right = _containerRef$current.right;
216 var clientX = e.clientX,
217 clientY = e.clientY;
218 var percent;
219 switch (direction) {
220 case 'btt':
221 percent = (bottom - clientY) / height;
222 break;
223 case 'ttb':
224 percent = (clientY - top) / height;
225 break;
226 case 'rtl':
227 percent = (right - clientX) / width;
228 break;
229 default:
230 percent = (clientX - left) / width;
231 }
232 var nextValue = mergedMin + percent * (mergedMax - mergedMin);
233 changeToCloseValue(formatValue(nextValue));
234 };
235 // =========================== Keyboard ===========================
236 var _React$useState = React.useState(null),
237 _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
238 keyboardValue = _React$useState2[0],
239 setKeyboardValue = _React$useState2[1];
240 var onHandleOffsetChange = function onHandleOffsetChange(offset, valueIndex) {
241 if (!disabled) {
242 var next = offsetValues(rawValues, offset, valueIndex);
243 onBeforeChange === null || onBeforeChange === void 0 ? void 0 : onBeforeChange(getTriggerValue(rawValues));
244 triggerChange(next.values);
245 onAfterChange === null || onAfterChange === void 0 ? void 0 : onAfterChange(getTriggerValue(next.values));
246 setKeyboardValue(next.value);
247 }
248 };
249 React.useEffect(function () {
250 if (keyboardValue !== null) {
251 var valueIndex = rawValues.indexOf(keyboardValue);
252 if (valueIndex >= 0) {
253 handlesRef.current.focus(valueIndex);
254 }
255 }
256 setKeyboardValue(null);
257 }, [keyboardValue]);
258 // ============================= Drag =============================
259 var mergedDraggableTrack = React.useMemo(function () {
260 if (draggableTrack && mergedStep === null) {
261 if (process.env.NODE_ENV !== 'production') {
262 (0, _warning.default)(false, '`draggableTrack` is not supported when `step` is `null`.');
263 }
264 return false;
265 }
266 return draggableTrack;
267 }, [draggableTrack, mergedStep]);
268 var finishChange = function finishChange() {
269 onAfterChange === null || onAfterChange === void 0 ? void 0 : onAfterChange(getTriggerValue(rawValuesRef.current));
270 };
271 var _useDrag = (0, _useDrag3.default)(containerRef, direction, rawValues, mergedMin, mergedMax, formatValue, triggerChange, finishChange, offsetValues),
272 _useDrag2 = (0, _slicedToArray2.default)(_useDrag, 4),
273 draggingIndex = _useDrag2[0],
274 draggingValue = _useDrag2[1],
275 cacheValues = _useDrag2[2],
276 onStartDrag = _useDrag2[3];
277 var onStartMove = function onStartMove(e, valueIndex) {
278 onStartDrag(e, valueIndex);
279 onBeforeChange === null || onBeforeChange === void 0 ? void 0 : onBeforeChange(getTriggerValue(rawValuesRef.current));
280 };
281 // Auto focus for updated handle
282 var dragging = draggingIndex !== -1;
283 React.useEffect(function () {
284 if (!dragging) {
285 var valueIndex = rawValues.lastIndexOf(draggingValue);
286 handlesRef.current.focus(valueIndex);
287 }
288 }, [dragging]);
289 // =========================== Included ===========================
290 var sortedCacheValues = React.useMemo(function () {
291 return (0, _toConsumableArray2.default)(cacheValues).sort(function (a, b) {
292 return a - b;
293 });
294 }, [cacheValues]);
295 // Provide a range values with included [min, max]
296 // Used for Track, Mark & Dot
297 var _React$useMemo = React.useMemo(function () {
298 if (!range) {
299 return [mergedMin, sortedCacheValues[0]];
300 }
301 return [sortedCacheValues[0], sortedCacheValues[sortedCacheValues.length - 1]];
302 }, [sortedCacheValues, range, mergedMin]),
303 _React$useMemo2 = (0, _slicedToArray2.default)(_React$useMemo, 2),
304 includedStart = _React$useMemo2[0],
305 includedEnd = _React$useMemo2[1];
306 // ============================= Refs =============================
307 React.useImperativeHandle(ref, function () {
308 return {
309 focus: function focus() {
310 handlesRef.current.focus(0);
311 },
312 blur: function blur() {
313 var _document = document,
314 activeElement = _document.activeElement;
315 if (containerRef.current.contains(activeElement)) {
316 activeElement === null || activeElement === void 0 ? void 0 : activeElement.blur();
317 }
318 }
319 };
320 });
321 // ========================== Auto Focus ==========================
322 React.useEffect(function () {
323 if (autoFocus) {
324 handlesRef.current.focus(0);
325 }
326 }, []);
327 // =========================== Context ============================
328 var context = React.useMemo(function () {
329 return {
330 min: mergedMin,
331 max: mergedMax,
332 direction: direction,
333 disabled: disabled,
334 keyboard: keyboard,
335 step: mergedStep,
336 included: included,
337 includedStart: includedStart,
338 includedEnd: includedEnd,
339 range: range,
340 tabIndex: tabIndex,
341 ariaLabelForHandle: ariaLabelForHandle,
342 ariaLabelledByForHandle: ariaLabelledByForHandle,
343 ariaValueTextFormatterForHandle: ariaValueTextFormatterForHandle
344 };
345 }, [mergedMin, mergedMax, direction, disabled, keyboard, mergedStep, included, includedStart, includedEnd, range, tabIndex, ariaLabelForHandle, ariaLabelledByForHandle, ariaValueTextFormatterForHandle]);
346 // ============================ Render ============================
347 return /*#__PURE__*/React.createElement(_context.default.Provider, {
348 value: context
349 }, /*#__PURE__*/React.createElement("div", {
350 ref: containerRef,
351 className: (0, _classnames.default)(prefixCls, className, (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-disabled"), disabled), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-vertical"), vertical), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-horizontal"), !vertical), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-with-marks"), markList.length), _classNames)),
352 style: style,
353 onMouseDown: onSliderMouseDown
354 }, /*#__PURE__*/React.createElement("div", {
355 className: "".concat(prefixCls, "-rail"),
356 style: railStyle
357 }), /*#__PURE__*/React.createElement(_Tracks.default, {
358 prefixCls: prefixCls,
359 style: trackStyle,
360 values: sortedCacheValues,
361 startPoint: startPoint,
362 onStartMove: mergedDraggableTrack ? onStartMove : null
363 }), /*#__PURE__*/React.createElement(_Steps.default, {
364 prefixCls: prefixCls,
365 marks: markList,
366 dots: dots,
367 style: dotStyle,
368 activeStyle: activeDotStyle
369 }), /*#__PURE__*/React.createElement(_Handles.default, {
370 ref: handlesRef,
371 prefixCls: prefixCls,
372 style: handleStyle,
373 values: cacheValues,
374 draggingIndex: draggingIndex,
375 onStartMove: onStartMove,
376 onOffsetChange: onHandleOffsetChange,
377 onFocus: onFocus,
378 onBlur: onBlur,
379 handleRender: handleRender
380 }), /*#__PURE__*/React.createElement(_Marks.default, {
381 prefixCls: prefixCls,
382 marks: markList,
383 onClick: changeToCloseValue
384 })));
385});
386if (process.env.NODE_ENV !== 'production') {
387 Slider.displayName = 'Slider';
388}
389var _default = Slider;
390exports.default = _default;
\No newline at end of file