ManimCat / frontend /src /components /image-preview /lightbox /useLightboxKeyboard.ts
Bin29's picture
Sync from main: e764154 feat(plot-skill): add math-exam-diagram SKILL.md for exam-style math figures
abcf568
import { useEffect } from 'react'
interface UseLightboxKeyboardOptions {
shouldRender: boolean
isAnnotating: boolean
isStudioAppearance: boolean
hasCommitHandler: boolean
onClose: () => void
onPrev?: () => void
onNext?: () => void
onToggleAnnotating: () => void
onCloseContextMenu: () => void
}
export function useLightboxKeyboard({
shouldRender,
isAnnotating,
isStudioAppearance,
hasCommitHandler,
onClose,
onPrev,
onNext,
onToggleAnnotating,
onCloseContextMenu,
}: UseLightboxKeyboardOptions) {
useEffect(() => {
if (!shouldRender) {
return undefined;
}
const handleKeyDown = (event: KeyboardEvent) => {
if (event.key === 'Escape') {
event.preventDefault();
onCloseContextMenu();
if (isAnnotating) {
onToggleAnnotating();
} else {
onClose();
}
} else if (event.key === 'ArrowLeft') {
if (isAnnotating) {
return;
}
event.preventDefault();
onCloseContextMenu();
onPrev?.();
} else if (event.key === 'ArrowRight') {
if (isAnnotating) {
return;
}
event.preventDefault();
onCloseContextMenu();
onNext?.();
} else if (
isStudioAppearance &&
hasCommitHandler &&
event.key === 'Shift' &&
!event.metaKey &&
!event.ctrlKey &&
!event.altKey &&
!event.repeat
) {
const target = event.target as HTMLElement | null;
if (
target instanceof HTMLInputElement ||
target instanceof HTMLTextAreaElement ||
target instanceof HTMLSelectElement ||
target?.isContentEditable
) {
return;
}
event.preventDefault();
onToggleAnnotating();
}
};
window.addEventListener('keydown', handleKeyDown, true);
return () => window.removeEventListener('keydown', handleKeyDown, true);
}, [isAnnotating, isStudioAppearance, hasCommitHandler, onClose, onCloseContextMenu, onNext, onPrev, onToggleAnnotating, shouldRender]);
}