UNPKG

1.64 kBJavaScriptView Raw
1import _extends from "@babel/runtime/helpers/esm/extends";
2import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3import * as React from 'react';
4
5function defaultTrigger(store, options) {
6 const {
7 disableHysteresis = false,
8 threshold = 100,
9 target
10 } = options;
11 const previous = store.current;
12
13 if (target) {
14 // Get vertical scroll
15 store.current = target.pageYOffset !== undefined ? target.pageYOffset : target.scrollTop;
16 }
17
18 if (!disableHysteresis && previous !== undefined) {
19 if (store.current < previous) {
20 return false;
21 }
22 }
23
24 return store.current > threshold;
25}
26
27const defaultTarget = typeof window !== 'undefined' ? window : null;
28export default function useScrollTrigger(options = {}) {
29 const {
30 getTrigger = defaultTrigger,
31 target = defaultTarget
32 } = options,
33 other = _objectWithoutPropertiesLoose(options, ["getTrigger", "target"]);
34
35 const store = React.useRef();
36 const [trigger, setTrigger] = React.useState(() => getTrigger(store, other));
37 React.useEffect(() => {
38 const handleScroll = () => {
39 setTrigger(getTrigger(store, _extends({
40 target
41 }, other)));
42 };
43
44 handleScroll(); // Re-evaluate trigger when dependencies change
45
46 target.addEventListener('scroll', handleScroll);
47 return () => {
48 target.removeEventListener('scroll', handleScroll);
49 }; // See Option 3. https://github.com/facebook/react/issues/14476#issuecomment-471199055
50 // eslint-disable-next-line react-hooks/exhaustive-deps
51 }, [target, getTrigger, JSON.stringify(other)]);
52 return trigger;
53}
\No newline at end of file