UNPKG

react-native-big-list-fixed

Version:

A big and fast list implementation for react-native with a recycler API focused on performance and ram usage while processing thousand items on the list.

124 lines (119 loc) 3.93 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.processBlock = exports.mergeViewStyle = exports.isNumeric = exports.createElement = exports.autobind = void 0; var _react = _interopRequireDefault(require("react")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } /** * Is numeric. * @param {any} num * @returns {boolean} */ const isNumeric = num => { return !isNaN(parseFloat(num)) && isFinite(num); }; /** * Process block. * @param {number} containerHeight * @param {number} scrollTop * @param {number|null|undefined} batchSizeThreshold * @returns {{blockStart: number, batchSize: number, blockEnd: number}} */ exports.isNumeric = isNumeric; const processBlock = ({ containerHeight, scrollTop, batchSizeThreshold = 1 }) => { if (containerHeight === 0) { return { batchSize: 0, blockStart: 0, blockEnd: 0 }; } const batchSize = Math.ceil(containerHeight * Math.max(0.5, batchSizeThreshold)); const blockNumber = Math.ceil(scrollTop / batchSize); const blockStart = batchSize * blockNumber; const blockEnd = blockStart + batchSize; return { batchSize, blockStart, blockEnd }; }; /** * Autobind context to class methods. * @param {object} self * @returns {{}} */ exports.processBlock = processBlock; const autobind = (self = {}) => { const exclude = ["componentWillMount", /UNSAFE_.*/, "render", "getSnapshotBeforeUpdate", "componentDidMount", "componentWillReceiveProps", "shouldComponentUpdate", "componentWillUpdate", "componentDidUpdate", "componentWillUnmount", "componentDidCatch", "setState", "forceUpdate"]; const filter = key => { const match = pattern => typeof pattern === "string" ? key === pattern : pattern.test(key); if (exclude) { return !exclude.some(match); } return true; }; const getAllProperties = object => { const properties = new Set(); do { for (const key of Object.getOwnPropertyNames(object).concat(Object.getOwnPropertySymbols(object))) { properties.add([object, key]); } } while ((object = Object.getPrototypeOf(object)) && object !== Object.prototype); return properties; }; for (const [object, key] of getAllProperties(self.constructor.prototype)) { if (key === "constructor" || !filter(key)) { continue; } const descriptor = Object.getOwnPropertyDescriptor(object, key); if (descriptor && typeof descriptor.value === "function") { self[key] = self[key].bind(self); } } return self; }; /** * Merge styles * @param {array|object|null|undefined} style * @param {array|object} defaultStyle * @returns {Object} */ exports.autobind = autobind; const mergeViewStyle = (style, defaultStyle = {}) => { let mergedStyle = style; if (mergedStyle == null) { mergedStyle = defaultStyle; } else if (Array.isArray(style) && Array.isArray(defaultStyle)) { const mergedDefaultStyle = [...defaultStyle]; mergedDefaultStyle.concat(style); mergedStyle = mergedDefaultStyle; } else if (Array.isArray(defaultStyle)) { const mergedDefaultStyle = [...defaultStyle]; mergedDefaultStyle.push(style); mergedStyle = mergedDefaultStyle; } else if (Array.isArray(style)) { mergedStyle = [...style]; mergedStyle.unshift(defaultStyle); } else { mergedStyle = [defaultStyle, style]; } return mergedStyle; }; /** * Get element from component. * @param {React.node} Component * @param props * @returns {JSX.Element|[]|*} */ exports.mergeViewStyle = mergeViewStyle; const createElement = (Component, props = {}) => { return Component != null ? /*#__PURE__*/_react.default.isValidElement(Component) ? (/*#__PURE__*/_react.default.cloneElement(Component, props)) : /*#__PURE__*/_react.default.createElement(Component, props) : null; }; exports.createElement = createElement; //# sourceMappingURL=utils.js.map