| var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { | 
|     var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; | 
|     if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); | 
|     else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; | 
|     return c > 3 && r && Object.defineProperty(target, key, r), r; | 
| }; | 
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | 
|     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | 
|     return new (P || (P = Promise))(function (resolve, reject) { | 
|         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | 
|         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | 
|         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | 
|         step((generator = generator.apply(thisArg, _arguments || [])).next()); | 
|     }); | 
| }; | 
| import { SuperComponent, wxComponent } from '../common/src/index'; | 
| import config from '../common/config'; | 
| import { trimSingleValue, trimValue } from './tool'; | 
| import props from './props'; | 
| import { getRect } from '../common/utils'; | 
| import Bus from '../common/bus'; | 
| const { prefix } = config; | 
| const name = `${prefix}-slider`; | 
| let Slider = class Slider extends SuperComponent { | 
|     constructor() { | 
|         super(...arguments); | 
|         this.externalClasses = [ | 
|             `${prefix}-class`, | 
|             `${prefix}-class-bar`, | 
|             `${prefix}-class-bar-active`, | 
|             `${prefix}-class-bar-disabled`, | 
|             `${prefix}-class-cursor`, | 
|         ]; | 
|         this.properties = props; | 
|         this.controlledProps = [ | 
|             { | 
|                 key: 'value', | 
|                 event: 'change', | 
|             }, | 
|         ]; | 
|         this.data = { | 
|             sliderStyles: '', | 
|             classPrefix: name, | 
|             initialLeft: null, | 
|             initialRight: null, | 
|             activeLeft: 0, | 
|             activeRight: 0, | 
|             maxRange: 0, | 
|             lineLeft: 0, | 
|             lineRight: 0, | 
|             dotTopValue: [0, 0], | 
|             _value: 0, | 
|             blockSize: 20, | 
|             isScale: false, | 
|             scaleArray: [], | 
|             scaleTextArray: [], | 
|             prefix, | 
|             isVisibleToScreenReader: false, | 
|         }; | 
|         this.observers = { | 
|             value(newValue) { | 
|                 this.handlePropsChange(newValue); | 
|             }, | 
|             _value(newValue) { | 
|                 this.bus.on('initial', () => this.renderLine(newValue)); | 
|                 this.toggleA11yTips(); | 
|             }, | 
|             marks(val) { | 
|                 this.bus.on('initial', () => this.handleMark(val)); | 
|             }, | 
|         }; | 
|         this.lifetimes = { | 
|             created() { | 
|                 this.bus = new Bus(); | 
|             }, | 
|             attached() { | 
|                 const { value } = this.properties; | 
|                 if (!value) | 
|                     this.handlePropsChange(0); | 
|                 this.init(); | 
|                 this.injectPageScroll(); | 
|             }, | 
|         }; | 
|     } | 
|     injectPageScroll() { | 
|         const { range, vertical } = this.properties; | 
|         if (!range || !vertical) | 
|             return; | 
|         const pages = getCurrentPages() || []; | 
|         let curPage = null; | 
|         if (pages && pages.length - 1 >= 0) { | 
|             curPage = pages[pages.length - 1]; | 
|         } | 
|         if (!curPage) | 
|             return; | 
|         const originPageScroll = curPage === null || curPage === void 0 ? void 0 : curPage.onPageScroll; | 
|         curPage.onPageScroll = (rest) => { | 
|             originPageScroll === null || originPageScroll === void 0 ? void 0 : originPageScroll.call(this, rest); | 
|             this.observerScrollTop(rest); | 
|         }; | 
|     } | 
|     observerScrollTop(rest) { | 
|         const { scrollTop } = rest || {}; | 
|         this.pageScrollTop = scrollTop; | 
|     } | 
|     toggleA11yTips() { | 
|         this.setData({ | 
|             isVisibleToScreenReader: true, | 
|         }); | 
|         setTimeout(() => { | 
|             this.setData({ | 
|                 isVisibleToScreenReader: false, | 
|             }); | 
|         }, 2000); | 
|     } | 
|     renderLine(val) { | 
|         const { min, max, range } = this.properties; | 
|         const { maxRange } = this.data; | 
|         if (range) { | 
|             const left = (maxRange * (val[0] - Number(min))) / (Number(max) - Number(min)); | 
|             const right = (maxRange * (Number(max) - val[1])) / (Number(max) - Number(min)); | 
|             this.setLineStyle(left, right); | 
|         } | 
|         else { | 
|             this.setSingleBarWidth(val); | 
|         } | 
|     } | 
|     triggerValue(value) { | 
|         if (this.preval === value) | 
|             return; | 
|         this.preval = value; | 
|         this._trigger('change', { | 
|             value: trimValue(value, this.properties), | 
|         }); | 
|     } | 
|     handlePropsChange(newValue) { | 
|         const value = trimValue(newValue, this.properties); | 
|         const setValueAndTrigger = () => { | 
|             this.setData({ | 
|                 _value: value, | 
|             }); | 
|         }; | 
|         if (this.data.maxRange === 0) { | 
|             this.init().then(setValueAndTrigger); | 
|             return; | 
|         } | 
|         setValueAndTrigger(); | 
|     } | 
|     handleMark(marks) { | 
|         const calcPos = (arr) => { | 
|             const { max, theme } = this.properties; | 
|             const { blockSize, maxRange } = this.data; | 
|             const margin = theme === 'capsule' ? blockSize / 2 : 0; | 
|             return arr.map((item) => ({ | 
|                 val: item, | 
|                 left: Math.round((item / Number(max)) * maxRange) + margin, | 
|             })); | 
|         }; | 
|         if ((marks === null || marks === void 0 ? void 0 : marks.length) && Array.isArray(marks)) { | 
|             this.setData({ | 
|                 isScale: true, | 
|                 scaleArray: calcPos(marks), | 
|                 scaleTextArray: [], | 
|             }); | 
|         } | 
|         if (Object.prototype.toString.call(marks) === '[object Object]') { | 
|             const scaleArray = Object.keys(marks).map((item) => Number(item)); | 
|             const scaleTextArray = scaleArray.map((item) => marks[item]); | 
|             this.setData({ | 
|                 isScale: scaleArray.length > 0, | 
|                 scaleArray: calcPos(scaleArray), | 
|                 scaleTextArray, | 
|             }); | 
|         } | 
|     } | 
|     setSingleBarWidth(value) { | 
|         const { max, min, theme } = this.properties; | 
|         const { maxRange, blockSize } = this.data; | 
|         const halfBlock = theme === 'capsule' ? Number(blockSize) / 2 : 0; | 
|         const percentage = (Number(value) - Number(min)) / (Number(max) - Number(min)); | 
|         const width = percentage * maxRange + halfBlock; | 
|         this.setData({ | 
|             lineBarWidth: `${width}px`, | 
|         }); | 
|     } | 
|     init() { | 
|         return __awaiter(this, void 0, void 0, function* () { | 
|             const line = yield getRect(this, '#sliderLine'); | 
|             const { blockSize } = this.data; | 
|             const { theme, vertical } = this.properties; | 
|             const halfBlock = Number(blockSize) / 2; | 
|             const { top, bottom, right, left } = line; | 
|             let maxRange = vertical ? bottom - top : right - left; | 
|             let initialLeft = vertical ? top : left; | 
|             let initialRight = vertical ? bottom : right; | 
|             if (initialLeft === 0 && initialRight === 0) | 
|                 return; | 
|             if (theme === 'capsule') { | 
|                 maxRange = maxRange - Number(blockSize) - 6; | 
|                 initialLeft -= halfBlock; | 
|                 initialRight -= halfBlock; | 
|             } | 
|             this.setData({ | 
|                 maxRange, | 
|                 initialLeft, | 
|                 initialRight, | 
|             }); | 
|             this.bus.emit('initial'); | 
|         }); | 
|     } | 
|     stepValue(value) { | 
|         const { step, min, max } = this.properties; | 
|         const decimal = String(step).indexOf('.') > -1 ? String(step).length - String(step).indexOf('.') - 1 : 0; | 
|         const closestStep = trimSingleValue(Number((Math.round(value / Number(step)) * Number(step)).toFixed(decimal)), Number(min), Number(max)); | 
|         return closestStep; | 
|     } | 
|     onSingleLineTap(e) { | 
|         const { disabled } = this.properties; | 
|         if (disabled) | 
|             return; | 
|         const value = this.getSingleChangeValue(e); | 
|         this.triggerValue(value); | 
|     } | 
|     getSingleChangeValue(e) { | 
|         const { min, max } = this.properties; | 
|         const { initialLeft, maxRange } = this.data; | 
|         const [touch] = e.changedTouches; | 
|         const pagePosition = this.getPagePosition(touch); | 
|         const currentLeft = pagePosition - initialLeft; | 
|         let value = 0; | 
|         if (currentLeft <= 0) { | 
|             value = Number(min); | 
|         } | 
|         else if (currentLeft >= maxRange) { | 
|             value = Number(max); | 
|         } | 
|         else { | 
|             value = (currentLeft / maxRange) * (Number(max) - Number(min)) + Number(min); | 
|         } | 
|         return this.stepValue(value); | 
|     } | 
|     convertPosToValue(posValue, dir) { | 
|         const { maxRange } = this.data; | 
|         const { max, min } = this.properties; | 
|         return dir === 0 | 
|             ? (posValue / maxRange) * (Number(max) - Number(min)) + Number(min) | 
|             : Number(max) - (posValue / maxRange) * (Number(max) - Number(min)); | 
|     } | 
|     onLineTap(e) { | 
|         const { disabled, theme, vertical } = this.properties; | 
|         const { initialLeft, initialRight, maxRange, blockSize } = this.data; | 
|         if (disabled) | 
|             return; | 
|         const [touch] = e.changedTouches; | 
|         const pagePosition = this.getPagePosition(touch); | 
|         const halfBlock = theme === 'capsule' ? Number(blockSize) / 2 : 0; | 
|         const currentLeft = pagePosition - initialLeft; | 
|         if (currentLeft < 0 || currentLeft > maxRange + Number(blockSize)) | 
|             return; | 
|         Promise.all([getRect(this, '#leftDot'), getRect(this, '#rightDot')]).then(([leftDot, rightDot]) => { | 
|             const pageScrollTop = this.pageScrollTop || 0; | 
|             const leftDotPosition = vertical ? leftDot.top + pageScrollTop : leftDot.left; | 
|             const distanceLeft = Math.abs(pagePosition - leftDotPosition - halfBlock); | 
|             const rightDotPosition = vertical ? rightDot.top + pageScrollTop : rightDot.left; | 
|             const distanceRight = Math.abs(rightDotPosition - pagePosition + halfBlock); | 
|             const isMoveLeft = distanceLeft < distanceRight; | 
|             if (isMoveLeft) { | 
|                 const left = pagePosition - initialLeft; | 
|                 const leftValue = this.convertPosToValue(left, 0); | 
|                 this.triggerValue([this.stepValue(leftValue), this.data._value[1]]); | 
|             } | 
|             else { | 
|                 const right = -(pagePosition - initialRight); | 
|                 const rightValue = this.convertPosToValue(right, 1); | 
|                 this.triggerValue([this.data._value[0], this.stepValue(rightValue)]); | 
|             } | 
|         }); | 
|     } | 
|     onTouchStart(e) { | 
|         this.triggerEvent('dragstart', { e }); | 
|     } | 
|     onTouchMoveLeft(e) { | 
|         const { disabled } = this.properties; | 
|         const { initialLeft, _value } = this.data; | 
|         if (disabled) | 
|             return; | 
|         const [touch] = e.changedTouches; | 
|         const pagePosition = this.getPagePosition(touch); | 
|         const currentLeft = pagePosition - initialLeft; | 
|         const newData = [..._value]; | 
|         const leftValue = this.convertPosToValue(currentLeft, 0); | 
|         newData[0] = this.stepValue(leftValue); | 
|         this.triggerValue(newData); | 
|     } | 
|     onTouchMoveRight(e) { | 
|         const { disabled } = this.properties; | 
|         const { initialRight, _value } = this.data; | 
|         if (disabled) | 
|             return; | 
|         const [touch] = e.changedTouches; | 
|         const pagePosition = this.getPagePosition(touch); | 
|         const currentRight = -(pagePosition - initialRight); | 
|         const newData = [..._value]; | 
|         const rightValue = this.convertPosToValue(currentRight, 1); | 
|         newData[1] = this.stepValue(rightValue); | 
|         this.triggerValue(newData); | 
|     } | 
|     setLineStyle(left, right) { | 
|         const { theme } = this.properties; | 
|         const { blockSize, maxRange } = this.data; | 
|         const halfBlock = theme === 'capsule' ? Number(blockSize) / 2 : 0; | 
|         const [a, b] = this.data._value; | 
|         const cut = (v) => parseInt(v, 10); | 
|         this.setData({ | 
|             dotTopValue: [a, b], | 
|         }); | 
|         if (left + right <= maxRange) { | 
|             this.setData({ | 
|                 lineLeft: cut(left + halfBlock), | 
|                 lineRight: cut(right + halfBlock), | 
|             }); | 
|         } | 
|         else { | 
|             this.setData({ | 
|                 lineLeft: cut(maxRange + halfBlock - right), | 
|                 lineRight: cut(maxRange - left + halfBlock * 1.5), | 
|             }); | 
|         } | 
|     } | 
|     onTouchEnd(e) { | 
|         this.triggerEvent('dragend', { e }); | 
|     } | 
|     getPagePosition(touch) { | 
|         const { pageX, pageY } = touch; | 
|         const { vertical } = this.properties; | 
|         return vertical ? pageY : pageX; | 
|     } | 
| }; | 
| Slider = __decorate([ | 
|     wxComponent() | 
| ], Slider); | 
| export default Slider; |