UNPKG

react-film

Version:

React component for showing carousel just like a film strip

60 lines (48 loc) 5.96 kB
import "core-js/modules/es.math.sign.js"; import "core-js/modules/es.date.now.js"; import "core-js/modules/es.date.to-string.js"; import { useEffect } from 'react'; function step(from, to, stepper, index) { var next = from; for (var i = 0; i < index; i++) { next = stepper(next, to); } return next; } function squareStepper(current, to) { var sign = Math.sign(to - current); var step = Math.sqrt(Math.abs(to - current)); var next = current + step * sign; if (sign > 0) { return Math.min(to, next); } return Math.max(to, next); } export default function useAnimateScrollLeft(element, to, onEnd) { useEffect(function () { if (element) { var start = Date.now(); var animator; var animate = function animate(from) { animator = requestAnimationFrame(function () { // eslint-disable-next-line no-magic-numbers var nextValue = step(from, to, squareStepper, (Date.now() - start) / 5); // eslint-disable-next-line no-magic-numbers if (Math.abs(to - nextValue) < 0.5) { nextValue = to; } element.scrollLeft = nextValue; if (to === nextValue) { onEnd && onEnd(true); } else { animate(from); } }); }; animate(element.scrollLeft); return function () { return cancelAnimationFrame(animator); }; } }, [element, to, onEnd]); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9ob29rcy9pbnRlcm5hbC91c2VBbmltYXRlU2Nyb2xsTGVmdC5qcyJdLCJuYW1lcyI6WyJ1c2VFZmZlY3QiLCJzdGVwIiwiZnJvbSIsInRvIiwic3RlcHBlciIsImluZGV4IiwibmV4dCIsImkiLCJzcXVhcmVTdGVwcGVyIiwiY3VycmVudCIsInNpZ24iLCJNYXRoIiwic3FydCIsImFicyIsIm1pbiIsIm1heCIsInVzZUFuaW1hdGVTY3JvbGxMZWZ0IiwiZWxlbWVudCIsIm9uRW5kIiwic3RhcnQiLCJEYXRlIiwibm93IiwiYW5pbWF0b3IiLCJhbmltYXRlIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwibmV4dFZhbHVlIiwic2Nyb2xsTGVmdCIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIl0sIm1hcHBpbmdzIjoiOzs7QUFBQSxTQUFTQSxTQUFULFFBQTBCLE9BQTFCOztBQUVBLFNBQVNDLElBQVQsQ0FBY0MsSUFBZCxFQUFvQkMsRUFBcEIsRUFBd0JDLE9BQXhCLEVBQWlDQyxLQUFqQyxFQUF3QztBQUN0QyxNQUFJQyxJQUFJLEdBQUdKLElBQVg7O0FBRUEsT0FBSyxJQUFJSyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHRixLQUFwQixFQUEyQkUsQ0FBQyxFQUE1QixFQUFnQztBQUM5QkQsSUFBQUEsSUFBSSxHQUFHRixPQUFPLENBQUNFLElBQUQsRUFBT0gsRUFBUCxDQUFkO0FBQ0Q7O0FBRUQsU0FBT0csSUFBUDtBQUNEOztBQUVELFNBQVNFLGFBQVQsQ0FBdUJDLE9BQXZCLEVBQWdDTixFQUFoQyxFQUFvQztBQUNsQyxNQUFNTyxJQUFJLEdBQUdDLElBQUksQ0FBQ0QsSUFBTCxDQUFVUCxFQUFFLEdBQUdNLE9BQWYsQ0FBYjtBQUNBLE1BQU1SLElBQUksR0FBR1UsSUFBSSxDQUFDQyxJQUFMLENBQVVELElBQUksQ0FBQ0UsR0FBTCxDQUFTVixFQUFFLEdBQUdNLE9BQWQsQ0FBVixDQUFiO0FBQ0EsTUFBTUgsSUFBSSxHQUFHRyxPQUFPLEdBQUdSLElBQUksR0FBR1MsSUFBOUI7O0FBRUEsTUFBSUEsSUFBSSxHQUFHLENBQVgsRUFBYztBQUNaLFdBQU9DLElBQUksQ0FBQ0csR0FBTCxDQUFTWCxFQUFULEVBQWFHLElBQWIsQ0FBUDtBQUNEOztBQUVELFNBQU9LLElBQUksQ0FBQ0ksR0FBTCxDQUFTWixFQUFULEVBQWFHLElBQWIsQ0FBUDtBQUNEOztBQUVELGVBQWUsU0FBU1Usb0JBQVQsQ0FBOEJDLE9BQTlCLEVBQXVDZCxFQUF2QyxFQUEyQ2UsS0FBM0MsRUFBa0Q7QUFDL0RsQixFQUFBQSxTQUFTLENBQUMsWUFBTTtBQUNkLFFBQUlpQixPQUFKLEVBQWE7QUFDWCxVQUFNRSxLQUFLLEdBQUdDLElBQUksQ0FBQ0MsR0FBTCxFQUFkO0FBRUEsVUFBSUMsUUFBSjs7QUFFQSxVQUFNQyxPQUFPLEdBQUcsU0FBVkEsT0FBVSxDQUFBckIsSUFBSSxFQUFJO0FBQ3RCb0IsUUFBQUEsUUFBUSxHQUFHRSxxQkFBcUIsQ0FBQyxZQUFNO0FBQ3JDO0FBQ0EsY0FBSUMsU0FBUyxHQUFHeEIsSUFBSSxDQUFDQyxJQUFELEVBQU9DLEVBQVAsRUFBV0ssYUFBWCxFQUEwQixDQUFDWSxJQUFJLENBQUNDLEdBQUwsS0FBYUYsS0FBZCxJQUF1QixDQUFqRCxDQUFwQixDQUZxQyxDQUlyQzs7QUFDQSxjQUFJUixJQUFJLENBQUNFLEdBQUwsQ0FBU1YsRUFBRSxHQUFHc0IsU0FBZCxJQUEyQixHQUEvQixFQUFvQztBQUNsQ0EsWUFBQUEsU0FBUyxHQUFHdEIsRUFBWjtBQUNEOztBQUVEYyxVQUFBQSxPQUFPLENBQUNTLFVBQVIsR0FBcUJELFNBQXJCOztBQUVBLGNBQUl0QixFQUFFLEtBQUtzQixTQUFYLEVBQXNCO0FBQ3BCUCxZQUFBQSxLQUFLLElBQUlBLEtBQUssQ0FBQyxJQUFELENBQWQ7QUFDRCxXQUZELE1BRU87QUFDTEssWUFBQUEsT0FBTyxDQUFDckIsSUFBRCxDQUFQO0FBQ0Q7QUFDRixTQWhCK0IsQ0FBaEM7QUFpQkQsT0FsQkQ7O0FBb0JBcUIsTUFBQUEsT0FBTyxDQUFDTixPQUFPLENBQUNTLFVBQVQsQ0FBUDtBQUVBLGFBQU87QUFBQSxlQUFNQyxvQkFBb0IsQ0FBQ0wsUUFBRCxDQUExQjtBQUFBLE9BQVA7QUFDRDtBQUNGLEdBOUJRLEVBOEJOLENBQUNMLE9BQUQsRUFBVWQsRUFBVixFQUFjZSxLQUFkLENBOUJNLENBQVQ7QUErQkQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5cbmZ1bmN0aW9uIHN0ZXAoZnJvbSwgdG8sIHN0ZXBwZXIsIGluZGV4KSB7XG4gIGxldCBuZXh0ID0gZnJvbTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGV4OyBpKyspIHtcbiAgICBuZXh0ID0gc3RlcHBlcihuZXh0LCB0byk7XG4gIH1cblxuICByZXR1cm4gbmV4dDtcbn1cblxuZnVuY3Rpb24gc3F1YXJlU3RlcHBlcihjdXJyZW50LCB0bykge1xuICBjb25zdCBzaWduID0gTWF0aC5zaWduKHRvIC0gY3VycmVudCk7XG4gIGNvbnN0IHN0ZXAgPSBNYXRoLnNxcnQoTWF0aC5hYnModG8gLSBjdXJyZW50KSk7XG4gIGNvbnN0IG5leHQgPSBjdXJyZW50ICsgc3RlcCAqIHNpZ247XG5cbiAgaWYgKHNpZ24gPiAwKSB7XG4gICAgcmV0dXJuIE1hdGgubWluKHRvLCBuZXh0KTtcbiAgfVxuXG4gIHJldHVybiBNYXRoLm1heCh0bywgbmV4dCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUFuaW1hdGVTY3JvbGxMZWZ0KGVsZW1lbnQsIHRvLCBvbkVuZCkge1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG5cbiAgICAgIGxldCBhbmltYXRvcjtcblxuICAgICAgY29uc3QgYW5pbWF0ZSA9IGZyb20gPT4ge1xuICAgICAgICBhbmltYXRvciA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnNcbiAgICAgICAgICBsZXQgbmV4dFZhbHVlID0gc3RlcChmcm9tLCB0bywgc3F1YXJlU3RlcHBlciwgKERhdGUubm93KCkgLSBzdGFydCkgLyA1KTtcblxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1tYWdpYy1udW1iZXJzXG4gICAgICAgICAgaWYgKE1hdGguYWJzKHRvIC0gbmV4dFZhbHVlKSA8IDAuNSkge1xuICAgICAgICAgICAgbmV4dFZhbHVlID0gdG87XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZWxlbWVudC5zY3JvbGxMZWZ0ID0gbmV4dFZhbHVlO1xuXG4gICAgICAgICAgaWYgKHRvID09PSBuZXh0VmFsdWUpIHtcbiAgICAgICAgICAgIG9uRW5kICYmIG9uRW5kKHRydWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbmltYXRlKGZyb20pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBhbmltYXRlKGVsZW1lbnQuc2Nyb2xsTGVmdCk7XG5cbiAgICAgIHJldHVybiAoKSA9PiBjYW5jZWxBbmltYXRpb25GcmFtZShhbmltYXRvcik7XG4gICAgfVxuICB9LCBbZWxlbWVudCwgdG8sIG9uRW5kXSk7XG59XG4iXX0=