|
|
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 }; |
|
|
}; |
|
|
|