import { useState, useEffect } from 'react'; const getWidth = () => window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; const useWidth = (): number => { // save current window width in the state object const [width, setWidth] = useState(getWidth()); // in this case useEffect will execute only once because // it does not have any dependencies. useEffect(() => { // timeoutId for debounce mechanism let timeoutId: NodeJS.Timeout | null = null; const resizeListener = () => { // prevent execution of previous setTimeout if (timeoutId) { clearTimeout(timeoutId); } // change width from the state object after 150 milliseconds timeoutId = setTimeout(() => setWidth(getWidth()), 150); }; // set resize listener window.addEventListener('resize', resizeListener); // clean up function return () => { // remove resize listener window.removeEventListener('resize', resizeListener); }; }, []); return width; }; export default useWidth;