| 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(); |
|
|
| 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) { |
| await element.mozRequestFullScreen(); |
| } else if (element.webkitRequestFullscreen) { |
| await element.webkitRequestFullscreen(); |
| } else if (element.msRequestFullscreen) { |
| 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(); |
| } |
| }; |
|
|
| return { isFullscreenActive, toggleFullscreen, requestFullscreenSupportError }; |
| }; |
|
|