diff --git a/src/pages/ProcessDetailPage.tsx b/src/pages/ProcessDetailPage.tsx index ffea65b..b577e94 100644 --- a/src/pages/ProcessDetailPage.tsx +++ b/src/pages/ProcessDetailPage.tsx @@ -177,6 +177,39 @@ export function ProcessDetailPage() { // eslint-disable-next-line react-hooks/exhaustive-deps }, [id]) + // Ctrl+H 快捷键显示/隐藏答案 + useEffect(() => { + if (!isPracticeMode) return + + const handleKeyDown = (e: KeyboardEvent) => { + if (e.ctrlKey && e.key === 'h') { + e.preventDefault() + if (!showAnswer) { + setShowAnswer(true) + setInputLocked(true) + } + } + } + + const handleKeyUp = (e: KeyboardEvent) => { + if (e.key === 'Control' || e.key === 'h') { + if (showAnswer) { + setShowAnswer(false) + setInputLocked(false) + } + } + } + + window.addEventListener('keydown', handleKeyDown) + window.addEventListener('keyup', handleKeyUp) + + return () => { + window.removeEventListener('keydown', handleKeyDown) + window.removeEventListener('keyup', handleKeyUp) + } + }, [isPracticeMode, showAnswer]) + + // ── 验证逻辑 ────────────────────────────────────────────────────────────── const validateInput = useCallback( (input: string[]) => { diff --git a/src/pages/ProcessPracticePage.tsx b/src/pages/ProcessPracticePage.tsx index 4600def..3b0bcae 100644 --- a/src/pages/ProcessPracticePage.tsx +++ b/src/pages/ProcessPracticePage.tsx @@ -319,6 +319,34 @@ export default function ProcessPracticePage() { return () => clearTimeout(timer) }, [showAnswerForCell, restoreFocus]) + // Ctrl+H 快捷键显示/隐藏答案 + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + if (e.ctrlKey && e.key === 'h') { + e.preventDefault() + if (currentCellId && !showAnswerForCell) { + handleLongPress(currentCellId) + } + } + } + + const handleKeyUp = (e: KeyboardEvent) => { + if (e.key === 'Control' || e.key === 'h') { + if (showAnswerForCell) { + handleLongPressEnd() + } + } + } + + window.addEventListener('keydown', handleKeyDown) + window.addEventListener('keyup', handleKeyUp) + + return () => { + window.removeEventListener('keydown', handleKeyDown) + window.removeEventListener('keyup', handleKeyUp) + } + }, [currentCellId, showAnswerForCell, handleLongPress, handleLongPressEnd]) + // 点击格子切换(允许回顾已答对的格子) const handleCellClick = useCallback( (cellId: string) => {