UNPKG

3.03 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.BackToTop = void 0;
4const tslib_1 = require("tslib");
5const React = tslib_1.__importStar(require("react"));
6const back_to_top_1 = tslib_1.__importDefault(require("@patternfly/react-styles/css/components/BackToTop/back-to-top"));
7const react_styles_1 = require("@patternfly/react-styles");
8const angle_up_icon_1 = tslib_1.__importDefault(require('@patternfly/react-icons/dist/js/icons/angle-up-icon'));
9const util_1 = require("../../helpers/util");
10const Button_1 = require("../Button");
11const BackToTopBase = (_a) => {
12 var { className, title = 'Back to top', innerRef, scrollableSelector, isAlwaysVisible = false } = _a, props = tslib_1.__rest(_a, ["className", "title", "innerRef", "scrollableSelector", "isAlwaysVisible"]);
13 const [visible, setVisible] = React.useState(isAlwaysVisible);
14 React.useEffect(() => {
15 setVisible(isAlwaysVisible);
16 }, [isAlwaysVisible]);
17 const [scrollElement, setScrollElement] = React.useState(null);
18 const toggleVisible = () => {
19 const scrolled = scrollElement.scrollY ? scrollElement.scrollY : scrollElement.scrollTop;
20 if (!isAlwaysVisible) {
21 if (scrolled > 400) {
22 setVisible(true);
23 }
24 else {
25 setVisible(false);
26 }
27 }
28 };
29 React.useEffect(() => {
30 const hasScrollSpy = Boolean(scrollableSelector);
31 if (hasScrollSpy) {
32 const scrollEl = document.querySelector(scrollableSelector);
33 if (!util_1.canUseDOM || !(scrollEl instanceof HTMLElement)) {
34 return;
35 }
36 setScrollElement(scrollEl);
37 scrollEl.addEventListener('scroll', toggleVisible);
38 return () => {
39 scrollEl.removeEventListener('scroll', toggleVisible);
40 };
41 }
42 else {
43 if (!util_1.canUseDOM) {
44 return;
45 }
46 const scrollEl = window;
47 setScrollElement(scrollEl);
48 scrollEl.addEventListener('scroll', toggleVisible);
49 return () => {
50 scrollEl.removeEventListener('scroll', toggleVisible);
51 };
52 }
53 }, [scrollableSelector, toggleVisible]);
54 const handleClick = () => {
55 scrollElement.scrollTo({ top: 0, behavior: 'smooth' });
56 };
57 return (React.createElement("div", Object.assign({ className: react_styles_1.css(back_to_top_1.default.backToTop, !visible && back_to_top_1.default.modifiers.hidden, className), ref: innerRef, onClick: handleClick }, props),
58 React.createElement(Button_1.Button, { variant: "primary", icon: React.createElement(angle_up_icon_1.default, { "aria-hidden": "true" }), iconPosition: "right" }, title)));
59};
60exports.BackToTop = React.forwardRef((props, ref) => (React.createElement(BackToTopBase, Object.assign({ innerRef: ref }, props))));
61exports.BackToTop.displayName = 'BackToTop';
62//# sourceMappingURL=BackToTop.js.map
\No newline at end of file