@amaui/ui-react
Version:
UI for React
61 lines (60 loc) • 2.57 kB
JavaScript
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;
;