Merge branch 'INDA-330-pii-update' into 'main'
[ProtonMail-WebClient.git] / applications / mail / src / app / hooks / useHasScroll.ts
blobc858e53d8b5b7840169821618d7d0440244fdcbb
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);
10     useEffect(() => {
11         const element = ref.current;
12         if (!element) {
13             return;
14         }
16         const handleResize = () => {
17             const element = ref.current;
18             if (!element) {
19                 return;
20             }
22             setHasVerticalScrollbar(element.scrollHeight > element.clientHeight);
23             setHasHorizontalScrollbar(element.scrollWidth > element.clientWidth);
24         };
26         // Initial check
27         handleResize();
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 });
35         return () => {
36             element.removeEventListener('resize', debouncedHandleResize);
37             observer.disconnect();
38         };
39     }, dependencies);
41     return [hasVerticalScrollbar, hasHorizontalScrollbar];