Window size hook
This commit is contained in:
		
							
								
								
									
										36
									
								
								hooks/useWindowSize.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								hooks/useWindowSize.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -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<Size>({
 | 
			
		||||
    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;
 | 
			
		||||
		Reference in New Issue
	
	Block a user