useViewport.ts 614 B

12345678910111213141516171819202122
  1. 'use client'
  2. import { useEffect, useState } from 'react'
  3. export type Viewport = { width: number; height: number }
  4. function getViewport(): Viewport {
  5. if (typeof window === 'undefined') return { width: 0, height: 0 }
  6. return { width: window.innerWidth, height: window.innerHeight }
  7. }
  8. export function useViewport(): Viewport {
  9. const [viewport, setViewport] = useState<Viewport>(getViewport)
  10. useEffect(() => {
  11. const onResize = () => setViewport(getViewport())
  12. window.addEventListener('resize', onResize)
  13. return () => window.removeEventListener('resize', onResize)
  14. }, [])
  15. return viewport
  16. }