diff --git a/src/components/FullscreenButton.tsx b/src/components/FullscreenButton.tsx
index fcbab1b6..e5794184 100644
--- a/src/components/FullscreenButton.tsx
+++ b/src/components/FullscreenButton.tsx
@@ -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 (
: }
- spinnerColor='light-gray'
- styleAs='link'
+ icon={isFullscreen ?
+ : }
+ spinnerColor="light-gray"
+ styleAs="link"
onClick={toggleFullscreen}
/>
);
diff --git a/src/components/image/ImageWithFallback.tsx b/src/components/image/ImageWithFallback.tsx
index 5d18738b..0143c3f8 100644
--- a/src/components/image/ImageWithFallback.tsx
+++ b/src/components/image/ImageWithFallback.tsx
@@ -108,6 +108,6 @@ export default function ImageWithFallback(props: ImageProps & {
onError,
}} />
{allowFullscreen && }
-
+
);
}