Download hooks/useFullscreen.ts from im1111/xpaintdev: direct link, hf CLI and curl.
- Browser
- Download file 3.55 kB
-
https://huggingface.co/spaces/im1111/xpaintdev/resolve/main/hooks/useFullscreen.ts
- Command line
-
hf download hf://spaces/im1111/xpaintdev/hooks/useFullscreen.ts
-
curl -L -o useFullscreen.ts https://huggingface.co/spaces/im1111/xpaintdev/resolve/main/hooks/useFullscreen.ts
3.55 kB
| import { useState, useEffect, useCallback } from 'react'; | |
| export interface FullscreenHook { | |
| isFullscreenActive: boolean; | |
| toggleFullscreen: () => Promise<void>; | |
| requestFullscreenSupportError?: string; | |
| } | |
| export const useFullscreen = ( | |
| showToast?: (message: string, type: 'info' | 'error') => void | |
| ): FullscreenHook => { | |
| const [isFullscreenActive, setIsFullscreenActive] = useState<boolean>(false); | |
| const [requestFullscreenSupportError, setRequestFullscreenSupportError] = useState<string | undefined>(); | |
| const handleFullscreenChange = useCallback(() => { | |
| setIsFullscreenActive(!!( | |
| document.fullscreenElement || | |
| (document as any).webkitFullscreenElement || | |
| (document as any).mozFullScreenElement || | |
| (document as any).msFullscreenElement | |
| )); | |
| }, []); | |
| useEffect(() => { | |
| document.addEventListener('fullscreenchange', handleFullscreenChange); | |
| document.addEventListener('webkitfullscreenchange', handleFullscreenChange); | |
| document.addEventListener('mozfullscreenchange', handleFullscreenChange); | |
| document.addEventListener('MSFullscreenChange', handleFullscreenChange); | |
| handleFullscreenChange(); // Initial check | |
| return () => { | |
| document.removeEventListener('fullscreenchange', handleFullscreenChange); | |
| document.removeEventListener('webkitfullscreenchange', handleFullscreenChange); | |
| document.removeEventListener('mozfullscreenchange', handleFullscreenChange); | |
| document.removeEventListener('MSFullscreenChange', handleFullscreenChange); | |
| }; | |
| }, [handleFullscreenChange]); | |
| const toggleFullscreen = async () => { | |
| const element = document.documentElement as any; | |
| try { | |
| if (!isFullscreenActive) { | |
| if (element.requestFullscreen) { | |
| await element.requestFullscreen(); | |
| } else if (element.mozRequestFullScreen) { // Firefox | |
| await element.mozRequestFullScreen(); | |
| } else if (element.webkitRequestFullscreen) { // Chrome, Safari, Opera | |
| await element.webkitRequestFullscreen(); | |
| } else if (element.msRequestFullscreen) { // IE/Edge | |
| await element.msRequestFullscreen(); | |
| } else { | |
| const errorMsg = "Fullscreen API is not supported by this browser."; | |
| setRequestFullscreenSupportError(errorMsg); | |
| if (showToast) showToast(errorMsg, "error"); | |
| return; | |
| } | |
| } else { | |
| if (document.exitFullscreen) { | |
| await document.exitFullscreen(); | |
| } else if ((document as any).mozCancelFullScreen) { | |
| await (document as any).mozCancelFullScreen(); | |
| } else if ((document as any).webkitExitFullscreen) { | |
| await (document as any).webkitExitFullscreen(); | |
| } else if ((document as any).msExitFullscreen) { | |
| await (document as any).msExitFullscreen(); | |
| } else { | |
| const errorMsg = "Could not exit fullscreen. API not found."; | |
| setRequestFullscreenSupportError(errorMsg); | |
| if (showToast) showToast(errorMsg, "error"); | |
| return; | |
| } | |
| } | |
| setRequestFullscreenSupportError(undefined); | |
| } catch (err: any) { | |
| console.error("Fullscreen API error:", err); | |
| const errorMsg = `Fullscreen mode change failed: ${err.message || 'Unknown error'}`; | |
| setRequestFullscreenSupportError(errorMsg); | |
| if (showToast) showToast(errorMsg, "error"); | |
| handleFullscreenChange(); // Ensure state reflects reality | |
| } | |
| }; | |
| return { isFullscreenActive, toggleFullscreen, requestFullscreenSupportError }; | |
| }; | |