133 lines
5.5 KiB
React
133 lines
5.5 KiB
React
import { useDisclosure } from '@mantine/hooks';
|
|
import React, { useContext, useEffect } from 'react'
|
|
import { ChessGameContext } from '../../context/chess-game-context';
|
|
import { socketBot as socket } from '../../socket';
|
|
import { getUserData } from '../../utils/auth';
|
|
import { Avatar, Button, Flex, MediaQuery, Modal, NavLink, Text, Title } from '@mantine/core';
|
|
import ChessBoard from '../Chess/ChessBoard';
|
|
import GameHistory from '../../components/GameHistory';
|
|
import { useNavigate } from 'react-router-dom';
|
|
import { SOCKET_EVENTS } from '../../constants';
|
|
const { CHESS_MOVE, GAME_END } = SOCKET_EVENTS
|
|
|
|
const ChessGameComputer = () => {
|
|
const { hasGameEnded, gameEndedReason, handleOpponentMove } = useContext(ChessGameContext);
|
|
const [gameEndedModalOpen, modalFunctions] = useDisclosure(true);
|
|
const navigate = useNavigate();
|
|
const user = getUserData();
|
|
let username = user.username;
|
|
let color = localStorage.getItem('myColor') || 'w';
|
|
const roomID = localStorage.getItem('roomID');
|
|
|
|
|
|
useEffect(() => {
|
|
socket.connect();
|
|
socket.emit('INIT', {color});
|
|
|
|
socket.onAny(evt => {
|
|
console.log("event", evt);
|
|
})
|
|
|
|
socket.on("CHESS_BOT_MOVE", (data) => {
|
|
handleOpponentMove(data, () => {
|
|
socket.emit(GAME_END, roomID);
|
|
})
|
|
});
|
|
|
|
return () => {
|
|
socket.offAny();
|
|
socket.disconnect();
|
|
}
|
|
}, []);
|
|
|
|
const exitGame = () => {
|
|
console.log("Ending game");
|
|
socket.disconnect();
|
|
localStorage.removeItem('myColor');
|
|
navigate("/play/computer");
|
|
}
|
|
|
|
const pieceDropCallback = (moveData) => {
|
|
socket.emit(CHESS_MOVE, roomID, moveData);
|
|
}
|
|
const pieceClickCallback = (moveData) => {
|
|
// moveData contains fen string, from, to squares of the move
|
|
socket.emit(CHESS_MOVE, roomID, moveData);
|
|
}
|
|
|
|
// const resign = () => {
|
|
// socket.emit(USER_RESIGNED);
|
|
// endGame('RESIGN');
|
|
// exitGame();
|
|
// }
|
|
|
|
|
|
return (
|
|
<React.Fragment>
|
|
<Modal onClose={modalFunctions.close} opened={hasGameEnded && gameEndedModalOpen} centered>
|
|
<Text>Game ended due to {gameEndedReason}</Text>
|
|
<Button color='lime' onClick={exitGame}>Go back</Button>
|
|
<Button mx='md' color='lime' onClick={modalFunctions.close}>OK</Button>
|
|
</Modal>
|
|
<Flex gap="xl" miw={360} justify='center' align='center' wrap='nowrap' mt={{ base: '50px', sm: '0px' }} direction={{ base: 'column', lg: 'row' }}>
|
|
<Flex gap="xs" justify='center' align='start' wrap='nowrap' direction='column' >
|
|
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
|
|
<NavLink
|
|
style={{ width: "500px" }}
|
|
p="2px"
|
|
// label={isWaiting ? "Waiting for opponent..." : opponent}
|
|
icon={<Avatar radius="3px" >
|
|
Computer
|
|
</Avatar>}
|
|
description={"description"}
|
|
/>
|
|
</div>
|
|
{
|
|
// TODO: handle isWaiting state
|
|
// false ?
|
|
// <>
|
|
// <MediaQuery smallerThan="sm" styles={{ display: 'none' }}>
|
|
// <Image width={600} miw={480} src="/src/assets/images/chess_board.png" />
|
|
// </MediaQuery>
|
|
// <MediaQuery largerThan="sm" styles={{ display: 'none' }}>
|
|
// <Image width="100%" maw={540} src="/src/assets/images/chess_board.png" />
|
|
// </MediaQuery>
|
|
// </>
|
|
// :
|
|
<ChessBoard callbacks={{ pieceDropCallback, pieceClickCallback }} />
|
|
}
|
|
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
|
|
<NavLink
|
|
style={{ width: "500px" }}
|
|
p="2px"
|
|
label={username}
|
|
icon={<Avatar radius="3px" >
|
|
{username[0].toUpperCase()}
|
|
</Avatar>}
|
|
description={"description"}
|
|
/>
|
|
</div>
|
|
</Flex>
|
|
<MediaQuery smallerThan="lg" styles={{ display: 'none' }}>
|
|
<Flex maw={450} sx={{
|
|
width: '100%',
|
|
height: '100%',
|
|
textAlign: 'center',
|
|
borderRadius: '10px',
|
|
backgroundColor: '#272623'
|
|
}} bg='gray' justify='start' py='md' align='center' direction='column' h="600px">
|
|
<Title my='20px'>Game Data</Title>
|
|
<Flex direction='column' w='100%'>
|
|
<GameHistory />
|
|
</Flex>
|
|
<Flex>
|
|
<Button onClick={exitGame} color='red'>Exit </Button>
|
|
</Flex>
|
|
</Flex>
|
|
</MediaQuery>
|
|
</Flex>
|
|
</React.Fragment>
|
|
)
|
|
}
|
|
|
|
export default ChessGameComputer |