diff --git a/hooks/useWindowSize.tsx b/hooks/useWindowSize.tsx new file mode 100644 index 0000000..6a430fd --- /dev/null +++ b/hooks/useWindowSize.tsx @@ -0,0 +1,36 @@ +import { useEffect, useState } from "react"; + +// Define general type for useWindowSize hook, which includes width and height +interface Size { + width: number | undefined; + height: number | undefined; +} + +// Hook +function useWindowSize(): Size { + // Initialize state with undefined width/height so server and client renders match + // Learn more here: https://joshwcomeau.com/react/the-perils-of-rehydration/ + const [windowSize, setWindowSize] = useState({ + width: undefined, + height: undefined, + }); + useEffect(() => { + // Handler to call on window resize + function handleResize() { + // Set window width/height to state + setWindowSize({ + width: window.innerWidth, + height: window.innerHeight, + }); + } + // Add event listener + window.addEventListener("resize", handleResize); + // Call handler right away so state gets updated with initial window size + handleResize(); + // Remove event listener on cleanup + return () => window.removeEventListener("resize", handleResize); + }, []); // Empty array ensures that effect is only run on mount + return windowSize; +} + +export default useWindowSize;