UNPKG

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