1 import type { DependencyList, RefObject } from 'react';
2 import { useEffect, useState } from 'react';
4 import debounce from '@proton/utils/debounce';
6 export const useHasScroll = (ref: RefObject<HTMLElement>, dependencies: DependencyList = []) => {
7 const [hasVerticalScrollbar, setHasVerticalScrollbar] = useState(false);
8 const [hasHorizontalScrollbar, setHasHorizontalScrollbar] = useState(false);
11 const element = ref.current;
16 const handleResize = () => {
17 const element = ref.current;
22 setHasVerticalScrollbar(element.scrollHeight > element.clientHeight);
23 setHasHorizontalScrollbar(element.scrollWidth > element.clientWidth);
29 const debouncedHandleResize = debounce(handleResize, 100);
30 element.addEventListener('resize', debouncedHandleResize);
32 // Must add an observer because nor resize or scroll event are enough
33 const observer = new MutationObserver(debouncedHandleResize);
34 observer.observe(element, { attributes: true, childList: true, subtree: true });
36 element.removeEventListener('resize', debouncedHandleResize);
37 observer.disconnect();
41 return [hasVerticalScrollbar, hasHorizontalScrollbar];