diff --git a/hooks/useWindowDimensions.js b/hooks/useWindowDimensions.js index e5c1e83..f05bbe4 100644 --- a/hooks/useWindowDimensions.js +++ b/hooks/useWindowDimensions.js @@ -1,45 +1,34 @@ import { useState, useEffect } from 'react'; -function debounce(fn, ms) { - let timer; - return _ => { - clearTimeout(timer); - timer = setTimeout(_ => { - timer = null; - fn.apply(this, ...arguments); - }, ms); - }; -} +const initDimensions = { + height: 0, + width: 0, +}; export default function useWindowDimensions() { - const [windowDimensions, setWindowDimensions] = useState({ - width: undefined, - height: undefined, - }); + function getWindowDimensions(hasWindow) { + const width = hasWindow ? window.innerWidth : null; + const height = hasWindow ? window.innerHeight : null; + return { + width, + height, + }; + } + + const [windowDimensions, setWindowDimensions] = useState(initDimensions); useEffect(() => { - const debouncedHandleResize = debounce( + const hasWindow = typeof window !== 'undefined'; + if (hasWindow) { function handleResize() { - setWindowDimensions({ - width: window.innerWidth, - height: window.innerHeight, - }); - }, - 0 - ); - - window.addEventListener( - 'resize', - debouncedHandleResize, - { - passive: true, + setWindowDimensions(getWindowDimensions(hasWindow)); } - ); - return () => - window.removeEventListener( - 'resize', - debouncedHandleResize - ); + + // Gets window size for the first time + handleResize(); + window.addEventListener('resize', handleResize); + return () => window.removeEventListener('resize', handleResize); + } }, []); return windowDimensions;