react-view-pager
Version:
View-Pager/Slider/Carousel powered by React Motion.
150 lines (123 loc) • 4.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _View = require('./View');
var _View2 = _interopRequireDefault(_View);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var Views = function () {
function Views(axis, viewsToShow, infinite) {
_classCallCheck(this, Views);
this.size = 0;
this.axis = axis;
this.viewsToShow = viewsToShow;
this.infinite = infinite;
this.collection = [];
}
_createClass(Views, [{
key: 'setFrame',
value: function setFrame(frame) {
this.frame = frame;
}
}, {
key: 'setTrack',
value: function setTrack(track) {
this.track = track;
}
}, {
key: 'addView',
value: function addView(options) {
var lastView = this.collection[options.index - 1];
var view = new _View2.default(_extends({
axis: this.axis,
track: this.track
}, options));
// add view to collection
this.collection.push(view);
// calculate the size of the slider as views are added
this.size += view.getSize();
// hydrate positions every time a new view is added
this.setPositions();
}
}, {
key: 'removeView',
value: function removeView(node) {
// subtract this view from full size
this.size -= view.getSize();
}
}, {
key: 'setPositions',
value: function setPositions() {
var _this = this;
// bail if frame or track haven't been set yet
if (!this.frame && !this.track) return;
var frameSize = this.frame.getSize();
var trackSize = this.getTotalSize();
var trackPosition = this.track.getPosition();
var startCoords = { top: 0, left: 0 };
this.collection.reduce(function (lastView, view) {
var lastPosition = lastView && lastView.getCoords().original || 0;
var nextPosition = lastPosition + view.getSize() / (_this.viewsToShow || 1);
var offsetPosition = lastPosition;
// offset slides in the proper position when wrapping
if (_this.infinite) {
if (nextPosition < Math.abs(trackPosition)) {
offsetPosition += trackSize;
} else if (lastPosition > frameSize - trackPosition) {
offsetPosition -= trackSize;
}
}
view.setCoords({
original: nextPosition,
offset: {
pixel: offsetPosition,
percent: _this.getPercentValue(offsetPosition)
}
});
return view;
}, null);
}
}, {
key: 'getTotalSize',
value: function getTotalSize() {
var _this2 = this;
if (this.viewsToShow) {
return this.frame.getSize() / this.viewsToShow * this.collection.length;
} else {
var _ret = function () {
var dimension = _this2.axis === 'x' ? 'width' : 'height';
var size = 0;
_this2.collection.forEach(function (view) {
size += view[dimension];
});
return {
v: size
};
}();
if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v;
}
}
}, {
key: 'getStartCoords',
value: function getStartCoords(index) {
var _this3 = this;
var target = 0;
this.collection.slice(0, index).forEach(function (view) {
target -= view.getSize() / (_this3.viewsToShow || 1);
});
return target;
}
}, {
key: 'getPercentValue',
value: function getPercentValue(position) {
return Math.round(position / this.frame.getSize() * 10000) * 0.01;
}
}]);
return Views;
}();
exports.default = Views;
module.exports = exports['default'];