@erudilabs/use-fullscreen
Version:
use-fullscreen allows to enter/exit fullscreen
1 lines • 5.45 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useCallback, useRef, useState, useEffect } 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\nasync function exitFullscreen() {\n const _document = window.document as any\n\n if (typeof _document.exitFullscreen === 'function')\n return _document.exitFullscreen()\n if (typeof _document.msExitFullscreen === 'function')\n return _document.msExitFullscreen()\n if (typeof _document.webkitExitFullscreen === 'function')\n return _document.webkitExitFullscreen()\n if (typeof _document.mozCancelFullScreen === 'function')\n return _document.mozCancelFullScreen()\n\n return null\n}\n\nasync function 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\nfunction addEvents(\n element: HTMLElement,\n {\n onFullScreen,\n onError,\n }: { onFullScreen: (event: Event) => void; onError: (event: Event) => void }\n) {\n prefixes.forEach((prefix) => {\n element.addEventListener(`${prefix}fullscreenchange`, onFullScreen)\n element.addEventListener(`${prefix}fullscreenerror`, onError)\n })\n\n return () => {\n prefixes.forEach((prefix) => {\n element.removeEventListener(`${prefix}fullscreenchange`, onFullScreen)\n element.removeEventListener(`${prefix}fullscreenerror`, onError)\n })\n }\n}\n\nexport function useFullscreen<T extends HTMLElement = any>() {\n const [fullscreen, setFullscreen] = useState<boolean>(false)\n\n const _ref = useRef<T>()\n\n const handleFullscreenChange = useCallback(\n (event: Event) => {\n setFullscreen(event.target === getFullscreenElement())\n },\n [setFullscreen]\n )\n\n const handleFullscreenError = useCallback(\n (event: Event) => {\n setFullscreen(false)\n // eslint-disable-next-line no-console\n console.error(\n `[@erudilabs/use-fullscreen]: Error attempting full-screen mode method: ${event} (${event.target})`\n )\n },\n [setFullscreen]\n )\n\n const toggle = useCallback(async () => {\n if (!getFullscreenElement()) {\n await enterFullScreen(_ref.current)\n } else {\n await exitFullscreen()\n }\n }, [])\n\n const ref = useCallback((element: T | null) => {\n if (element === null) {\n _ref.current = window.document.documentElement as T\n } else {\n _ref.current = element\n }\n }, [])\n\n useEffect(() => {\n if (!_ref.current && window.document) {\n _ref.current = window.document.documentElement as T\n return addEvents(_ref.current, {\n onFullScreen: handleFullscreenChange,\n onError: handleFullscreenError,\n })\n }\n\n if (_ref.current) {\n return addEvents(_ref.current, {\n onFullScreen: handleFullscreenChange,\n onError: handleFullscreenError,\n })\n }\n\n return undefined\n }, [])\n\n return { ref, toggle, fullscreen } as const\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,aAAa,QAAQ,UAAU,iBAAiB;AAEzD,SAAS,uBAA2C;AAClD,QAAM,YAAY,OAAO;AAEzB,QAAM,oBACJ,UAAU,qBACV,UAAU,2BACV,UAAU,wBACV,UAAU;AAEZ,SAAO;AACT;AAEA,SAAe,iBAAiB;AAAA;AAC9B,UAAM,YAAY,OAAO;AAEzB,QAAI,OAAO,UAAU,mBAAmB;AACtC,aAAO,UAAU,eAAe;AAClC,QAAI,OAAO,UAAU,qBAAqB;AACxC,aAAO,UAAU,iBAAiB;AACpC,QAAI,OAAO,UAAU,yBAAyB;AAC5C,aAAO,UAAU,qBAAqB;AACxC,QAAI,OAAO,UAAU,wBAAwB;AAC3C,aAAO,UAAU,oBAAoB;AAEvC,WAAO;AAAA,EACT;AAAA;AAEA,SAAe,gBAAgB,SAAuB;AAAA;AA9BtD;AA+BE,UAAM,WAAW;AAEjB,aACE,cAAS,sBAAT,wCACA,cAAS,wBAAT,wCACA,cAAS,0BAAT,wCACA,cAAS,4BAAT,wCACA,cAAS,yBAAT;AAAA,EAEJ;AAAA;AAEA,IAAM,WAAW,CAAC,IAAI,UAAU,OAAO,IAAI;AAE3C,SAAS,UACP,SACA;AAAA,EACE;AAAA,EACA;AACF,GACA;AACA,WAAS,QAAQ,CAAC,WAAW;AAC3B,YAAQ,iBAAiB,GAAG,0BAA0B,YAAY;AAClE,YAAQ,iBAAiB,GAAG,yBAAyB,OAAO;AAAA,EAC9D,CAAC;AAED,SAAO,MAAM;AACX,aAAS,QAAQ,CAAC,WAAW;AAC3B,cAAQ,oBAAoB,GAAG,0BAA0B,YAAY;AACrE,cAAQ,oBAAoB,GAAG,yBAAyB,OAAO;AAAA,IACjE,CAAC;AAAA,EACH;AACF;AAEO,SAAS,gBAA6C;AAC3D,QAAM,CAAC,YAAY,aAAa,IAAI,SAAkB,KAAK;AAE3D,QAAM,OAAO,OAAU;AAEvB,QAAM,yBAAyB;AAAA,IAC7B,CAAC,UAAiB;AAChB,oBAAc,MAAM,WAAW,qBAAqB,CAAC;AAAA,IACvD;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,wBAAwB;AAAA,IAC5B,CAAC,UAAiB;AAChB,oBAAc,KAAK;AAEnB,cAAQ;AAAA,QACN,0EAA0E,UAAU,MAAM;AAAA,MAC5F;AAAA,IACF;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,SAAS,YAAY,MAAY;AACrC,QAAI,CAAC,qBAAqB,GAAG;AAC3B,YAAM,gBAAgB,KAAK,OAAO;AAAA,IACpC,OAAO;AACL,YAAM,eAAe;AAAA,IACvB;AAAA,EACF,IAAG,CAAC,CAAC;AAEL,QAAM,MAAM,YAAY,CAAC,YAAsB;AAC7C,QAAI,YAAY,MAAM;AACpB,WAAK,UAAU,OAAO,SAAS;AAAA,IACjC,OAAO;AACL,WAAK,UAAU;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,QAAI,CAAC,KAAK,WAAW,OAAO,UAAU;AACpC,WAAK,UAAU,OAAO,SAAS;AAC/B,aAAO,UAAU,KAAK,SAAS;AAAA,QAC7B,cAAc;AAAA,QACd,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,QAAI,KAAK,SAAS;AAChB,aAAO,UAAU,KAAK,SAAS;AAAA,QAC7B,cAAc;AAAA,QACd,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,KAAK,QAAQ,WAAW;AACnC;","names":[]}