@sberdevices/plasma-temple
Version:
SberDevices CanvasApp Templates.
111 lines (87 loc) • 3.79 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useScrollableContainer = void 0;
var _react = /*#__PURE__*/_interopRequireDefault( /*#__PURE__*/require("react"));
var _utils = /*#__PURE__*/require("../utils");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
var getPositionY = function getPositionY(_ref) {
var element = _ref.element,
container = _ref.container,
containerRect = _ref.containerRect,
diffMultiplier = _ref.diffMultiplier;
var elementRect = element.getBoundingClientRect();
var currentScrollTop = container.scrollTop;
var maxScrollTop = container.scrollHeight - container.offsetHeight;
var isCenter = elementRect.height * 3 > containerRect.height;
var defaultDiff = isCenter ? (containerRect.height - elementRect.height) / 2 : elementRect.height * diffMultiplier;
if (elementRect.top - defaultDiff - containerRect.top < elementRect.height) {
if (elementRect.top < 0) {
var _diff = defaultDiff + (Math.abs(elementRect.top) + containerRect.top);
return {
top: Math.max(currentScrollTop - _diff, 0)
};
}
var diff = defaultDiff + (containerRect.top - elementRect.top);
return {
top: Math.max(currentScrollTop - diff, 0)
};
}
if (containerRect.bottom - elementRect.bottom - defaultDiff < 0) {
var _diff2 = defaultDiff + (elementRect.bottom - containerRect.bottom);
return {
top: Math.min(currentScrollTop + _diff2, maxScrollTop)
};
}
return {
top: currentScrollTop
};
};
var useScrollableContainer = function useScrollableContainer() {
var scrollContainerRef = _react["default"].useRef(null);
var containerRect = _react["default"].useRef(null);
var handleFocus = _react["default"].useCallback(function (event) {
if (event.target && scrollContainerRef.current) {
if (!containerRect.current) {
containerRect.current = scrollContainerRef.current.getBoundingClientRect();
}
var target = event.target;
var position = getPositionY({
element: target,
container: scrollContainerRef.current,
containerRect: containerRect.current,
diffMultiplier: 1.5
});
(0, _utils.scroll)({
element: scrollContainerRef.current,
startPosition: scrollContainerRef.current.scrollTop,
offset: position.top - scrollContainerRef.current.scrollTop,
duration: 300,
axis: 'y'
});
}
}, []);
_react["default"].useEffect(function () {
if (!scrollContainerRef.current) {
return;
}
if (!containerRect.current) {
containerRect.current = scrollContainerRef.current.getBoundingClientRect();
} // eslint-disable-next-line no-underscore-dangle
if (window && window.__spatialNavigation__) {
var _scrollContainerRef$c;
(_scrollContainerRef$c = scrollContainerRef.current) === null || _scrollContainerRef$c === void 0 ? void 0 : _scrollContainerRef$c.addEventListener('navbeforefocus', handleFocus, true);
} else {
scrollContainerRef.current.addEventListener('focus', handleFocus, true);
}
return function () {
var _scrollContainerRef$c2, _scrollContainerRef$c3;
(_scrollContainerRef$c2 = scrollContainerRef.current) === null || _scrollContainerRef$c2 === void 0 ? void 0 : _scrollContainerRef$c2.removeEventListener('focus', handleFocus);
(_scrollContainerRef$c3 = scrollContainerRef.current) === null || _scrollContainerRef$c3 === void 0 ? void 0 : _scrollContainerRef$c3.removeEventListener('navbeforefocus', handleFocus);
};
}, []);
return scrollContainerRef;
};
exports.useScrollableContainer = useScrollableContainer;
//# sourceMappingURL=useScrollableContainer.js.map
;