UNPKG

react-misc-toolbox

Version:

[ ] imageviewer | gradual scroll [ ] imageviewer | cancellable scroll

478 lines (393 loc) 15.5 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties'); var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2); var _regenerator = require('babel-runtime/regenerator'); var _regenerator2 = _interopRequireDefault(_regenerator); var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray'); var _slicedToArray3 = _interopRequireDefault(_slicedToArray2); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _SVGPrev = require('./svg/SVGPrev'); var _SVGPrev2 = _interopRequireDefault(_SVGPrev); var _SVGNext = require('./svg/SVGNext'); var _SVGNext2 = _interopRequireDefault(_SVGNext); var _SVGExpandMore = require('./svg/SVGExpandMore'); var _SVGExpandMore2 = _interopRequireDefault(_SVGExpandMore); var _SVGExpandLess = require('./svg/SVGExpandLess'); var _SVGExpandLess2 = _interopRequireDefault(_SVGExpandLess); var _RTGTransition = require('./RTGTransition'); var _RTGTransition2 = _interopRequireDefault(_RTGTransition); var _Button = require('./Button'); var _Button2 = _interopRequireDefault(_Button); var _helperFunctions = require('./helperFunctions'); var _ = require('.'); var _reactSwipeable = require('react-swipeable'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } //center on select //cure the 'freeze' bug var interval = void 0; var useSetState = function useSetState(initialState) { var _useReducer = (0, _react.useReducer)(function (state, newState) { return (0, _extends3.default)({}, state, newState); }, (0, _extends3.default)({}, initialState)), _useReducer2 = (0, _slicedToArray3.default)(_useReducer, 2), state = _useReducer2[0], setState = _useReducer2[1]; return [state, setState]; }; var useSafeSetState = function useSafeSetState(initialState) { var _useSetState = useSetState(initialState), _useSetState2 = (0, _slicedToArray3.default)(_useSetState, 2), state = _useSetState2[0], setState = _useSetState2[1]; var mountedRef = (0, _react.useRef)(false); (0, _react.useEffect)(function () { mountedRef.current = true; return function () { return mountedRef.current = false; }; }, []); var safeSetState = function safeSetState() { return mountedRef.current && setState.apply(undefined, arguments); }; return [state, safeSetState]; }; var Accordion = function Accordion(_ref) { var externalSwipeableRef = _ref.externalSwipeableRef, _ref$pointerScrollDis = _ref.pointerScrollDistance, pointerScrollDistance = _ref$pointerScrollDis === undefined ? 200 : _ref$pointerScrollDis, _ref$swipeScrollDista = _ref.swipeScrollDistance, swipeScrollDistance = _ref$swipeScrollDista === undefined ? 300 : _ref$swipeScrollDista, _ref$showLog = _ref.showLog, showLog = _ref$showLog === undefined ? false : _ref$showLog, _ref$noX = _ref.noX, noX = _ref$noX === undefined ? false : _ref$noX, _ref$noY = _ref.noY, noY = _ref$noY === undefined ? false : _ref$noY, _ref$scrollSpeed = _ref.scrollSpeed, scrollSpeed = _ref$scrollSpeed === undefined ? 400 : _ref$scrollSpeed, height = _ref.height, swipeableProps = _ref.swipeableProps, children = _ref.children, width = _ref.width, renderButton = _ref.renderButton; var swipeableRef = externalSwipeableRef ? externalSwipeableRef : (0, _react.useRef)(null); var _useSafeSetState = useSafeSetState({ showLeft: false, showRight: false, showUp: false, showDown: false }), _useSafeSetState2 = (0, _slicedToArray3.default)(_useSafeSetState, 2), state = _useSafeSetState2[0], safeSetState = _useSafeSetState2[1]; var showLeft = state.showLeft, showRight = state.showRight, showUp = state.showUp, showDown = state.showDown; (0, _react.useEffect)(function () { handleNavButtons(); var containerElement = swipeableRef.current; if (typeof window !== 'undefined' && containerElement) { showLog && console.log('Added event listeners'); containerElement.addEventListener('scroll', handleNavButtons); window.addEventListener('resize', handleNavButtons); } return function () { var containerElement = swipeableRef.current; if (typeof window !== 'undefined' && containerElement) { showLog && console.log('Removed event listeners'); containerElement.removeEventListener('scroll', handleNavButtons); window.removeEventListener('resize', handleNavButtons); } }; }, [children]); var handleNavButtons = function () { var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee() { var containerElement; return _regenerator2.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: containerElement = swipeableRef.current; //await delay(250) // showLog && //console.log( // `// handleNavButtons // `, // `containerElement.scrollLeft`, // containerElement.scrollLeft, // `scrollWidth: `, // containerElement.scrollWidth, // `clientWidth: `, // containerElement.clientWidth, // `diff: `, // containerElement.scrollWidth - containerElement.clientWidth, // `scrollTop: `, // containerElement.scrollTop, // `scrollHeight: `, // containerElement.scrollHeight, // `clientHeight: `, // containerElement.clientHeight //) if (!(containerElement.scrollLeft === 0 || containerElement.scrollWidth === containerElement.clientWidth)) { _context.next = 6; break; } _context.next = 4; return safeSetState({ showLeft: false }); case 4: _context.next = 9; break; case 6: if (!(containerElement.scrollLeft > 0)) { _context.next = 9; break; } _context.next = 9; return safeSetState({ showLeft: true }); case 9: if (!(containerElement.scrollLeft + 1 >= containerElement.scrollWidth - containerElement.clientWidth || containerElement.scrollWidth === containerElement.clientWidth)) { _context.next = 14; break; } _context.next = 12; return safeSetState({ showRight: false }); case 12: _context.next = 17; break; case 14: if (!(containerElement.scrollWidth >= containerElement.clientWidth)) { _context.next = 17; break; } _context.next = 17; return safeSetState({ showRight: true }); case 17: if (!(containerElement.scrollTop === 0 || containerElement.scrollHeight === containerElement.clientHeight)) { _context.next = 22; break; } _context.next = 20; return safeSetState({ showUp: false }); case 20: _context.next = 25; break; case 22: if (!(containerElement.scrollTop > 0)) { _context.next = 25; break; } _context.next = 25; return safeSetState({ showUp: true }); case 25: if (!(containerElement.scrollTop + 1 >= containerElement.scrollHeight - containerElement.clientHeight || containerElement.scrollHeight === containerElement.clientHeight)) { _context.next = 30; break; } _context.next = 28; return safeSetState({ showDown: false }); case 28: _context.next = 33; break; case 30: if (!(containerElement.scrollTop === 0)) { _context.next = 33; break; } _context.next = 33; return safeSetState({ showDown: true }); case 33: case 'end': return _context.stop(); } } }, _callee, undefined); })); return function handleNavButtons() { return _ref2.apply(this, arguments); }; }(); var endScroll = function endScroll(e) { console.log('endScroll'); e.stopPropagation(); clearInterval(interval); }; var startScroll = function startScroll(e, direction) { var scrollDistance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 100; var isContinuous = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; var isTouch = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; console.log('startScroll'); e.stopPropagation(); var containerElement = swipeableRef.current; clearInterval(interval); var touchMod = isTouch ? -1 : 1; var execScroll = function execScroll() { switch (direction) { case 'Left': containerElement.scrollTo({ left: containerElement.scrollLeft - touchMod * scrollDistance, behavior: 'smooth' }); break; case 'Right': containerElement.scrollTo({ left: containerElement.scrollLeft + touchMod * scrollDistance, behavior: 'smooth' }); break; case 'Up': containerElement.scrollTo({ top: containerElement.scrollTop - touchMod * scrollDistance, behavior: 'smooth' }); break; case 'Down': containerElement.scrollTo({ top: containerElement.scrollTop + touchMod * scrollDistance, behavior: 'smooth' }); break; } }; if (containerElement) { execScroll(); interval = isContinuous && setInterval(execScroll, scrollSpeed); } }; var renderNav = function renderNav(direction) { var containerElement = swipeableRef.current; var autoHeight = containerElement && containerElement.clientHeight; var autoWidth = 30; var vertWidth = containerElement && containerElement.clientWidth; var vertHeight = 30; var SVGProps = { fill: '#555', size: width ? width : 18 }; var renderIcon = function renderIcon(_ref3) { var direction = _ref3.direction, props = (0, _objectWithoutProperties3.default)(_ref3, ['direction']); switch (direction) { case 'Right': return _react2.default.createElement(_SVGNext2.default, (0, _extends3.default)({}, SVGProps, { dir: direction }, props)); case 'Left': return _react2.default.createElement(_SVGPrev2.default, (0, _extends3.default)({}, SVGProps, { dir: direction }, props)); case 'Up': return _react2.default.createElement(_SVGExpandLess2.default, (0, _extends3.default)({}, SVGProps, props)); case 'Down': return _react2.default.createElement(_SVGExpandMore2.default, (0, _extends3.default)({}, SVGProps, props)); } }; var inProp = function inProp(_ref4) { var direction = _ref4.direction; switch (direction) { case 'Right': return showRight; case 'Left': return showLeft; case 'Up': return showUp; case 'Down': return showDown; } }; var getXShapeLayout = function getXShapeLayout() { return { width: width ? width : autoWidth, height: height ? height : autoHeight }; }; var getYShapeLayout = function getYShapeLayout() { return { width: width ? width : vertWidth, height: height ? height : vertHeight }; }; var getStyle = function getStyle(_ref5) { var direction = _ref5.direction; switch (direction) { case 'Right': return (0, _extends3.default)({ top: 0, right: 0 }, getXShapeLayout()); case 'Left': return (0, _extends3.default)({ top: 0 }, getXShapeLayout()); case 'Up': return (0, _extends3.default)({ top: 0 }, getYShapeLayout()); case 'Down': return (0, _extends3.default)({ bottom: 0 }, getYShapeLayout()); } }; return _react2.default.createElement( _RTGTransition2.default, { in: inProp({ direction: direction }) }, function (_ref6) { var transitionStyle = _ref6.style; var getButtonProps = function getButtonProps() { var _ref7 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var style = _ref7.style, className = _ref7.className, colors = _ref7.colors, props = (0, _objectWithoutProperties3.default)(_ref7, ['style', 'className', 'colors']); return (0, _extends3.default)({ onPointerDown: function onPointerDown(e) { return startScroll(e, direction, pointerScrollDistance, true); }, onPointerUp: function onPointerUp(e) { return endScroll(e); }, className: (0, _helperFunctions.unflippyMultiBase)([className, 'accordion_navbutton'], direction), colors: colors ? colors : _.buttonStyles.violet, style: (0, _extends3.default)({}, transitionStyle, { padding: 0, position: 'absolute' }, getStyle({ direction: direction }), style) }, props); }; return renderButton ? renderButton({ getButtonProps: getButtonProps, renderIcon: renderIcon, direction: direction }) : _react2.default.createElement( _Button2.default, (0, _extends3.default)({}, getButtonProps({ colors: 'smoke' })), renderIcon({ direction: direction, fill: '#555' }) ); } ); }; var handlers = (0, _reactSwipeable.useSwipeable)({ onSwiped: function onSwiped(e) { startScroll(e.event, e.dir, swipeScrollDistance, false, true); }, preventDefaultTouchmoveEvent: true }); return typeof window !== 'undefined' && _react2.default.createElement( _react2.default.Fragment, null, !noX && renderNav('Left'), !noY && renderNav('Up'), typeof children === 'function' ? children({ handlers: handlers, swipeableRef: swipeableRef }) : _react2.default.createElement( 'div', (0, _extends3.default)({}, handlers, { ref: swipeableRef }, swipeableProps), children ), !noX && renderNav('Right'), !noY && renderNav('Down') ); }; exports.default = _react2.default.memo(Accordion);