UNPKG

@researchgate/react-intersection-list

Version:

React List Component using the Intersection Observer API

245 lines (188 loc) 9.72 kB
"use strict"; exports.__esModule = true; exports["default"] = void 0; var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _warning = _interopRequireDefault(require("warning")); var _Sentinel = _interopRequireDefault(require("./Sentinel")); var _utils = require("./utils"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var AXIS_CSS_MAP = { x: 'overflowX', y: 'overflowY' }; var List = /*#__PURE__*/function (_PureComponent) { _inheritsLoose(List, _PureComponent); var _super = _createSuper(List); function List() { var _this; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _PureComponent.call.apply(_PureComponent, [this].concat(args)) || this; _defineProperty(_assertThisInitialized(_this), "state", { size: 0 }); _defineProperty(_assertThisInitialized(_this), "setRef", function (callback) { var prevRootNode; _this.setRootNode = function (node) { if (node !== prevRootNode) { prevRootNode = node; var overflow = window.getComputedStyle(node)[AXIS_CSS_MAP[_this.props.axis]]; callback(['auto', 'scroll', 'overlay'].indexOf(overflow) !== -1 ? node : null); } }; }); _defineProperty(_assertThisInitialized(_this), "handleUpdate", function (_ref) { var isIntersecting = _ref.isIntersecting; var _this$props = _this.props, awaitMore = _this$props.awaitMore, onIntersection = _this$props.onIntersection; var _this$state = _this.state, size = _this$state.size, itemCount = _this$state.itemCount, pageSize = _this$state.pageSize; if (!_this.prematureIntersectionChecked) { _this.prematureIntersectionChecked = true; (0, _warning["default"])(!isIntersecting, 'ReactIntersectionList: the sentinel detected a viewport with a bigger size than the size of its items. ' + 'This could lead to detrimental behavior, e.g.: triggering more than one onIntersection callback at the start.\n' + 'To prevent this, use either a bigger `pageSize` value or avoid using the prop awaitMore initially.'); } if (isIntersecting) { var nextSize = (0, _utils.computeSize)(size + pageSize, itemCount); if (size !== nextSize) { _this.setState({ size: nextSize }); } if (onIntersection && (!awaitMore || _this.awaitIntersection)) { if (_this.awaitIntersection) { _this.awaitIntersection = false; } onIntersection(nextSize, pageSize); } } }); return _this; } List.getDerivedStateFromProps = function getDerivedStateFromProps(_ref2, prevState) { var pageSize = _ref2.pageSize, props = _objectWithoutPropertiesLoose(_ref2, ["pageSize"]); var itemCount = (0, _utils.getItemCount)(props, true); var newSize; if (prevState.size === 0) { newSize = pageSize; } else { if (prevState.itemCount < itemCount) { newSize = prevState.size + pageSize; } else { newSize = prevState.size + -(prevState.pageSize - pageSize); } } return { pageSize: pageSize, itemCount: itemCount, size: (0, _utils.computeSize)(newSize, itemCount) }; }; var _proto = List.prototype; _proto.componentDidMount = function componentDidMount() { this.prematureIntersectionChecked = this.state.size === 0; }; _proto.getItemRenderer = function getItemRenderer() { var _this$props2 = this.props, children = _this$props2.children, renderItem = _this$props2.renderItem; var hasChildren = typeof children !== 'undefined'; var hasRender = typeof renderItem !== 'undefined'; (0, _warning["default"])(!(hasChildren && hasRender), 'ReactIntersectionList: cannot use children and renderItem props as render function at the same time.'); if (hasChildren) { return children; } return hasRender ? renderItem : function (index, key) { return /*#__PURE__*/_react["default"].createElement("div", { key: key }, index); }; }; _proto.renderItems = function renderItems() { var _this2 = this; var _this$props3 = this.props, awaitMore = _this$props3.awaitMore, axis = _this$props3.axis, initialIndex = _this$props3.initialIndex, itemsRenderer = _this$props3.itemsRenderer, threshold = _this$props3.threshold; var _this$state2 = this.state, size = _this$state2.size, itemCount = _this$state2.itemCount; var itemRenderer = this.getItemRenderer(); var items = []; for (var i = 0; i < size; ++i) { items.push(itemRenderer(initialIndex + i, i)); } var sentinel; if (size < itemCount || awaitMore) { sentinel = /*#__PURE__*/_react["default"].createElement(_Sentinel["default"], { key: "sentinel", threshold: threshold, axis: axis, setRef: this.setRef, onChange: this.handleUpdate }); items.push(sentinel); if (awaitMore) { this.awaitIntersection = true; } } return itemsRenderer(items, function (node) { if (node && sentinel) { _this2.setRootNode(node); } }); }; _proto.render = function render() { return this.renderItems(); }; return List; }(_react.PureComponent); _defineProperty(List, "defaultProps", { axis: 'y', initialIndex: 0, itemsRenderer: function itemsRenderer(items, ref) { return /*#__PURE__*/_react["default"].createElement("div", { ref: ref }, items); }, pageSize: 10, threshold: '100px' }); process.env.NODE_ENV !== "production" ? List.propTypes = { awaitMore: _propTypes["default"].bool, axis: _propTypes["default"].oneOf(['x', 'y']), children: _propTypes["default"].func, initialIndex: _propTypes["default"].number, items: function items(props, propName) { var object = props[propName]; if (object != null && !(Array.isArray(object) || typeof object[Symbol.iterator] === 'function')) { return new Error("`" + propName + "` must be of type Array or a native type implementing the iterable interface"); } return undefined; }, itemCount: _propTypes["default"].number, itemsRenderer: _propTypes["default"].func, onIntersection: _propTypes["default"].func, pageSize: _propTypes["default"].number, renderItem: _propTypes["default"].func, threshold: _propTypes["default"].string } : void 0; var _default = List; exports["default"] = _default;