All files / web/src/contexts ViewportContext.tsx

100% Statements 72/72
80% Branches 8/10
100% Functions 3/3
100% Lines 72/72

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 731x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 7x 7x 7x 7x 2x 2x 5x 5x 5x 7x 7x 7x 7x 7x 2x 3x 3x 3x 3x 3x 2x 2x 2x 2x 2x 7x 7x 7x 7x 1x 1x 1x 1x 1x 1x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x  
'use client'
 
import { createContext, useContext, useState, useEffect, type ReactNode } from 'react'
 
/**
 * Viewport dimensions
 */
export interface ViewportDimensions {
  width: number
  height: number
}
 
/**
 * Viewport context value
 */
interface ViewportContextValue {
  width: number
  height: number
}
 
const ViewportContext = createContext<ViewportContextValue | null>(null)
 
/**
 * Hook to get viewport dimensions
 * Returns mock dimensions in preview mode, actual window dimensions otherwise
 */
export function useViewport(): ViewportDimensions {
  const context = useContext(ViewportContext)
 
  // If context is provided (preview mode or custom viewport), use it
  if (context) {
    return context
  }
 
  // Otherwise, use actual window dimensions (hook will update on resize)
  const [dimensions, setDimensions] = useState<ViewportDimensions>({
    width: typeof window !== 'undefined' ? window.innerWidth : 1440,
    height: typeof window !== 'undefined' ? window.innerHeight : 900,
  })
 
  useEffect(() => {
    const handleResize = () => {
      setDimensions({
        width: window.innerWidth,
        height: window.innerHeight,
      })
    }
 
    window.addEventListener('resize', handleResize)
    handleResize() // Set initial value
 
    return () => window.removeEventListener('resize', handleResize)
  }, [])
 
  return dimensions
}
 
/**
 * Provider that supplies custom viewport dimensions
 * Used in preview mode to provide mock 1440×900 viewport
 */
export function ViewportProvider({
  children,
  width,
  height,
}: {
  children: ReactNode
  width: number
  height: number
}) {
  return <ViewportContext.Provider value={{ width, height }}>{children}</ViewportContext.Provider>
}