@mui/material
Version:
Material UI is an open-source React component library that implements Google's Material Design. It's comprehensive and can be used in production out of the box.
61 lines (60 loc) • 1.89 kB
JavaScript
'use client';
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = useScrollTrigger;
var React = _interopRequireWildcard(require("react"));
function defaultTrigger(store, options) {
const {
disableHysteresis = false,
threshold = 100,
target
} = options;
const previous = store.current;
if (target) {
// Get vertical scroll
store.current = target.pageYOffset !== undefined ? target.pageYOffset : target.scrollTop;
}
if (!disableHysteresis && previous !== undefined) {
if (store.current < previous) {
return false;
}
}
return store.current > threshold;
}
const defaultTarget = typeof window !== 'undefined' ? window : null;
function useScrollTrigger(options = {}) {
const {
getTrigger = defaultTrigger,
target = defaultTarget,
...other
} = options;
const store = React.useRef();
const [trigger, setTrigger] = React.useState(() => getTrigger(store, other));
React.useEffect(() => {
if (target === null) {
return setTrigger(false);
}
const handleScroll = () => {
setTrigger(getTrigger(store, {
target,
...other
}));
};
handleScroll(); // Re-evaluate trigger when dependencies change
target.addEventListener('scroll', handleScroll, {
passive: true
});
return () => {
target.removeEventListener('scroll', handleScroll, {
passive: true
});
};
// See Option 3. https://github.com/facebook/react/issues/14476#issuecomment-471199055
// TODO: uncomment once we enable eslint-plugin-react-compiler // eslint-disable-next-line react-compiler/react-compiler
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [target, getTrigger, JSON.stringify(other)]);
return trigger;
}
;