{"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, { onFullScreen, onError }: FullscreenEvents) {\n  prefixes.forEach((prefix) => {\n    element.addEventListener(`${prefix}fullscreenchange`, onFullScreen);\n    element.addEventListener(`${prefix}fullscreenerror`, onError);\n  });\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;AAQzB,QALE,UAAU,qBACV,UAAU,2BACV,UAAU,wBACV,UAAU;;AAKd,SAAS,iBAAiB;CACxB,MAAM,YAAY,OAAO;AAEzB,KAAI,OAAO,UAAU,mBAAmB,WACtC,QAAO,UAAU,gBAAgB;AAEnC,KAAI,OAAO,UAAU,qBAAqB,WACxC,QAAO,UAAU,kBAAkB;AAErC,KAAI,OAAO,UAAU,yBAAyB,WAC5C,QAAO,UAAU,sBAAsB;AAEzC,KAAI,OAAO,UAAU,wBAAwB,WAC3C,QAAO,UAAU,qBAAqB;AAGxC,QAAO;;AAGT,SAAS,gBAAgB,SAAsB;CAC7C,MAAM,WAAW;AAEjB,QACE,SAAS,qBAAqB,IAC9B,SAAS,uBAAuB,IAChC,SAAS,yBAAyB,IAClC,SAAS,2BAA2B,IACpC,SAAS,wBAAwB;;AAIrC,MAAM,WAAW;CAAC;CAAI;CAAU;CAAO;CAAK;AAO5C,SAAS,UAAU,SAAsB,EAAE,cAAc,WAA6B;AACpF,UAAS,SAAS,WAAW;AAC3B,UAAQ,iBAAiB,GAAG,OAAO,mBAAmB,aAAa;AACnE,UAAQ,iBAAiB,GAAG,OAAO,kBAAkB,QAAQ;GAC7D;;AAGJ,SAAS,aAAa,SAAsB,EAAE,cAAc,WAA6B;AACvF,UAAS,SAAS,WAAW;AAC3B,UAAQ,oBAAoB,GAAG,OAAO,mBAAmB,aAAa;AACtE,UAAQ,oBAAoB,GAAG,OAAO,kBAAkB,QAAQ;GAChE;;AASJ,SAAgB,uBAEwB;CACtC,MAAM,CAAC,YAAY,iBAAiB,SAAkB,MAAM;CAC5D,MAAM,aAAa,OAAiB,KAAK;CACzC,MAAM,cAAc,OAAiB,KAAK;CAE1C,MAAM,yBAAyB,kBAAkB;AAC/C,gBAAc,WAAW,YAAY,sBAAsB,CAAC;IAC3D,EAAE,CAAC;CAEN,MAAM,wBAAwB,kBAAkB;AAC9C,gBAAc,MAAM;IACnB,EAAE,CAAC;CAEN,MAAM,SAAS,YAAY,YAAY;AACrC,MAAI,CAAC,sBAAsB,IAAI,WAAW,QACxC,OAAM,gBAAgB,WAAW,QAAQ;MAEzC,OAAM,gBAAgB;IAEvB,EAAE,CAAC;AAqBN,QAAO;EAAE,KAnBwC,aAAa,SAAS;AACrE,OAAI,YAAY,WAAW,YAAY,YAAY,KACjD,cAAa,YAAY,SAAS;IAChC,cAAc;IACd,SAAS;IACV,CAAC;AAGJ,OAAI,KACF,WAAU,MAAM;IACd,cAAc;IACd,SAAS;IACV,CAAC;AAGJ,cAAW,UAAU;AACrB,eAAY,UAAU;KACrB,EAAE,CAAC;EAEqB;EAAQ;EAAY;;AAQjD,SAAgB,wBAA0D;CACxE,MAAM,CAAC,YAAY,iBAAiB,SAAkB,MAAM;CAE5D,MAAM,yBAAyB,kBAAkB;AAC/C,gBAAc,sBAAsB,KAAK,OAAO,SAAS,gBAAgB;IACxE,EAAE,CAAC;CAEN,MAAM,wBAAwB,kBAAkB;AAC9C,gBAAc,MAAM;IACnB,EAAE,CAAC;CAEN,MAAM,SAAS,YAAY,YAAY;AACrC,MAAI,CAAC,sBAAsB,CACzB,OAAM,gBAAgB,OAAO,SAAS,gBAAgB;MAEtD,OAAM,gBAAgB;IAEvB,EAAE,CAAC;AAEN,iBAAgB;AACd,SAAO,UAAU,OAAO,SAAS,iBAAiB;GAChD,cAAc;GACd,SAAS;GACV,CAAC;IACD,EAAE,CAAC;AAEN,QAAO;EAAE;EAAQ;EAAY"}