UNPKG

@mantine/hooks

Version:

A collection of 50+ hooks for state and UI management

95 lines (94 loc) 3.38 kB
"use client"; import { useCallback, useEffect, useRef, useState } from "react"; //#region packages/@mantine/hooks/src/use-fullscreen/use-fullscreen.ts function getFullscreenElement() { const _document = window.document; return _document.fullscreenElement || _document.webkitFullscreenElement || _document.mozFullScreenElement || _document.msFullscreenElement; } function exitFullscreen() { const _document = window.document; if (typeof _document.exitFullscreen === "function") return _document.exitFullscreen(); if (typeof _document.msExitFullscreen === "function") return _document.msExitFullscreen(); if (typeof _document.webkitExitFullscreen === "function") return _document.webkitExitFullscreen(); if (typeof _document.mozCancelFullScreen === "function") return _document.mozCancelFullScreen(); return null; } function enterFullScreen(element) { const _element = element; return _element.requestFullscreen?.() || _element.msRequestFullscreen?.() || _element.webkitEnterFullscreen?.() || _element.webkitRequestFullscreen?.() || _element.mozRequestFullscreen?.(); } const prefixes = [ "", "webkit", "moz", "ms" ]; function addEvents(element, { onFullScreen, onError }) { prefixes.forEach((prefix) => { element.addEventListener(`${prefix}fullscreenchange`, onFullScreen); element.addEventListener(`${prefix}fullscreenerror`, onError); }); } function removeEvents(element, { onFullScreen, onError }) { prefixes.forEach((prefix) => { element.removeEventListener(`${prefix}fullscreenchange`, onFullScreen); element.removeEventListener(`${prefix}fullscreenerror`, onError); }); } function useFullscreenElement() { const [fullscreen, setFullscreen] = useState(false); const refElement = useRef(null); const prevNodeRef = useRef(null); const handleFullscreenChange = useCallback(() => { setFullscreen(refElement.current === getFullscreenElement()); }, []); const handleFullscreenError = useCallback(() => { setFullscreen(false); }, []); const toggle = useCallback(async () => { if (!getFullscreenElement() && refElement.current) await enterFullScreen(refElement.current); else await exitFullscreen(); }, []); return { ref: useCallback((node) => { if (prevNodeRef.current && prevNodeRef.current !== node) removeEvents(prevNodeRef.current, { onFullScreen: handleFullscreenChange, onError: handleFullscreenError }); if (node) addEvents(node, { onFullScreen: handleFullscreenChange, onError: handleFullscreenError }); refElement.current = node; prevNodeRef.current = node; }, []), toggle, fullscreen }; } function useFullscreenDocument() { const [fullscreen, setFullscreen] = useState(false); const handleFullscreenChange = useCallback(() => { setFullscreen(getFullscreenElement() === window.document.documentElement); }, []); const handleFullscreenError = useCallback(() => { setFullscreen(false); }, []); const toggle = useCallback(async () => { if (!getFullscreenElement()) await enterFullScreen(window.document.documentElement); else await exitFullscreen(); }, []); useEffect(() => { return addEvents(window.document.documentElement, { onFullScreen: handleFullscreenChange, onError: handleFullscreenError }); }, []); return { toggle, fullscreen }; } //#endregion export { useFullscreenDocument, useFullscreenElement }; //# sourceMappingURL=use-fullscreen.mjs.map