Openstatus www.openstatus.dev
at main 43 lines 1.3 kB view raw
1// CREDITS: https://github.com/steven-tey/precedent/blob/main/lib/hooks/use-window-size.ts 2import { useEffect, useState } from "react"; 3 4export default function useWindowSize() { 5 const [windowSize, setWindowSize] = useState<{ 6 width: number | undefined; 7 height: number | undefined; 8 }>({ 9 width: undefined, 10 height: undefined, 11 }); 12 13 useEffect(() => { 14 // Handler to call on window resize 15 function handleResize() { 16 // Set window width/height to state 17 setWindowSize({ 18 width: window.innerWidth, 19 height: window.innerHeight, 20 }); 21 } 22 23 // Add event listener 24 window.addEventListener("resize", handleResize); 25 26 // Call handler right away so state gets updated with initial window size 27 handleResize(); 28 29 // Remove event listener on cleanup 30 return () => window.removeEventListener("resize", handleResize); 31 }, []); // Empty array ensures that effect is only run on mount 32 33 return { 34 windowSize, 35 isMobile: typeof windowSize?.width === "number" && windowSize?.width < 640, 36 isTablet: 37 typeof windowSize?.width === "number" && 38 windowSize?.width >= 640 && 39 windowSize?.width < 1024, 40 isDesktop: 41 typeof windowSize?.width === "number" && windowSize?.width >= 1024, 42 }; 43}