ente/packages/shared/hooks/useComponentScroll.tsx

67 lines
1.7 KiB
TypeScript
Raw Normal View History

import { useRef, useState, useEffect } from 'react';
export enum SCROLL_DIRECTION {
LEFT = -1,
RIGHT = +1,
}
export default function useComponentScroll({
dependencies,
}: {
dependencies: any[];
}) {
const componentRef = useRef<HTMLDivElement>(null);
const [scrollObj, setScrollObj] = useState<{
scrollLeft?: number;
scrollWidth?: number;
clientWidth?: number;
}>({});
const updateScrollObj = () => {
2022-05-11 13:06:50 +00:00
if (!componentRef.current) {
return;
}
2022-05-11 13:06:50 +00:00
const { scrollLeft, scrollWidth, clientWidth } = componentRef.current;
setScrollObj({ scrollLeft, scrollWidth, clientWidth });
};
useEffect(() => {
2022-05-11 13:06:50 +00:00
if (!componentRef.current) {
return;
}
// Add event listener
2022-04-29 09:27:09 +00:00
componentRef.current?.addEventListener('scroll', updateScrollObj);
// Call handler right away so state gets updated with initial window size
updateScrollObj();
// Remove event listener on cleanup
return () =>
2022-04-29 09:27:09 +00:00
componentRef.current?.removeEventListener(
'resize',
updateScrollObj
);
}, [componentRef.current]);
useEffect(() => {
updateScrollObj();
}, [...dependencies]);
const scrollComponent = (direction: SCROLL_DIRECTION) => () => {
componentRef.current.scrollBy(250 * direction, 0);
};
const hasScrollBar = scrollObj.scrollWidth > scrollObj.clientWidth;
const onFarLeft = scrollObj.scrollLeft === 0;
const onFarRight =
scrollObj.scrollLeft + scrollObj.clientWidth === scrollObj.scrollWidth;
return {
hasScrollBar,
onFarLeft,
onFarRight,
scrollComponent,
2023-05-02 06:17:47 +00:00
componentRef,
};
}