104 lines
3.0 KiB
TypeScript
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,
|
|
};
|
|
}
|