UNPKG

2.41 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
5Object.defineProperty(exports, "__esModule", {
6 value: true
7});
8exports.default = useScrollTrigger;
9
10var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
11
12var _react = _interopRequireDefault(require("react"));
13
14function getScrollY(ref) {
15 return ref.pageYOffset !== undefined ? ref.pageYOffset : ref.scrollTop;
16}
17
18function defaultTrigger(event, store, options) {
19 var _options$disableHyste = options.disableHysteresis,
20 disableHysteresis = _options$disableHyste === void 0 ? false : _options$disableHyste,
21 _options$threshold = options.threshold,
22 threshold = _options$threshold === void 0 ? 100 : _options$threshold;
23 var previous = store.current;
24 store.current = event ? getScrollY(event.currentTarget) : previous;
25
26 if (!disableHysteresis && previous !== undefined) {
27 if (store.current < previous) {
28 return false;
29 }
30 }
31
32 return store.current > threshold;
33}
34
35var defaultTarget = typeof window !== 'undefined' ? window : null;
36
37function useScrollTrigger() {
38 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
39 var _options$getTrigger = options.getTrigger,
40 getTrigger = _options$getTrigger === void 0 ? defaultTrigger : _options$getTrigger,
41 _options$target = options.target,
42 target = _options$target === void 0 ? defaultTarget : _options$target,
43 other = (0, _objectWithoutProperties2.default)(options, ["getTrigger", "target"]);
44
45 var store = _react.default.useRef();
46
47 var _React$useState = _react.default.useState(function () {
48 return getTrigger(null, store, other);
49 }),
50 trigger = _React$useState[0],
51 setTrigger = _React$useState[1];
52
53 _react.default.useEffect(function () {
54 var handleScroll = function handleScroll(event) {
55 setTrigger(getTrigger(event, store, other));
56 };
57
58 handleScroll(null); // Re-evaluate trigger when dependencies change
59
60 target.addEventListener('scroll', handleScroll);
61 return function () {
62 target.removeEventListener('scroll', handleScroll);
63 }; // See Option 3. https://github.com/facebook/react/issues/14476#issuecomment-471199055
64 // eslint-disable-next-line react-hooks/exhaustive-deps
65 }, [target, getTrigger, JSON.stringify(other)]);
66
67 return trigger;
68}
\No newline at end of file