slider.js 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports["default"] = void 0;
  7. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  8. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  9. var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
  10. var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
  11. var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
  12. var _isNativeReflectConstruct2 = _interopRequireDefault(require("@babel/runtime/helpers/isNativeReflectConstruct"));
  13. var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
  14. var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
  15. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  16. var _react = _interopRequireDefault(require("react"));
  17. var _innerSlider = require("./inner-slider");
  18. var _json2mq = _interopRequireDefault(require("json2mq"));
  19. var _defaultProps = _interopRequireDefault(require("./default-props"));
  20. var _innerSliderUtils = require("./utils/innerSliderUtils");
  21. function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, (0, _isNativeReflectConstruct2["default"])() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
  22. var Slider = exports["default"] = /*#__PURE__*/function (_React$Component) {
  23. function Slider(props) {
  24. var _this;
  25. (0, _classCallCheck2["default"])(this, Slider);
  26. _this = _callSuper(this, Slider, [props]);
  27. (0, _defineProperty2["default"])(_this, "innerSliderRefHandler", function (ref) {
  28. return _this.innerSlider = ref;
  29. });
  30. (0, _defineProperty2["default"])(_this, "slickPrev", function () {
  31. return _this.innerSlider.slickPrev();
  32. });
  33. (0, _defineProperty2["default"])(_this, "slickNext", function () {
  34. return _this.innerSlider.slickNext();
  35. });
  36. (0, _defineProperty2["default"])(_this, "slickGoTo", function (slide) {
  37. var dontAnimate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  38. return _this.innerSlider.slickGoTo(slide, dontAnimate);
  39. });
  40. (0, _defineProperty2["default"])(_this, "slickPause", function () {
  41. return _this.innerSlider.pause("paused");
  42. });
  43. (0, _defineProperty2["default"])(_this, "slickPlay", function () {
  44. return _this.innerSlider.autoPlay("play");
  45. });
  46. _this.state = {
  47. breakpoint: null
  48. };
  49. _this._responsiveMediaHandlers = [];
  50. return _this;
  51. }
  52. (0, _inherits2["default"])(Slider, _React$Component);
  53. return (0, _createClass2["default"])(Slider, [{
  54. key: "media",
  55. value: function media(query, handler) {
  56. // javascript handler for css media query
  57. var mql = window.matchMedia(query);
  58. var listener = function listener(_ref) {
  59. var matches = _ref.matches;
  60. if (matches) {
  61. handler();
  62. }
  63. };
  64. mql.addListener(listener);
  65. listener(mql);
  66. this._responsiveMediaHandlers.push({
  67. mql: mql,
  68. query: query,
  69. listener: listener
  70. });
  71. }
  72. // handles responsive breakpoints
  73. }, {
  74. key: "componentDidMount",
  75. value: function componentDidMount() {
  76. var _this2 = this;
  77. // performance monitoring
  78. //if (process.env.NODE_ENV !== 'production') {
  79. //const { whyDidYouUpdate } = require('why-did-you-update')
  80. //whyDidYouUpdate(React)
  81. //}
  82. if (this.props.responsive) {
  83. var breakpoints = this.props.responsive.map(function (breakpt) {
  84. return breakpt.breakpoint;
  85. });
  86. // sort them in increasing order of their numerical value
  87. breakpoints.sort(function (x, y) {
  88. return x - y;
  89. });
  90. breakpoints.forEach(function (breakpoint, index) {
  91. // media query for each breakpoint
  92. var bQuery;
  93. if (index === 0) {
  94. bQuery = (0, _json2mq["default"])({
  95. minWidth: 0,
  96. maxWidth: breakpoint
  97. });
  98. } else {
  99. bQuery = (0, _json2mq["default"])({
  100. minWidth: breakpoints[index - 1] + 1,
  101. maxWidth: breakpoint
  102. });
  103. }
  104. // when not using server side rendering
  105. (0, _innerSliderUtils.canUseDOM)() && _this2.media(bQuery, function () {
  106. _this2.setState({
  107. breakpoint: breakpoint
  108. });
  109. });
  110. });
  111. // Register media query for full screen. Need to support resize from small to large
  112. // convert javascript object to media query string
  113. var query = (0, _json2mq["default"])({
  114. minWidth: breakpoints.slice(-1)[0]
  115. });
  116. (0, _innerSliderUtils.canUseDOM)() && this.media(query, function () {
  117. _this2.setState({
  118. breakpoint: null
  119. });
  120. });
  121. }
  122. }
  123. }, {
  124. key: "componentWillUnmount",
  125. value: function componentWillUnmount() {
  126. this._responsiveMediaHandlers.forEach(function (obj) {
  127. obj.mql.removeListener(obj.listener);
  128. });
  129. }
  130. }, {
  131. key: "render",
  132. value: function render() {
  133. var _this3 = this;
  134. var settings;
  135. var newProps;
  136. if (this.state.breakpoint) {
  137. newProps = this.props.responsive.filter(function (resp) {
  138. return resp.breakpoint === _this3.state.breakpoint;
  139. });
  140. settings = newProps[0].settings === "unslick" ? "unslick" : (0, _objectSpread2["default"])((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _defaultProps["default"]), this.props), newProps[0].settings);
  141. } else {
  142. settings = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _defaultProps["default"]), this.props);
  143. }
  144. // force scrolling by one if centerMode is on
  145. if (settings.centerMode) {
  146. if (settings.slidesToScroll > 1 && process.env.NODE_ENV !== "production") {
  147. console.warn("slidesToScroll should be equal to 1 in centerMode, you are using ".concat(settings.slidesToScroll));
  148. }
  149. settings.slidesToScroll = 1;
  150. }
  151. // force showing one slide and scrolling by one if the fade mode is on
  152. if (settings.fade) {
  153. if (settings.slidesToShow > 1 && process.env.NODE_ENV !== "production") {
  154. console.warn("slidesToShow should be equal to 1 when fade is true, you're using ".concat(settings.slidesToShow));
  155. }
  156. if (settings.slidesToScroll > 1 && process.env.NODE_ENV !== "production") {
  157. console.warn("slidesToScroll should be equal to 1 when fade is true, you're using ".concat(settings.slidesToScroll));
  158. }
  159. settings.slidesToShow = 1;
  160. settings.slidesToScroll = 1;
  161. }
  162. // makes sure that children is an array, even when there is only 1 child
  163. var children = _react["default"].Children.toArray(this.props.children);
  164. // Children may contain false or null, so we should filter them
  165. // children may also contain string filled with spaces (in certain cases where we use jsx strings)
  166. children = children.filter(function (child) {
  167. if (typeof child === "string") {
  168. return !!child.trim();
  169. }
  170. return !!child;
  171. });
  172. // rows and slidesPerRow logic is handled here
  173. if (settings.variableWidth && (settings.rows > 1 || settings.slidesPerRow > 1)) {
  174. console.warn("variableWidth is not supported in case of rows > 1 or slidesPerRow > 1");
  175. settings.variableWidth = false;
  176. }
  177. var newChildren = [];
  178. var currentWidth = null;
  179. for (var i = 0; i < children.length; i += settings.rows * settings.slidesPerRow) {
  180. var newSlide = [];
  181. for (var j = i; j < i + settings.rows * settings.slidesPerRow; j += settings.slidesPerRow) {
  182. var row = [];
  183. for (var k = j; k < j + settings.slidesPerRow; k += 1) {
  184. if (settings.variableWidth && children[k].props.style) {
  185. currentWidth = children[k].props.style.width;
  186. }
  187. if (k >= children.length) break;
  188. row.push( /*#__PURE__*/_react["default"].cloneElement(children[k], {
  189. key: 100 * i + 10 * j + k,
  190. tabIndex: -1,
  191. style: {
  192. width: "".concat(100 / settings.slidesPerRow, "%"),
  193. display: "inline-block"
  194. }
  195. }));
  196. }
  197. newSlide.push( /*#__PURE__*/_react["default"].createElement("div", {
  198. key: 10 * i + j
  199. }, row));
  200. }
  201. if (settings.variableWidth) {
  202. newChildren.push( /*#__PURE__*/_react["default"].createElement("div", {
  203. key: i,
  204. style: {
  205. width: currentWidth
  206. }
  207. }, newSlide));
  208. } else {
  209. newChildren.push( /*#__PURE__*/_react["default"].createElement("div", {
  210. key: i
  211. }, newSlide));
  212. }
  213. }
  214. if (settings === "unslick") {
  215. var className = "regular slider " + (this.props.className || "");
  216. return /*#__PURE__*/_react["default"].createElement("div", {
  217. className: className
  218. }, children);
  219. } else if (newChildren.length <= settings.slidesToShow && !settings.infinite) {
  220. settings.unslick = true;
  221. }
  222. return /*#__PURE__*/_react["default"].createElement(_innerSlider.InnerSlider, (0, _extends2["default"])({
  223. style: this.props.style,
  224. ref: this.innerSliderRefHandler
  225. }, (0, _innerSliderUtils.filterSettings)(settings)), newChildren);
  226. }
  227. }]);
  228. }(_react["default"].Component);