MIF_E31221222/sigap-website/app/_hooks/use-fullscreen.ts

104 lines
3.0 KiB
TypeScript

'use client';
import { useState, useEffect, RefObject } from 'react';
/**
* Hook for detecting fullscreen state changes
* @param containerRef Reference to the container element
* @returns Object containing the fullscreen state and functions to control it
*/
export function useFullscreen(containerRef: RefObject<HTMLElement | null>) {
const [isFullscreen, setIsFullscreen] = useState<boolean>(false);
useEffect(() => {
const handleFullscreenChange = () => {
const fullscreenElement =
document.fullscreenElement ||
(document as any).webkitFullscreenElement ||
(document as any).mozFullScreenElement ||
(document as any).msFullscreenElement;
setIsFullscreen(!!fullscreenElement);
};
// Add event listeners for fullscreen changes across browsers
document.addEventListener('fullscreenchange', handleFullscreenChange);
document.addEventListener('webkitfullscreenchange', handleFullscreenChange);
document.addEventListener('mozfullscreenchange', handleFullscreenChange);
document.addEventListener('MSFullscreenChange', handleFullscreenChange);
// Cleanup function to remove event listeners
return () => {
document.removeEventListener('fullscreenchange', handleFullscreenChange);
document.removeEventListener(
'webkitfullscreenchange',
handleFullscreenChange
);
document.removeEventListener(
'mozfullscreenchange',
handleFullscreenChange
);
document.removeEventListener(
'MSFullscreenChange',
handleFullscreenChange
);
};
}, []);
/**
* Requests fullscreen for the container element
*/
const enterFullscreen = () => {
if (!containerRef.current) return;
const element = containerRef.current;
if (element.requestFullscreen) {
element.requestFullscreen();
} else if ((element as any).webkitRequestFullscreen) {
(element as any).webkitRequestFullscreen();
} else if ((element as any).mozRequestFullScreen) {
(element as any).mozRequestFullScreen();
} else if ((element as any).msRequestFullscreen) {
(element as any).msRequestFullscreen();
}
};
/**
* Exits fullscreen mode
*/
const exitFullscreen = () => {
if (document.exitFullscreen) {
document.exitFullscreen();
} else if ((document as any).webkitExitFullscreen) {
(document as any).webkitExitFullscreen();
} else if ((document as any).mozCancelFullScreen) {
(document as any).mozCancelFullScreen();
} else if ((document as any).msExitFullscreen) {
(document as any).msExitFullscreen();
}
};
/**
* Toggles fullscreen mode
*/
const toggleFullscreen = () => {
if (isFullscreen) {
exitFullscreen();
} else {
enterFullscreen();
}
};
// Cek apakah hook use-fullscreen mengembalikan nilai isFullscreen dengan benar.
// Tambahkan console.log untuk debugging jika diperlukan.
console.log("Fullscreen state:", isFullscreen);
return {
isFullscreen,
enterFullscreen,
exitFullscreen,
toggleFullscreen,
};
}