"use strict"; exports.__esModule = true; exports.default = void 0; var _utils = require("../utils"); var _style = require("../utils/dom/style"); var _event = require("../utils/dom/event"); var _raf = require("../utils/dom/raf"); var _number = require("../utils/format/number"); var _touch = require("../mixins/touch"); var _relation = require("../mixins/relation"); var _bindEvent = require("../mixins/bind-event"); // Utils // Mixins var _createNamespace = (0, _utils.createNamespace)('swipe'), createComponent = _createNamespace[0], bem = _createNamespace[1]; var _default = createComponent({ mixins: [_touch.TouchMixin, (0, _relation.ParentMixin)('vanSwipe'), (0, _bindEvent.BindEventMixin)(function (bind, isBind) { bind(window, 'resize', this.resize, true); bind(window, 'orientationchange', this.resize, true); bind(window, 'visibilitychange', this.onVisibilityChange); if (isBind) { this.initialize(); } else { this.clear(); } })], props: { width: [Number, String], height: [Number, String], autoplay: [Number, String], vertical: Boolean, lazyRender: Boolean, indicatorColor: String, loop: { type: Boolean, default: true }, duration: { type: [Number, String], default: 500 }, touchable: { type: Boolean, default: true }, initialSwipe: { type: [Number, String], default: 0 }, showIndicators: { type: Boolean, default: true }, stopPropagation: { type: Boolean, default: true } }, data: function data() { return { rect: null, offset: 0, active: 0, deltaX: 0, deltaY: 0, swiping: false, computedWidth: 0, computedHeight: 0 }; }, watch: { children: function children() { this.initialize(); }, initialSwipe: function initialSwipe() { this.initialize(); }, autoplay: function autoplay(_autoplay) { if (_autoplay > 0) { this.autoPlay(); } else { this.clear(); } } }, computed: { count: function count() { return this.children.length; }, maxCount: function maxCount() { return Math.ceil(Math.abs(this.minOffset) / this.size); }, delta: function delta() { return this.vertical ? this.deltaY : this.deltaX; }, size: function size() { return this[this.vertical ? 'computedHeight' : 'computedWidth']; }, trackSize: function trackSize() { return this.count * this.size; }, activeIndicator: function activeIndicator() { return (this.active + this.count) % this.count; }, isCorrectDirection: function isCorrectDirection() { var expect = this.vertical ? 'vertical' : 'horizontal'; return this.direction === expect; }, trackStyle: function trackStyle() { var style = { transitionDuration: (this.swiping ? 0 : this.duration) + "ms", transform: "translate" + (this.vertical ? 'Y' : 'X') + "(" + this.offset + "px)" }; if (this.size) { var mainAxis = this.vertical ? 'height' : 'width'; var crossAxis = this.vertical ? 'width' : 'height'; style[mainAxis] = this.trackSize + "px"; style[crossAxis] = this[crossAxis] ? this[crossAxis] + "px" : ''; } return style; }, indicatorStyle: function indicatorStyle() { return { backgroundColor: this.indicatorColor }; }, minOffset: function minOffset() { return (this.vertical ? this.rect.height : this.rect.width) - this.size * this.count; } }, mounted: function mounted() { this.bindTouchEvent(this.$refs.track); }, methods: { // initialize swipe position initialize: function initialize(active) { if (active === void 0) { active = +this.initialSwipe; } if (!this.$el || (0, _style.isHidden)(this.$el)) { return; } clearTimeout(this.timer); var rect = { width: this.$el.offsetWidth, height: this.$el.offsetHeight }; this.rect = rect; this.swiping = true; this.active = active; this.computedWidth = +this.width || rect.width; this.computedHeight = +this.height || rect.height; this.offset = this.getTargetOffset(active); this.children.forEach(function (swipe) { swipe.offset = 0; }); this.autoPlay(); }, // @exposed-api resize: function resize() { this.initialize(this.activeIndicator); }, onVisibilityChange: function onVisibilityChange() { if (document.hidden) { this.clear(); } else { this.autoPlay(); } }, onTouchStart: function onTouchStart(event) { if (!this.touchable) return; this.clear(); this.touchStartTime = Date.now(); this.touchStart(event); this.correctPosition(); }, onTouchMove: function onTouchMove(event) { if (!this.touchable || !this.swiping) return; this.touchMove(event); if (this.isCorrectDirection) { (0, _event.preventDefault)(event, this.stopPropagation); this.move({ offset: this.delta }); } }, onTouchEnd: function onTouchEnd() { if (!this.touchable || !this.swiping) return; var size = this.size, delta = this.delta; var duration = Date.now() - this.touchStartTime; var speed = delta / duration; var shouldSwipe = Math.abs(speed) > 0.25 || Math.abs(delta) > size / 2; if (shouldSwipe && this.isCorrectDirection) { var offset = this.vertical ? this.offsetY : this.offsetX; var pace = 0; if (this.loop) { pace = offset > 0 ? delta > 0 ? -1 : 1 : 0; } else { pace = -Math[delta > 0 ? 'ceil' : 'floor'](delta / size); } this.move({ pace: pace, emitChange: true }); } else if (delta) { this.move({ pace: 0 }); } this.swiping = false; this.autoPlay(); }, getTargetActive: function getTargetActive(pace) { var active = this.active, count = this.count, maxCount = this.maxCount; if (pace) { if (this.loop) { return (0, _number.range)(active + pace, -1, count); } return (0, _number.range)(active + pace, 0, maxCount); } return active; }, getTargetOffset: function getTargetOffset(targetActive, offset) { if (offset === void 0) { offset = 0; } var currentPosition = targetActive * this.size; if (!this.loop) { currentPosition = Math.min(currentPosition, -this.minOffset); } var targetOffset = offset - currentPosition; if (!this.loop) { targetOffset = (0, _number.range)(targetOffset, this.minOffset, 0); } return targetOffset; }, move: function move(_ref) { var _ref$pace = _ref.pace, pace = _ref$pace === void 0 ? 0 : _ref$pace, _ref$offset = _ref.offset, offset = _ref$offset === void 0 ? 0 : _ref$offset, emitChange = _ref.emitChange; var loop = this.loop, count = this.count, active = this.active, children = this.children, trackSize = this.trackSize, minOffset = this.minOffset; if (count <= 1) { return; } var targetActive = this.getTargetActive(pace); var targetOffset = this.getTargetOffset(targetActive, offset); // auto move first and last swipe in loop mode if (loop) { if (children[0] && targetOffset !== minOffset) { var outRightBound = targetOffset < minOffset; children[0].offset = outRightBound ? trackSize : 0; } if (children[count - 1] && targetOffset !== 0) { var outLeftBound = targetOffset > 0; children[count - 1].offset = outLeftBound ? -trackSize : 0; } } this.active = targetActive; this.offset = targetOffset; if (emitChange && targetActive !== active) { this.$emit('change', this.activeIndicator); } }, // @exposed-api prev: function prev() { var _this = this; this.correctPosition(); this.resetTouchStatus(); (0, _raf.doubleRaf)(function () { _this.swiping = false; _this.move({ pace: -1, emitChange: true }); }); }, // @exposed-api next: function next() { var _this2 = this; this.correctPosition(); this.resetTouchStatus(); (0, _raf.doubleRaf)(function () { _this2.swiping = false; _this2.move({ pace: 1, emitChange: true }); }); }, // @exposed-api swipeTo: function swipeTo(index, options) { var _this3 = this; if (options === void 0) { options = {}; } this.correctPosition(); this.resetTouchStatus(); (0, _raf.doubleRaf)(function () { var targetIndex; if (_this3.loop && index === _this3.count) { targetIndex = _this3.active === 0 ? 0 : index; } else { targetIndex = index % _this3.count; } if (options.immediate) { (0, _raf.doubleRaf)(function () { _this3.swiping = false; }); } else { _this3.swiping = false; } _this3.move({ pace: targetIndex - _this3.active, emitChange: true }); }); }, correctPosition: function correctPosition() { this.swiping = true; if (this.active <= -1) { this.move({ pace: this.count }); } if (this.active >= this.count) { this.move({ pace: -this.count }); } }, clear: function clear() { clearTimeout(this.timer); }, autoPlay: function autoPlay() { var _this4 = this; var autoplay = this.autoplay; if (autoplay > 0 && this.count > 1) { this.clear(); this.timer = setTimeout(function () { _this4.next(); _this4.autoPlay(); }, autoplay); } }, genIndicator: function genIndicator() { var _this5 = this; var h = this.$createElement; var count = this.count, activeIndicator = this.activeIndicator; var slot = this.slots('indicator'); if (slot) { return slot; } if (this.showIndicators && count > 1) { return h("div", { "class": bem('indicators', { vertical: this.vertical }) }, [Array.apply(void 0, Array(count)).map(function (empty, index) { return h("i", { "class": bem('indicator', { active: index === activeIndicator }), "style": index === activeIndicator ? _this5.indicatorStyle : null }); })]); } } }, render: function render() { var h = arguments[0]; return h("div", { "class": bem() }, [h("div", { "ref": "track", "style": this.trackStyle, "class": bem('track', { vertical: this.vertical }) }, [this.slots()]), this.genIndicator()]); } }); exports.default = _default;