| import React, { useContext } from 'react' |
|
|
| import PropTypes from 'prop-types'; |
| import { socket } from '../socket'; |
| import { Box, Flex } from '@mantine/core'; |
| import { useDroppable } from '@dnd-kit/core' |
|
|
| import Piece from './Piece'; |
| import { ChessGameContext } from '../context/chess-game-context'; |
|
|
| import { SOCKET_EVENTS } from '../constants'; |
| const { CHESS_MOVE, GAME_END } = SOCKET_EVENTS |
|
|
| const Cell = ({ cell, callbacks }) => { |
| let roomID = localStorage.getItem('roomID'); |
| let { square, type } = cell; |
| const { getSquareColor, isSquareMarked, handleSquareClick, isLastMoveSquare } = useContext(ChessGameContext) |
| const { isOver, setNodeRef } = useDroppable({ id: square }); |
| let squareColor = getSquareColor(square); |
| let historyCell = isLastMoveSquare(square); |
|
|
| let marked = isSquareMarked(square); |
| let borderColor = isOver ? '#77777744' : 'transparent'; |
| let borderWidth = type ? '3px' : '5px' |
|
|
| const handleClick = () => { |
| handleSquareClick(square, callbacks.pieceClickCallback, () => { |
| socket.emit(GAME_END, roomID); |
| }); |
| } |
|
|
| let content = null; |
| if (marked && !type) { |
| content = <Mark /> |
| } else if (type) { |
| content = <Piece cell={cell} /> |
| } |
|
|
| return ( |
| <Flex ref={setNodeRef} w='10vh' sx={theme => { |
| let color = theme.colors.lime; |
| return { backgroundColor: historyCell ? '#c0cc5c' : (squareColor === 'b' ? '#769854' : '#e8edcd'), aspectRatio: '1/1' } |
| }} onClick={handleClick} bg={squareColor === 'w' ? "white" : "gray"} > |
| {content} |
| </Flex> |
| ) |
| } |
|
|
| const Mark = () => { |
| return ( |
| <Box w="36%" h="36%" sx={{ backgroundColor: '#77777755', borderRadius: '100%' }} m="auto"></Box> |
| ) |
| } |
|
|
| Cell.propTypes = { |
| cell: PropTypes.shape({ |
| square: PropTypes.string.isRequired, |
| type: PropTypes.oneOf(['p', 'r', 'n', 'b', 'q', 'k']), |
| color: PropTypes.oneOf(['w', 'b']) |
| }) |
| } |
|
|
|
|
| export default Cell |