organism-react-scroll-nav
Version:
A React scroll spy library with flux
96 lines (92 loc) • 3.7 kB
JavaScript
"use strict";
var _interopRequireDefault = require("reshow-runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports["default"] = void 0;
var _objectSpread2 = _interopRequireDefault(require("reshow-runtime/helpers/objectSpread2"));
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("reshow-runtime/helpers/objectWithoutPropertiesLoose"));
var _react = _interopRequireDefault(require("react"));
var _reshowReturn = require("reshow-return");
var _reactAtomicMolecule = require("react-atomic-molecule");
var _reshowConstant = require("reshow-constant");
var _scrollStore = _interopRequireDefault(require("../../stores/scrollStore.js"));
var _fastScrollStore = _interopRequireDefault(require("../../stores/fastScrollStore.js"));
var _excluded = ["scrollMargin", "noDelay", "targetId", "container", "children"]; //@ts-check
var isValidElement = _react["default"].isValidElement,
useRef = _react["default"].useRef;
/**
* @typedef {any} ScrollReceiverProps
*/
/**
* @param {ScrollReceiverProps} props
*/
var useScrollReceiver = function useScrollReceiver(props) {
var _props$scrollMargin = props.scrollMargin,
scrollMargin = _props$scrollMargin === void 0 ? _reshowConstant.DEFAULT : _props$scrollMargin,
_props$noDelay = props.noDelay,
noDelay = _props$noDelay === void 0 ? false : _props$noDelay,
targetId = props.targetId,
container = props.container,
children = props.children,
restProps = (0, _objectWithoutPropertiesLoose2["default"])(props, _excluded);
/** @type {React.RefObject<boolean>} */
var lastIsShown = useRef(false);
var store = noDelay ? _fastScrollStore["default"] : _scrollStore["default"];
var _useReturn = (0, _reshowReturn.useReturn)(["scroll"], store),
_useReturn$scroll = _useReturn.scroll,
scrollInfo = _useReturn$scroll === void 0 ? {} : _useReturn$scroll;
var activeId = store.getState().get("m" + scrollMargin);
var scrollTop = scrollInfo.top;
var pos = store.scroller.getOffset(targetId) || {};
var isShown = lastIsShown.current || false;
var active = _reshowConstant.UNDEFINED !== typeof targetId && targetId === activeId;
var targetInfo = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, pos), {}, {
active: active,
scrollTop: scrollTop,
scrollInfo: scrollInfo,
scrollMargin: scrollMargin,
isShown: isShown,
targetId: targetId
});
if (pos.isOnScreen) {
targetInfo.isShown = true;
lastIsShown.current = true;
}
if (!isNaN(scrollMargin)) {
store.scroller.addMargin(scrollMargin);
}
return {
targetInfo: targetInfo,
container: container,
children: children,
restProps: restProps
};
};
/**
* @param {ScrollReceiverProps} props
*/
var ScrollReceiver = function ScrollReceiver(props) {
var _useScrollReceiver = useScrollReceiver(props),
targetInfo = _useScrollReceiver.targetInfo,
container = _useScrollReceiver.container,
children = _useScrollReceiver.children,
restProps = _useScrollReceiver.restProps;
var nextContainer = container;
var nextChildren = children;
if (!nextContainer) {
nextContainer = children;
nextChildren = null;
}
if (!nextChildren && isValidElement(nextContainer)) {
nextChildren = nextContainer.props.children;
}
return (0, _reactAtomicMolecule.build)(nextContainer)((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, restProps), {}, {
targetInfo: targetInfo
}),
/**
* sould not use build here, let nextContainer handle children by itself.
*/
nextChildren);
};
ScrollReceiver.displayName = "ScrollReceiver";
var _default = exports["default"] = ScrollReceiver;
module.exports = exports.default;