docusaurus/packages/docusaurus-theme-classic/src/theme/hooks/useScrollPosition.ts

45 lines
1.3 KiB
TypeScript

/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import {useEffect, useRef} from 'react';
import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment';
import type {ScrollPosition} from '@theme/hooks/useScrollPosition';
const getScrollPosition = (): ScrollPosition => ({
scrollX: ExecutionEnvironment.canUseDOM ? window.pageXOffset : 0,
scrollY: ExecutionEnvironment.canUseDOM ? window.pageYOffset : 0,
});
const useScrollPosition = (
effect?: (position: ScrollPosition, lastPosition: ScrollPosition) => void,
deps = [],
): void => {
const scrollPosition = useRef(getScrollPosition());
const handleScroll = () => {
const currentScrollPosition = getScrollPosition();
if (effect) {
effect(currentScrollPosition, scrollPosition.current);
}
scrollPosition.current = currentScrollPosition;
};
useEffect(() => {
const opts: AddEventListenerOptions & EventListenerOptions = {
passive: true,
};
handleScroll();
window.addEventListener('scroll', handleScroll, opts);
return () => window.removeEventListener('scroll', handleScroll, opts);
}, deps);
};
export default useScrollPosition;