UNPKG

@mantine/hooks

Version:

A collection of 50+ hooks for state and UI management

1 lines 6.53 kB
{"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"}