import * as React from "react" const MOBILE_BREAKPOINT = 768 const TABLET_BREAKPOINT = 1024 const TOUCH_SUPPORT = typeof window !== 'undefined' && 'ontouchstart' in window export function useIsMobile() { const [isMobile, setIsMobile] = React.useState(undefined) React.useEffect(() => { const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`) const onChange = () => { setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) } mql.addEventListener("change", onChange) setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) return () => mql.removeEventListener("change", onChange) }, []) return !!isMobile } export function useDeviceInfo() { const [deviceInfo, setDeviceInfo] = React.useState({ isMobile: false, isTablet: false, isDesktop: false, hasTouch: false, viewport: { width: 0, height: 0 } }) React.useEffect(() => { const updateDeviceInfo = () => { const width = window.innerWidth const height = window.innerHeight setDeviceInfo({ isMobile: width < MOBILE_BREAKPOINT, isTablet: width >= MOBILE_BREAKPOINT && width < TABLET_BREAKPOINT, isDesktop: width >= TABLET_BREAKPOINT, hasTouch: TOUCH_SUPPORT, viewport: { width, height } }) } const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`) const mqt = window.matchMedia(`(max-width: ${TABLET_BREAKPOINT - 1}px)`) updateDeviceInfo() const handleResize = () => updateDeviceInfo() mql.addEventListener("change", handleResize) mqt.addEventListener("change", handleResize) window.addEventListener("resize", handleResize) return () => { mql.removeEventListener("change", handleResize) mqt.removeEventListener("change", handleResize) window.removeEventListener("resize", handleResize) } }, []) return deviceInfo }