UNPKG

@amaui/ui-react

Version:
61 lines (60 loc) 2.57 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const react_1 = __importDefault(require("react")); const useScroll = (props) => { const { offset, direction, element, target } = props; const [response, setResponse] = react_1.default.useState(false); const [root, setRoot] = react_1.default.useState(); const refs = { root: react_1.default.useRef(root), previous: react_1.default.useRef(0), offset: react_1.default.useRef(), direction: react_1.default.useRef(), response: react_1.default.useRef(response) }; refs.root.current = root; refs.offset.current = offset; refs.direction.current = direction; refs.response.current = response; // Root react_1.default.useEffect(() => { var _a; const rootNew = target || ((_a = element === null || element === void 0 ? void 0 : element.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView) || window; setRoot(rootNew); refs.root.current = rootNew; }, [target, element]); const method = react_1.default.useCallback(() => { var _a, _b; if (!refs.root.current) return; const value = ((_a = refs.root.current) === null || _a === void 0 ? void 0 : _a.scrollTop) !== undefined ? refs.root.current.scrollTop : (_b = refs.root.current) === null || _b === void 0 ? void 0 : _b.scrollY; let responseNew = true; // Direction if (refs.direction.current !== undefined) responseNew = responseNew && ((refs.direction.current === 'down' && value > refs.previous.current) || (refs.direction.current === 'up' && value < refs.previous.current)); // Offset if (refs.offset.current !== undefined) responseNew = responseNew && (value > refs.offset.current); if (refs.response.current !== responseNew) setResponse(responseNew); // Previous refs.previous.current = value; }, []); react_1.default.useEffect(() => { // Add new event listener if (root) root.addEventListener('scroll', method); method(); return () => { // Remove previous event listener if (root) root.removeEventListener('scroll', method); }; }, [root]); return response; }; useScroll.displayName = 'amaui-UseScroll'; exports.default = useScroll;