Update FullscreenButton.tsx and fix linting

This commit is contained in:
carlobortolan 2025-01-13 18:34:11 +01:00
parent 416a45bd2f
commit cc30c2ea49
No known key found for this signature in database
GPG Key ID: 574D9F10F0EED1BE
2 changed files with 30 additions and 17 deletions

View File

@ -1,6 +1,6 @@
'use client';
import { useEffect, RefObject } from 'react';
import { useEffect, useCallback, RefObject } from 'react';
import { MdFullscreen, MdFullscreenExit } from 'react-icons/md';
import { clsx } from 'clsx/lite';
import { useAppState } from '@/state/AppState';
@ -15,39 +15,52 @@ export default function FullscreenButton({
}) {
const { isFullscreen, setIsFullscreen } = useAppState();
const toggleFullscreen = async () => {
// Toggle fullscreen mode
const toggleFullscreen = useCallback(async () => {
if (!document.fullscreenElement) {
await imageRef.current?.requestFullscreen();
setIsFullscreen && setIsFullscreen(true);
setIsFullscreen?.(true);
} else {
await document.exitFullscreen();
setIsFullscreen && setIsFullscreen(false);
setIsFullscreen?.(false);
}
};
}, [imageRef, setIsFullscreen]);
// Toggle fullscreen on 'f' key press
const handleKeyDown = useCallback((event: KeyboardEvent) => {
if (event.key === 'f' || event.key === 'F') {
toggleFullscreen();
}
}, [toggleFullscreen]);
// Handle fullscreen change (e.g, switching tabs in fullscreen mode)
const handleFullscreenChange = useCallback(() => {
if (!document.fullscreenElement) {
setIsFullscreen?.(false);
}
}, [setIsFullscreen]);
useEffect(() => {
const handleKeyDown = (event: KeyboardEvent) => {
if (event.key === 'f' || event.key === 'F') {
toggleFullscreen();
}
};
document.addEventListener('keydown', handleKeyDown);
document.addEventListener('fullscreenchange', handleFullscreenChange);
return () => {
document.removeEventListener('keydown', handleKeyDown);
document.removeEventListener('fullscreenchange', handleFullscreenChange);
};
}, [toggleFullscreen]);
}, [handleKeyDown, handleFullscreenChange]);
return (
<LoaderButton
title="Toggle Fullscreen"
className={clsx(
className,
'text-medium absolute bottom-2 right-2 bg-white p-2 rounded'
'text-medium absolute bottom-2 right-2 bg-white p-2 rounded',
)}
icon={isFullscreen ? <MdFullscreenExit size={18} /> : <MdFullscreen size={18} />}
spinnerColor='light-gray'
styleAs='link'
icon={isFullscreen ? <MdFullscreenExit size={18} />
: <MdFullscreen size={18} />}
spinnerColor="light-gray"
styleAs="link"
onClick={toggleFullscreen}
/>
);

View File

@ -108,6 +108,6 @@ export default function ImageWithFallback(props: ImageProps & {
onError,
}} />
{allowFullscreen && <FullscreenButton imageRef={imgRef} />}
</div>
</div>
);
}