react-film
Version:
React component for showing carousel just like a film strip
90 lines (82 loc) • 10.5 kB
JavaScript
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
import classNames from 'classnames';
import PropTypes from 'prop-types';
import React, { useCallback, useRef } from 'react';
import useDir from './hooks/useDir';
import useScrollBarPercentage from './hooks/useScrollBarPercentage';
import useScrollOneLeft from './hooks/useScrollOneLeft';
import useScrollOneRight from './hooks/useScrollOneRight';
var Flipper = function Flipper(_ref) {
var ariaLabel = _ref['aria-label'],
blurFocusOnClick = _ref.blurFocusOnClick,
children = _ref.children,
mode = _ref.mode;
var _useDir = useDir(),
_useDir2 = _slicedToArray(_useDir, 1),
dir = _useDir2[0];
var _useScrollBarPercenta = useScrollBarPercentage(),
_useScrollBarPercenta2 = _slicedToArray(_useScrollBarPercenta, 1),
scrollBarPercentage = _useScrollBarPercenta2[0];
var buttonRef = useRef();
var left = mode === 'left';
var scrollOneLeft = useScrollOneLeft();
var scrollOneRight = useScrollOneRight();
var handleClick = useCallback(function () {
left ? scrollOneLeft() : scrollOneRight();
blurFocusOnClick && buttonRef.current && buttonRef.current.blur();
}, [blurFocusOnClick, buttonRef, left, scrollOneLeft, scrollOneRight]);
var handleKeyDown = useCallback(function (event) {
var key = event.key;
if (key === 'Enter' || key === ' ') {
event.preventDefault();
left ? scrollOneLeft() : scrollOneRight();
}
}, [left, scrollOneLeft, scrollOneRight]);
var hide;
if (dir === 'rtl') {
if (left) {
hide = scrollBarPercentage === '100%' || scrollBarPercentage === '-100%';
} else {
hide = scrollBarPercentage === '0%';
}
} else {
if (left) {
hide = scrollBarPercentage === '0%';
} else {
hide = scrollBarPercentage === '100%';
}
}
return /*#__PURE__*/React.createElement("button", {
"aria-label": ariaLabel || (left ? 'left' : 'right'),
className: classNames('react-film__flipper', 'react-film__main__overlay', {
'react-film__flipper--left': left,
'react-film__flipper--right': !left
}),
onClick: handleClick,
onKeyDown: handleKeyDown,
ref: buttonRef,
type: "button"
}, /*#__PURE__*/React.createElement("div", {
className: classNames('react-film__flipper__slider', 'react-film__main__slider', {
'react-film__main__slider--hide': hide,
'react-film__main__slider--left': left,
'react-film__main__slider--right': !left
})
}, /*#__PURE__*/React.createElement("div", {
className: "react-film__flipper__body"
}, children)));
};
Flipper.defaultProps = {
'aria-label': undefined,
blurFocusOnClick: false,
children: undefined,
mode: 'left'
};
Flipper.propTypes = {
'aria-label': PropTypes.string,
blurFocusOnClick: PropTypes.bool,
children: PropTypes.any,
mode: PropTypes.oneOf(['left', 'right'])
};
export default Flipper;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9GbGlwcGVyLmpzIl0sIm5hbWVzIjpbImNsYXNzTmFtZXMiLCJQcm9wVHlwZXMiLCJSZWFjdCIsInVzZUNhbGxiYWNrIiwidXNlUmVmIiwidXNlRGlyIiwidXNlU2Nyb2xsQmFyUGVyY2VudGFnZSIsInVzZVNjcm9sbE9uZUxlZnQiLCJ1c2VTY3JvbGxPbmVSaWdodCIsIkZsaXBwZXIiLCJhcmlhTGFiZWwiLCJibHVyRm9jdXNPbkNsaWNrIiwiY2hpbGRyZW4iLCJtb2RlIiwiZGlyIiwic2Nyb2xsQmFyUGVyY2VudGFnZSIsImJ1dHRvblJlZiIsImxlZnQiLCJzY3JvbGxPbmVMZWZ0Iiwic2Nyb2xsT25lUmlnaHQiLCJoYW5kbGVDbGljayIsImN1cnJlbnQiLCJibHVyIiwiaGFuZGxlS2V5RG93biIsImV2ZW50Iiwia2V5IiwicHJldmVudERlZmF1bHQiLCJoaWRlIiwiZGVmYXVsdFByb3BzIiwidW5kZWZpbmVkIiwicHJvcFR5cGVzIiwic3RyaW5nIiwiYm9vbCIsImFueSIsIm9uZU9mIl0sIm1hcHBpbmdzIjoiO0FBQUEsT0FBT0EsVUFBUCxNQUF1QixZQUF2QjtBQUNBLE9BQU9DLFNBQVAsTUFBc0IsWUFBdEI7QUFDQSxPQUFPQyxLQUFQLElBQWdCQyxXQUFoQixFQUE2QkMsTUFBN0IsUUFBMkMsT0FBM0M7QUFFQSxPQUFPQyxNQUFQLE1BQW1CLGdCQUFuQjtBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLGdDQUFuQztBQUNBLE9BQU9DLGdCQUFQLE1BQTZCLDBCQUE3QjtBQUNBLE9BQU9DLGlCQUFQLE1BQThCLDJCQUE5Qjs7QUFFQSxJQUFNQyxPQUFPLEdBQUcsU0FBVkEsT0FBVSxPQUFtRTtBQUFBLE1BQWxEQyxTQUFrRCxRQUFoRSxZQUFnRTtBQUFBLE1BQXZDQyxnQkFBdUMsUUFBdkNBLGdCQUF1QztBQUFBLE1BQXJCQyxRQUFxQixRQUFyQkEsUUFBcUI7QUFBQSxNQUFYQyxJQUFXLFFBQVhBLElBQVc7O0FBQ2pGLGdCQUFjUixNQUFN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QixnQkFBYzdCLFNBQVMsQ0FBQzhCLE1BRE47QUFFbEJwQixFQUFBQSxnQkFBZ0IsRUFBRVYsU0FBUyxDQUFDK0IsSUFGVjtBQUdsQnBCLEVBQUFBLFFBQVEsRUFBRVgsU0FBUyxDQUFDZ0MsR0FIRjtBQUlsQnBCLEVBQUFBLElBQUksRUFBRVosU0FBUyxDQUFDaUMsS0FBVixDQUFnQixDQUFDLE1BQUQsRUFBUyxPQUFULENBQWhCO0FBSlksQ0FBcEI7QUFPQSxlQUFlekIsT0FBZiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgdXNlRGlyIGZyb20gJy4vaG9va3MvdXNlRGlyJztcbmltcG9ydCB1c2VTY3JvbGxCYXJQZXJjZW50YWdlIGZyb20gJy4vaG9va3MvdXNlU2Nyb2xsQmFyUGVyY2VudGFnZSc7XG5pbXBvcnQgdXNlU2Nyb2xsT25lTGVmdCBmcm9tICcuL2hvb2tzL3VzZVNjcm9sbE9uZUxlZnQnO1xuaW1wb3J0IHVzZVNjcm9sbE9uZVJpZ2h0IGZyb20gJy4vaG9va3MvdXNlU2Nyb2xsT25lUmlnaHQnO1xuXG5jb25zdCBGbGlwcGVyID0gKHsgJ2FyaWEtbGFiZWwnOiBhcmlhTGFiZWwsIGJsdXJGb2N1c09uQ2xpY2ssIGNoaWxkcmVuLCBtb2RlIH0pID0+IHtcbiAgY29uc3QgW2Rpcl0gPSB1c2VEaXIoKTtcbiAgY29uc3QgW3Njcm9sbEJhclBlcmNlbnRhZ2VdID0gdXNlU2Nyb2xsQmFyUGVyY2VudGFnZSgpO1xuICBjb25zdCBidXR0b25SZWYgPSB1c2VSZWYoKTtcbiAgY29uc3QgbGVmdCA9IG1vZGUgPT09ICdsZWZ0JztcbiAgY29uc3Qgc2Nyb2xsT25lTGVmdCA9IHVzZVNjcm9sbE9uZUxlZnQoKTtcbiAgY29uc3Qgc2Nyb2xsT25lUmlnaHQgPSB1c2VTY3JvbGxPbmVSaWdodCgpO1xuXG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGxlZnQgPyBzY3JvbGxPbmVMZWZ0KCkgOiBzY3JvbGxPbmVSaWdodCgpO1xuICAgIGJsdXJGb2N1c09uQ2xpY2sgJiYgYnV0dG9uUmVmLmN1cnJlbnQgJiYgYnV0dG9uUmVmLmN1cnJlbnQuYmx1cigpO1xuICB9LCBbYmx1ckZvY3VzT25DbGljaywgYnV0dG9uUmVmLCBsZWZ0LCBzY3JvbGxPbmVMZWZ0LCBzY3JvbGxPbmVSaWdodF0pO1xuXG4gIGNvbnN0IGhhbmRsZUtleURvd24gPSB1c2VDYWxsYmFjayhcbiAgICBldmVudCA9PiB7XG4gICAgICBjb25zdCB7IGtleSB9ID0gZXZlbnQ7XG5cbiAgICAgIGlmIChrZXkgPT09ICdFbnRlcicgfHwga2V5ID09PSAnICcpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgbGVmdCA/IHNjcm9sbE9uZUxlZnQoKSA6IHNjcm9sbE9uZVJpZ2h0KCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbbGVmdCwgc2Nyb2xsT25lTGVmdCwgc2Nyb2xsT25lUmlnaHRdXG4gICk7XG5cbiAgbGV0IGhpZGU7XG5cbiAgaWYgKGRpciA9PT0gJ3J0bCcpIHtcbiAgICBpZiAobGVmdCkge1xuICAgICAgaGlkZSA9IHNjcm9sbEJhclBlcmNlbnRhZ2UgPT09ICcxMDAlJyB8fCBzY3JvbGxCYXJQZXJjZW50YWdlID09PSAnLTEwMCUnO1xuICAgIH0gZWxzZSB7XG4gICAgICBoaWRlID0gc2Nyb2xsQmFyUGVyY2VudGFnZSA9PT0gJzAlJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGxlZnQpIHtcbiAgICAgIGhpZGUgPSBzY3JvbGxCYXJQZXJjZW50YWdlID09PSAnMCUnO1xuICAgIH0gZWxzZSB7XG4gICAgICBoaWRlID0gc2Nyb2xsQmFyUGVyY2VudGFnZSA9PT0gJzEwMCUnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGJ1dHRvblxuICAgICAgYXJpYS1sYWJlbD17YXJpYUxhYmVsIHx8IChsZWZ0ID8gJ2xlZnQnIDogJ3JpZ2h0Jyl9XG4gICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoJ3JlYWN0LWZpbG1fX2ZsaXBwZXInLCAncmVhY3QtZmlsbV9fbWFpbl9fb3ZlcmxheScsIHtcbiAgICAgICAgJ3JlYWN0LWZpbG1fX2ZsaXBwZXItLWxlZnQnOiBsZWZ0LFxuICAgICAgICAncmVhY3QtZmlsbV9fZmxpcHBlci0tcmlnaHQnOiAhbGVmdFxuICAgICAgfSl9XG4gICAgICBvbkNsaWNrPXtoYW5kbGVDbGlja31cbiAgICAgIG9uS2V5RG93bj17aGFuZGxlS2V5RG93bn1cbiAgICAgIHJlZj17YnV0dG9uUmVmfVxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoJ3JlYWN0LWZpbG1fX2ZsaXBwZXJfX3NsaWRlcicsICdyZWFjdC1maWxtX19tYWluX19zbGlkZXInLCB7XG4gICAgICAgICAgJ3JlYWN0LWZpbG1fX21haW5fX3NsaWRlci0taGlkZSc6IGhpZGUsXG4gICAgICAgICAgJ3JlYWN0LWZpbG1fX21haW5fX3NsaWRlci0tbGVmdCc6IGxlZnQsXG4gICAgICAgICAgJ3JlYWN0LWZpbG1fX21haW5fX3NsaWRlci0tcmlnaHQnOiAhbGVmdFxuICAgICAgICB9KX1cbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZWFjdC1maWxtX19mbGlwcGVyX19ib2R5XCI+e2NoaWxkcmVufTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9idXR0b24+XG4gICk7XG59O1xuXG5GbGlwcGVyLmRlZmF1bHRQcm9wcyA9IHtcbiAgJ2FyaWEtbGFiZWwnOiB1bmRlZmluZWQsXG4gIGJsdXJGb2N1c09uQ2xpY2s6IGZhbHNlLFxuICBjaGlsZHJlbjogdW5kZWZpbmVkLFxuICBtb2RlOiAnbGVmdCdcbn07XG5cbkZsaXBwZXIucHJvcFR5cGVzID0ge1xuICAnYXJpYS1sYWJlbCc6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGJsdXJGb2N1c09uQ2xpY2s6IFByb3BUeXBlcy5ib29sLFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLmFueSxcbiAgbW9kZTogUHJvcFR5cGVzLm9uZU9mKFsnbGVmdCcsICdyaWdodCddKVxufTtcblxuZXhwb3J0IGRlZmF1bHQgRmxpcHBlcjtcbiJdfQ==