{"version":3,"file":"use-fullscreen.mjs","names":[],"sources":["../../src/use-fullscreen/use-fullscreen.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\n\nfunction getFullscreenElement(): HTMLElement | null {\n  const _document = window.document as any;\n\n  const fullscreenElement =\n    _document.fullscreenElement ||\n    _document.webkitFullscreenElement ||\n    _document.mozFullScreenElement ||\n    _document.msFullscreenElement;\n\n  return fullscreenElement;\n}\n\nfunction exitFullscreen() {\n  const _document = window.document as any;\n\n  if (typeof _document.exitFullscreen === 'function') {\n    return _document.exitFullscreen();\n  }\n  if (typeof _document.msExitFullscreen === 'function') {\n    return _document.msExitFullscreen();\n  }\n  if (typeof _document.webkitExitFullscreen === 'function') {\n    return _document.webkitExitFullscreen();\n  }\n  if (typeof _document.mozCancelFullScreen === 'function') {\n    return _document.mozCancelFullScreen();\n  }\n\n  return null;\n}\n\nfunction enterFullScreen(element: HTMLElement) {\n  const _element = element as any;\n\n  return (\n    _element.requestFullscreen?.() ||\n    _element.msRequestFullscreen?.() ||\n    _element.webkitEnterFullscreen?.() ||\n    _element.webkitRequestFullscreen?.() ||\n    _element.mozRequestFullscreen?.()\n  );\n}\n\nconst prefixes = ['', 'webkit', 'moz', 'ms'];\n\ninterface FullscreenEvents {\n  onFullScreen: (event: Event) => void;\n  onError: (event: Event) => void;\n}\n\nfunction addEvents(element: HTMLElement, events: FullscreenEvents) {\n  const { onFullScreen, onError } = events;\n  prefixes.forEach((prefix) => {\n    element.addEventListener(`${prefix}fullscreenchange`, onFullScreen);\n    element.addEventListener(`${prefix}fullscreenerror`, onError);\n  });\n\n  return () => removeEvents(element, events);\n}\n\nfunction removeEvents(element: HTMLElement, { onFullScreen, onError }: FullscreenEvents) {\n  prefixes.forEach((prefix) => {\n    element.removeEventListener(`${prefix}fullscreenchange`, onFullScreen);\n    element.removeEventListener(`${prefix}fullscreenerror`, onError);\n  });\n}\n\nexport interface UseFullscreenElementReturnValue<T extends HTMLElement = any> {\n  ref: React.RefCallback<T | null>;\n  toggle: () => Promise<void>;\n  fullscreen: boolean;\n}\n\nexport function useFullscreenElement<\n  T extends HTMLElement = any,\n>(): UseFullscreenElementReturnValue<T> {\n  const [fullscreen, setFullscreen] = useState<boolean>(false);\n  const refElement = useRef<T | null>(null);\n  const prevNodeRef = useRef<T | null>(null);\n\n  const handleFullscreenChange = useCallback(() => {\n    setFullscreen(refElement.current === getFullscreenElement());\n  }, []);\n\n  const handleFullscreenError = useCallback(() => {\n    setFullscreen(false);\n  }, []);\n\n  const toggle = useCallback(async () => {\n    if (!getFullscreenElement() && refElement.current) {\n      await enterFullScreen(refElement.current);\n    } else {\n      await exitFullscreen();\n    }\n  }, []);\n\n  const refCallback: React.RefCallback<T | null> = useCallback((node) => {\n    if (prevNodeRef.current && prevNodeRef.current !== node) {\n      removeEvents(prevNodeRef.current, {\n        onFullScreen: handleFullscreenChange,\n        onError: handleFullscreenError,\n      });\n    }\n\n    if (node) {\n      addEvents(node, {\n        onFullScreen: handleFullscreenChange,\n        onError: handleFullscreenError,\n      });\n    }\n\n    refElement.current = node;\n    prevNodeRef.current = node;\n  }, []);\n\n  return { ref: refCallback, toggle, fullscreen };\n}\n\nexport interface UseFullscreenDocumentReturnValue {\n  toggle: () => Promise<void>;\n  fullscreen: boolean;\n}\n\nexport function useFullscreenDocument(): UseFullscreenDocumentReturnValue {\n  const [fullscreen, setFullscreen] = useState<boolean>(false);\n\n  const handleFullscreenChange = useCallback(() => {\n    setFullscreen(getFullscreenElement() === window.document.documentElement);\n  }, []);\n\n  const handleFullscreenError = useCallback(() => {\n    setFullscreen(false);\n  }, []);\n\n  const toggle = useCallback(async () => {\n    if (!getFullscreenElement()) {\n      await enterFullScreen(window.document.documentElement);\n    } else {\n      await exitFullscreen();\n    }\n  }, []);\n\n  useEffect(() => {\n    return addEvents(window.document.documentElement, {\n      onFullScreen: handleFullscreenChange,\n      onError: handleFullscreenError,\n    });\n  }, []);\n\n  return { toggle, fullscreen };\n}\n"],"mappings":";;;AAEA,SAAS,uBAA2C;CAClD,MAAM,YAAY,OAAO;CAQzB,OALE,UAAU,qBACV,UAAU,2BACV,UAAU,wBACV,UAAU;AAGd;AAEA,SAAS,iBAAiB;CACxB,MAAM,YAAY,OAAO;CAEzB,IAAI,OAAO,UAAU,mBAAmB,YACtC,OAAO,UAAU,eAAe;CAElC,IAAI,OAAO,UAAU,qBAAqB,YACxC,OAAO,UAAU,iBAAiB;CAEpC,IAAI,OAAO,UAAU,yBAAyB,YAC5C,OAAO,UAAU,qBAAqB;CAExC,IAAI,OAAO,UAAU,wBAAwB,YAC3C,OAAO,UAAU,oBAAoB;CAGvC,OAAO;AACT;AAEA,SAAS,gBAAgB,SAAsB;CAC7C,MAAM,WAAW;CAEjB,OACE,SAAS,oBAAoB,KAC7B,SAAS,sBAAsB,KAC/B,SAAS,wBAAwB,KACjC,SAAS,0BAA0B,KACnC,SAAS,uBAAuB;AAEpC;AAEA,MAAM,WAAW;CAAC;CAAI;CAAU;CAAO;AAAI;AAO3C,SAAS,UAAU,SAAsB,QAA0B;CACjE,MAAM,EAAE,cAAc,YAAY;CAClC,SAAS,SAAS,WAAW;EAC3B,QAAQ,iBAAiB,GAAG,OAAO,mBAAmB,YAAY;EAClE,QAAQ,iBAAiB,GAAG,OAAO,kBAAkB,OAAO;CAC9D,CAAC;CAED,aAAa,aAAa,SAAS,MAAM;AAC3C;AAEA,SAAS,aAAa,SAAsB,EAAE,cAAc,WAA6B;CACvF,SAAS,SAAS,WAAW;EAC3B,QAAQ,oBAAoB,GAAG,OAAO,mBAAmB,YAAY;EACrE,QAAQ,oBAAoB,GAAG,OAAO,kBAAkB,OAAO;CACjE,CAAC;AACH;AAQA,SAAgB,uBAEwB;CACtC,MAAM,CAAC,YAAY,iBAAiB,SAAkB,KAAK;CAC3D,MAAM,aAAa,OAAiB,IAAI;CACxC,MAAM,cAAc,OAAiB,IAAI;CAEzC,MAAM,yBAAyB,kBAAkB;EAC/C,cAAc,WAAW,YAAY,qBAAqB,CAAC;CAC7D,GAAG,CAAC,CAAC;CAEL,MAAM,wBAAwB,kBAAkB;EAC9C,cAAc,KAAK;CACrB,GAAG,CAAC,CAAC;CAEL,MAAM,SAAS,YAAY,YAAY;EACrC,IAAI,CAAC,qBAAqB,KAAK,WAAW,SACxC,MAAM,gBAAgB,WAAW,OAAO;OAExC,MAAM,eAAe;CAEzB,GAAG,CAAC,CAAC;CAqBL,OAAO;EAAE,KAnBwC,aAAa,SAAS;GACrE,IAAI,YAAY,WAAW,YAAY,YAAY,MACjD,aAAa,YAAY,SAAS;IAChC,cAAc;IACd,SAAS;GACX,CAAC;GAGH,IAAI,MACF,UAAU,MAAM;IACd,cAAc;IACd,SAAS;GACX,CAAC;GAGH,WAAW,UAAU;GACrB,YAAY,UAAU;EACxB,GAAG,CAAC,CAEoB;EAAG;EAAQ;CAAW;AAChD;AAOA,SAAgB,wBAA0D;CACxE,MAAM,CAAC,YAAY,iBAAiB,SAAkB,KAAK;CAE3D,MAAM,yBAAyB,kBAAkB;EAC/C,cAAc,qBAAqB,MAAM,OAAO,SAAS,eAAe;CAC1E,GAAG,CAAC,CAAC;CAEL,MAAM,wBAAwB,kBAAkB;EAC9C,cAAc,KAAK;CACrB,GAAG,CAAC,CAAC;CAEL,MAAM,SAAS,YAAY,YAAY;EACrC,IAAI,CAAC,qBAAqB,GACxB,MAAM,gBAAgB,OAAO,SAAS,eAAe;OAErD,MAAM,eAAe;CAEzB,GAAG,CAAC,CAAC;CAEL,gBAAgB;EACd,OAAO,UAAU,OAAO,SAAS,iBAAiB;GAChD,cAAc;GACd,SAAS;EACX,CAAC;CACH,GAAG,CAAC,CAAC;CAEL,OAAO;EAAE;EAAQ;CAAW;AAC9B"}