Skip to content

Commit c409b86

Browse files
feat: add keyboard navigation to analysis
1 parent 4197ec2 commit c409b86

2 files changed

Lines changed: 48 additions & 1 deletion

File tree

src/components/Board/AnalysisMovesContainer.tsx

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* eslint-disable jsx-a11y/no-static-element-interactions */
22
/* eslint-disable jsx-a11y/click-events-have-key-events */
3-
import React, { useContext, useMemo, Fragment } from 'react'
3+
import React, { useContext, useMemo, Fragment, useEffect } from 'react'
44
import { AnalysisGameControllerContext, WindowSizeContext } from 'src/contexts'
55
import { GameNode, AnalyzedGame, Termination, ClientBaseGame } from 'src/types'
66

@@ -64,6 +64,32 @@ export const AnalysisMovesContainer: React.FC<Props> = ({
6464
return game.tree.getMainLine()
6565
}, [game.tree])
6666

67+
useEffect(() => {
68+
const handleKeyDown = (event: KeyboardEvent) => {
69+
if (!currentNode) return
70+
71+
switch (event.key) {
72+
case 'ArrowRight':
73+
event.preventDefault()
74+
if (currentNode.mainChild) {
75+
goToNode(currentNode.mainChild)
76+
}
77+
break
78+
case 'ArrowLeft':
79+
event.preventDefault()
80+
if (currentNode.parent) {
81+
goToNode(currentNode.parent)
82+
}
83+
break
84+
default:
85+
break
86+
}
87+
}
88+
89+
window.addEventListener('keydown', handleKeyDown)
90+
return () => window.removeEventListener('keydown', handleKeyDown)
91+
}, [currentNode, goToNode])
92+
6793
const moves = useMemo(() => {
6894
const nodes = mainLineNodes.slice(1)
6995
const rows: (GameNode | null)[][] = []

src/pages/play/maia.tsx

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,27 @@ const PlayMaia: React.FC<Props> = ({
165165
}: Props) => {
166166
const controller = useVsMaiaPlayController(id, playGameConfig)
167167

168+
useEffect(() => {
169+
const handleKeyDown = (event: KeyboardEvent) => {
170+
if (!controller.playerActive || controller.game.termination) return
171+
172+
switch (event.key) {
173+
case 'ArrowRight':
174+
event.preventDefault()
175+
break
176+
case 'ArrowLeft':
177+
event.preventDefault()
178+
179+
break
180+
default:
181+
break
182+
}
183+
}
184+
185+
window.addEventListener('keydown', handleKeyDown)
186+
return () => window.removeEventListener('keydown', handleKeyDown)
187+
}, [controller.playerActive, controller.game.termination])
188+
168189
return (
169190
<PlayControllerContext.Provider value={controller}>
170191
<GameplayInterface>

0 commit comments

Comments
 (0)