UNPKG

1.83 kBJavaScriptView Raw
1"use strict";
2'use client';
3
4var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
5Object.defineProperty(exports, "__esModule", {
6 value: true
7});
8exports.default = useScrollTrigger;
9var React = _interopRequireWildcard(require("react"));
10function defaultTrigger(store, options) {
11 const {
12 disableHysteresis = false,
13 threshold = 100,
14 target
15 } = options;
16 const previous = store.current;
17 if (target) {
18 // Get vertical scroll
19 store.current = target.pageYOffset !== undefined ? target.pageYOffset : target.scrollTop;
20 }
21 if (!disableHysteresis && previous !== undefined) {
22 if (store.current < previous) {
23 return false;
24 }
25 }
26 return store.current > threshold;
27}
28const defaultTarget = typeof window !== 'undefined' ? window : null;
29function useScrollTrigger(options = {}) {
30 const {
31 getTrigger = defaultTrigger,
32 target = defaultTarget,
33 ...other
34 } = options;
35 const store = React.useRef();
36 const [trigger, setTrigger] = React.useState(() => getTrigger(store, other));
37 React.useEffect(() => {
38 const handleScroll = () => {
39 setTrigger(getTrigger(store, {
40 target,
41 ...other
42 }));
43 };
44 handleScroll(); // Re-evaluate trigger when dependencies change
45 target.addEventListener('scroll', handleScroll, {
46 passive: true
47 });
48 return () => {
49 target.removeEventListener('scroll', handleScroll, {
50 passive: true
51 });
52 };
53 // See Option 3. https://github.com/facebook/react/issues/14476#issuecomment-471199055
54 // TODO: uncomment once we enable eslint-plugin-react-compiler // eslint-disable-next-line react-compiler/react-compiler
55 // eslint-disable-next-line react-hooks/exhaustive-deps
56 }, [target, getTrigger, JSON.stringify(other)]);
57 return trigger;
58}
\No newline at end of file