-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgamePiece.tsx
66 lines (60 loc) · 1.84 KB
/
gamePiece.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import { useState } from 'react'
import {
GamePieceHoverState,
GamePieceId,
GamePieceStates,
PlayStates,
} from '@/types/gameStateTypes'
import { isGameOver } from '@/utils/gameUtils'
interface GamePieceProps {
gamePieceState: GamePieceStates
gamePieceId: GamePieceId
onPieceClick: (gamePieceId: GamePieceId) => void
isLegalMoveCurried: (gamePieceId: GamePieceId) => boolean
playState: PlayStates
}
export default function GamePiece({
gamePieceState,
gamePieceId,
onPieceClick,
isLegalMoveCurried,
playState,
}: GamePieceProps) {
const [hoverState, setHoverState] = useState<GamePieceHoverState>(
GamePieceHoverState.notHovered,
)
let pieceColor
switch (gamePieceState) {
case GamePieceStates.playerOne:
pieceColor = 'border-emerald-600 bg-emerald-600'
break
case GamePieceStates.playerTwo:
pieceColor = 'border-red-400 bg-red-400'
break
case GamePieceStates.empty:
default:
pieceColor = 'border-gray-600'
break
}
const onPieceHover = (gamePieceId: GamePieceId) => {
const hoverState = isLegalMoveCurried(gamePieceId)
? GamePieceHoverState.legal
: GamePieceHoverState.illegal
setHoverState(hoverState)
}
const onPieceOut = () => setHoverState(GamePieceHoverState.notHovered)
const hoverClass =
hoverState === GamePieceHoverState.notHovered || isGameOver(playState)
? ''
: hoverState === GamePieceHoverState.legal
? 'hover:outline hover:outline-offset-2 hover:outline-2 hover:outline-emerald-400'
: 'hover:outline hover:outline-offset-2 hover:outline-2 hover:outline-red-800'
return (
<div
className={`w-8 h-8 rounded-full border-4 ${pieceColor} ${hoverClass}`}
onClick={() => onPieceClick(gamePieceId)}
onMouseEnter={() => onPieceHover(gamePieceId)}
onMouseOut={() => onPieceOut()}
/>
)
}