react-film
Version:
React component for showing carousel just like a film strip
91 lines (79 loc) • 9.05 kB
JavaScript
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
import _regeneratorRuntime from "@babel/runtime/regenerator";
import "core-js/modules/es.object.to-string.js";
import "core-js/modules/es.promise.js";
import "core-js/modules/web.timers.js";
/* eslint no-magic-numbers: ["error", { "ignore": [0, 100] }] */
import memoize from 'memoize-one';
import { useEffect } from 'react';
import debounce from '../../util/debounce';
function sleepZero() {
return new Promise(function (resolve) {
return setTimeout(function () {
return resolve();
});
});
}
export default function useObserveScrollLeft(callbackRefWithSubscribe, observer) {
useEffect(function () {
return callbackRefWithSubscribe.subscribe(function (current) {
if (!current) {
return;
}
var memoizedEmitValue = memoize(function (initial, fraction, width) {
return observer && observer({
initial: initial,
fraction: fraction,
width: width
});
});
var emitValue = function emitValue(initial) {
var offsetWidth = current.offsetWidth,
scrollLeft = current.scrollLeft,
scrollWidth = current.scrollWidth;
memoizedEmitValue(initial, "".concat(scrollWidth === offsetWidth ? 0 : scrollLeft / (scrollWidth - offsetWidth) * 100, "%"), "".concat(offsetWidth / scrollWidth * 100, "%"));
};
var handleScroll = function handleScroll() {
return emitValue(false);
};
var handlePointerOver = debounce(function () {
// We need to send "onScroll" because "scrollWidth" might have changed
// For example, the container resized, the scroll width will be incorrect
// We will debounce to prevent "pointerOver" calculating too often
// We will memoize to prevent firing unnecessary "onScroll"
emitValue(false);
});
current.addEventListener('pointerover', handlePointerOver, {
passive: true
});
current.addEventListener('scroll', handleScroll, {
passive: true
}); // eslint-disable-next-line wrap-iife
_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (!(current.scrollWidth === current.offsetWidth)) {
_context.next = 3;
break;
}
_context.next = 3;
return sleepZero();
case 3:
emitValue(true);
case 4:
case "end":
return _context.stop();
}
}
}, _callee);
}))();
return function () {
current.removeEventListener('pointerover', handlePointerOver);
current.removeEventListener('scroll', handleScroll);
};
});
}, [callbackRefWithSubscribe, observer]);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9ob29rcy9pbnRlcm5hbC91c2VPYnNlcnZlU2Nyb2xsTGVmdC5qcyJdLCJuYW1lcyI6WyJtZW1vaXplIiwidXNlRWZmZWN0IiwiZGVib3VuY2UiLCJzbGVlcFplcm8iLCJQcm9taXNlIiwicmVzb2x2ZSIsInNldFRpbWVvdXQiLCJ1c2VPYnNlcnZlU2Nyb2xsTGVmdCIsImNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZSIsIm9ic2VydmVyIiwic3Vic2NyaWJlIiwiY3VycmVudCIsIm1lbW9pemVkRW1pdFZhbHVlIiwiaW5pdGlhbCIsImZyYWN0aW9uIiwid2lkdGgiLCJlbWl0VmFsdWUiLCJvZmZzZXRXaWR0aCIsInNjcm9sbExlZnQiLCJzY3JvbGxXaWR0aCIsImhhbmRsZVNjcm9sbCIsImhhbmRsZVBvaW50ZXJPdmVyIiwiYWRkRXZlbnRMaXN0ZW5lciIsInBhc3NpdmUiLCJyZW1vdmVFdmVudExpc3RlbmVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUVBLE9BQU9BLE9BQVAsTUFBb0IsYUFBcEI7QUFDQSxTQUFTQyxTQUFULFFBQTBCLE9BQTFCO0FBRUEsT0FBT0MsUUFBUCxNQUFxQixxQkFBckI7O0FBRUEsU0FBU0MsU0FBVCxHQUFxQjtBQUNuQixTQUFPLElBQUlDLE9BQUosQ0FBWSxVQUFBQyxPQUFPO0FBQUEsV0FBSUMsVUFBVSxDQUFDO0FBQUEsYUFBTUQsT0FBTyxFQUFiO0FBQUEsS0FBRCxDQUFkO0FBQUEsR0FBbkIsQ0FBUDtBQUNEOztBQUVELGVBQWUsU0FBU0Usb0JBQVQsQ0FBOEJDLHdCQUE5QixFQUF3REMsUUFBeEQsRUFBa0U7QUFDL0VSLEVBQUFBLFNBQVMsQ0FDUDtBQUFBLFdBQ0VPLHdCQUF3QixDQUFDRSxTQUF6QixDQUFtQyxVQUFBQyxPQUFPLEVBQUk7QUFDNUMsVUFBSSxDQUFDQSxPQUFMLEVBQWM7QUFDWjtBQUNEOztBQUVELFVBQU1DLGlCQUFpQixHQUFHWixPQUFPLENBQy9CLFVBQUNhLE9BQUQsRUFBVUMsUUFBVixFQUFvQkMsS0FBcEI7QUFBQSxlQUE4Qk4sUUFBUSxJQUFJQSxRQUFRLENBQUM7QUFBRUksVUFBQUEsT0FBTyxFQUFQQSxPQUFGO0FBQVdDLFVBQUFBLFFBQVEsRUFBUkEsUUFBWDtBQUFxQkMsVUFBQUEsS0FBSyxFQUFMQTtBQUFyQixTQUFELENBQWxEO0FBQUEsT0FEK0IsQ0FBakM7O0FBSUEsVUFBTUMsU0FBUyxHQUFHLFNBQVpBLFNBQVksQ0FBQUgsT0FBTyxFQUFJO0FBQzNCLFlBQVFJLFdBQVIsR0FBaUROLE9BQWpELENBQVFNLFdBQVI7QUFBQSxZQUFxQkMsVUFBckIsR0FBaURQLE9BQWpELENBQXFCTyxVQUFyQjtBQUFBLFlBQWlDQyxXQUFqQyxHQUFpRFIsT0FBakQsQ0FBaUNRLFdBQWpDO0FBRUFQLFFBQUFBLGlCQUFpQixDQUNmQyxPQURlLFlBRVpNLFdBQVcsS0FBS0YsV0FBaEIsR0FBOEIsQ0FBOUIsR0FBbUNDLFVBQVUsSUFBSUMsV0FBVyxHQUFHRixXQUFsQixDQUFYLEdBQTZDLEdBRm5FLGtCQUdYQSxXQUFXLEdBQUdFLFdBQWYsR0FBOEIsR0FIbEIsT0FBakI7QUFLRCxPQVJEOztBQVVBLFVBQU1DLFlBQVksR0FBRyxTQUFmQSxZQUFlO0FBQUEsZUFBTUosU0FBUyxDQUFDLEtBQUQsQ0FBZjtBQUFBLE9BQXJCOztBQUVBLFVBQU1LLGlCQUFpQixHQUFHbkIsUUFBUSxDQUFDLFlBQU07QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQWMsUUFBQUEsU0FBUyxDQUFDLEtBQUQsQ0FBVDtBQUNELE9BTmlDLENBQWxDO0FBUUFMLE1BQUFBLE9BQU8sQ0FBQ1csZ0JBQVIsQ0FBeUIsYUFBekIsRUFBd0NELGlCQUF4QyxFQUEyRDtBQUFFRSxRQUFBQSxPQUFPLEVBQUU7QUFBWCxPQUEzRDtBQUNBWixNQUFBQSxPQUFPLENBQUNXLGdCQUFSLENBQXlCLFFBQXpCLEVBQW1DRixZQUFuQyxFQUFpRDtBQUFFRyxRQUFBQSxPQUFPLEVBQUU7QUFBWCxPQUFqRCxFQTlCNEMsQ0FnQzVDOztBQUNBLCtEQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxzQkFDS1osT0FBTyxDQUFDUSxXQUFSLEtBQXdCUixPQUFPLENBQUNNLFdBRHJDO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEsdUJBR1NkLFNBQVMsRUFIbEI7O0FBQUE7QUFNQ2EsZ0JBQUFBLFNBQVMsQ0FBQyxJQUFELENBQVQ7O0FBTkQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsT0FBRDs7QUFTQSxhQUFPLFlBQU07QUFDWEwsUUFBQUEsT0FBTyxDQUFDYSxtQkFBUixDQUE0QixhQUE1QixFQUEyQ0gsaUJBQTNDO0FBQ0FWLFFBQUFBLE9BQU8sQ0FBQ2EsbUJBQVIsQ0FBNEIsUUFBNUIsRUFBc0NKLFlBQXRDO0FBQ0QsT0FIRDtBQUlELEtBOUNELENBREY7QUFBQSxHQURPLEVBaURQLENBQUNaLHdCQUFELEVBQTJCQyxRQUEzQixDQWpETyxDQUFUO0FBbUREIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IG5vLW1hZ2ljLW51bWJlcnM6IFtcImVycm9yXCIsIHsgXCJpZ25vcmVcIjogWzAsIDEwMF0gfV0gKi9cblxuaW1wb3J0IG1lbW9pemUgZnJvbSAnbWVtb2l6ZS1vbmUnO1xuaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgZGVib3VuY2UgZnJvbSAnLi4vLi4vdXRpbC9kZWJvdW5jZSc7XG5cbmZ1bmN0aW9uIHNsZWVwWmVybygpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCkpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlT2JzZXJ2ZVNjcm9sbExlZnQoY2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlLCBvYnNlcnZlcikge1xuICB1c2VFZmZlY3QoXG4gICAgKCkgPT5cbiAgICAgIGNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZS5zdWJzY3JpYmUoY3VycmVudCA9PiB7XG4gICAgICAgIGlmICghY3VycmVudCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1lbW9pemVkRW1pdFZhbHVlID0gbWVtb2l6ZShcbiAgICAgICAgICAoaW5pdGlhbCwgZnJhY3Rpb24sIHdpZHRoKSA9PiBvYnNlcnZlciAmJiBvYnNlcnZlcih7IGluaXRpYWwsIGZyYWN0aW9uLCB3aWR0aCB9KVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGVtaXRWYWx1ZSA9IGluaXRpYWwgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgb2Zmc2V0V2lkdGgsIHNjcm9sbExlZnQsIHNjcm9sbFdpZHRoIH0gPSBjdXJyZW50O1xuXG4gICAgICAgICAgbWVtb2l6ZWRFbWl0VmFsdWUoXG4gICAgICAgICAgICBpbml0aWFsLFxuICAgICAgICAgICAgYCR7c2Nyb2xsV2lkdGggPT09IG9mZnNldFdpZHRoID8gMCA6IChzY3JvbGxMZWZ0IC8gKHNjcm9sbFdpZHRoIC0gb2Zmc2V0V2lkdGgpKSAqIDEwMH0lYCxcbiAgICAgICAgICAgIGAkeyhvZmZzZXRXaWR0aCAvIHNjcm9sbFdpZHRoKSAqIDEwMH0lYFxuICAgICAgICAgICk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgaGFuZGxlU2Nyb2xsID0gKCkgPT4gZW1pdFZhbHVlKGZhbHNlKTtcblxuICAgICAgICBjb25zdCBoYW5kbGVQb2ludGVyT3ZlciA9IGRlYm91bmNlKCgpID0+IHtcbiAgICAgICAgICAvLyBXZSBuZWVkIHRvIHNlbmQgXCJvblNjcm9sbFwiIGJlY2F1c2UgXCJzY3JvbGxXaWR0aFwiIG1pZ2h0IGhhdmUgY2hhbmdlZFxuICAgICAgICAgIC8vIEZvciBleGFtcGxlLCB0aGUgY29udGFpbmVyIHJlc2l6ZWQsIHRoZSBzY3JvbGwgd2lkdGggd2lsbCBiZSBpbmNvcnJlY3RcbiAgICAgICAgICAvLyBXZSB3aWxsIGRlYm91bmNlIHRvIHByZXZlbnQgXCJwb2ludGVyT3ZlclwiIGNhbGN1bGF0aW5nIHRvbyBvZnRlblxuICAgICAgICAgIC8vIFdlIHdpbGwgbWVtb2l6ZSB0byBwcmV2ZW50IGZpcmluZyB1bm5lY2Vzc2FyeSBcIm9uU2Nyb2xsXCJcbiAgICAgICAgICBlbWl0VmFsdWUoZmFsc2UpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjdXJyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJvdmVyJywgaGFuZGxlUG9pbnRlck92ZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgY3VycmVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBoYW5kbGVTY3JvbGwsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgd3JhcC1paWZlXG4gICAgICAgIChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQuc2Nyb2xsV2lkdGggPT09IGN1cnJlbnQub2Zmc2V0V2lkdGgpIHtcbiAgICAgICAgICAgIC8vIEhBQ0s6IENocm9tZSA2NiB3aWxsIGluaXRpYWxseSBzYXkgc2Nyb2xsV2lkdGggZXF1YWxzIHRvIG9mZnNldFdpZHRoLCB1bnRpbCBzb21lIHRpbWUgbGF0ZXJcbiAgICAgICAgICAgIGF3YWl0IHNsZWVwWmVybygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVtaXRWYWx1ZSh0cnVlKTtcbiAgICAgICAgfSkoKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIGN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcm92ZXInLCBoYW5kbGVQb2ludGVyT3Zlcik7XG4gICAgICAgICAgY3VycmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBoYW5kbGVTY3JvbGwpO1xuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgW2NhbGxiYWNrUmVmV2l0aFN1YnNjcmliZSwgb2JzZXJ2ZXJdXG4gICk7XG59XG4iXX0=