diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index c449bd6..432b7a5 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -1,6 +1,7 @@ import { createBrowserRouter, redirect, RouterProvider } from 'react-router-dom' -import Home from './pages/Home' + import MainLayout from './layout/MainLayout' +import Home from './pages/Home' import Settings from './pages/Settings/Settings' import Friends from './pages/Settings/Friends' import Password from './pages/Settings/Password' @@ -9,11 +10,11 @@ import PlayLayout from './pages/Play/Layout' import PlayFriend from './pages/Play/PlayFriend' import Play from './pages/Play/Play' import AuthenticationPage, { loginAction, signupAction } from './pages/Authentication/Authentication' -import { getAuthToken, getUserData } from './utils/auth' import ChallengeFriend, { playFriendAction } from './pages/Play/ChallengeFriend' import ChessGame from './pages/Chess/ChessGame' -import ChessGameContextProvider from './context/chess-game-context' import Profile, { action as profileAction } from './pages/Settings/Profile' +import ChessGameContextProvider from './context/chess-game-context' +import { getAuthToken, getUserData } from './utils/auth' const router = createBrowserRouter([{ path: '/', diff --git a/frontend/src/components/Cell.jsx b/frontend/src/components/Cell.jsx index cc6d715..40c5ebd 100644 --- a/frontend/src/components/Cell.jsx +++ b/frontend/src/components/Cell.jsx @@ -1,18 +1,23 @@ import React, { useContext } from 'react' -import Piece from './Piece'; + 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 } = SOCKET_EVENTS + const Cell = ({ cell }) => { let roomID = localStorage.getItem('roomID'); let { square, type } = cell; const { getSquareColor, isSquareMarked, handleSquareClick } = useContext(ChessGameContext) const { isOver, setNodeRef } = useDroppable({ id: square }); let squareColor = getSquareColor(square); + let marked = isSquareMarked(square); let borderColor = isOver ? '#77777777' : 'transparent'; let borderWidth = type ? '3px' : '5px' diff --git a/frontend/src/components/Challenges.jsx b/frontend/src/components/Challenges.jsx index 2d632ad..f7cb638 100644 --- a/frontend/src/components/Challenges.jsx +++ b/frontend/src/components/Challenges.jsx @@ -1,12 +1,12 @@ -import { Button, Group, Stack, Text, Title } from '@mantine/core'; import React, { useEffect, useState } from 'react' + import { useNavigate } from 'react-router-dom'; +import { Button, Group, Stack, Text, Title } from '@mantine/core'; const Challenges = () => { const navigate = useNavigate(); const [challenges, setChallenges] = useState([]); const [error, setError] = useState(null); - console.log(challenges) useEffect(() => { if (error) return; @@ -20,7 +20,7 @@ const Challenges = () => { if (response.ok) { setChallenges(data); } else { - setError('Cannot') + setError('Cannot fetch challenges') } } catch (error) { console.log(error); @@ -33,10 +33,10 @@ const Challenges = () => { if (!challenges || challenges.length === 0) { return ( - <> + Challenges No challenges found - + ) } diff --git a/frontend/src/components/FriendsList.jsx b/frontend/src/components/FriendsList.jsx index 95638d4..fcb5750 100644 --- a/frontend/src/components/FriendsList.jsx +++ b/frontend/src/components/FriendsList.jsx @@ -1,8 +1,10 @@ -import { Avatar, Flex, Loader, NavLink, Text, Title } from '@mantine/core'; -import { Link } from 'react-router-dom'; -import { UserDataContext } from '../context/user-data-context'; import React, { useContext } from 'react'; +import { Link } from 'react-router-dom'; +import { Avatar, Flex, Loader, NavLink, Text, Title } from '@mantine/core'; + +import { UserDataContext } from '../context/user-data-context'; + const FriendsList = () => { const { friends } = useContext(UserDataContext) diff --git a/frontend/src/components/GameHistory.jsx b/frontend/src/components/GameHistory.jsx index aca74dc..3b2ec09 100644 --- a/frontend/src/components/GameHistory.jsx +++ b/frontend/src/components/GameHistory.jsx @@ -1,8 +1,10 @@ import React, { useContext } from 'react' -import { ChessGameContext } from '../context/chess-game-context' + import { Button, Flex, ScrollArea, Tooltip, createStyles } from '@mantine/core'; import { IconChevronLeft, IconChevronRight } from '@tabler/icons-react' +import { ChessGameContext } from '../context/chess-game-context' + const useStyles = createStyles(() => { return { movebtn: { @@ -48,7 +50,7 @@ const GameHistory = () => { ) } - // console.log(currentIndex) + return (
diff --git a/frontend/src/components/Logout.jsx b/frontend/src/components/Logout.jsx index 0589e74..424a85a 100644 --- a/frontend/src/components/Logout.jsx +++ b/frontend/src/components/Logout.jsx @@ -1,6 +1,7 @@ import React, { useState } from 'react' + +import { useNavigate } from 'react-router-dom' import { Button, Flex, Modal, Text, Title } from '@mantine/core' -import { redirect, useNavigate } from 'react-router-dom' import { useDisclosure } from '@mantine/hooks' const Logout = () => { @@ -21,17 +22,16 @@ const Logout = () => { const resData = await response.json(); setIsLoading(false); if (response.ok) { - console.log('Logged out') localStorage.removeItem('user'); - close(); localStorage.removeItem('loggedIn'); + close(); return navigate('/login'); } else { return setErrorMsg(resData.message || "Something went wrong") } } catch (err) { setIsLoading(false) - console.log(err) + console.error(err) setErrorMsg("Something went wrong"); } } diff --git a/frontend/src/components/MainLoader.jsx b/frontend/src/components/MainLoader.jsx index 72c16ee..8964501 100644 --- a/frontend/src/components/MainLoader.jsx +++ b/frontend/src/components/MainLoader.jsx @@ -1,8 +1,10 @@ import React from 'react' + import { createPortal } from 'react-dom' -import loaderImage from '../assets/images/chess_board_loader.png' import { Loader, Title } from '@mantine/core' +import loaderImage from '../assets/images/chess_board_loader.png' + const MainLoader = ({ errorMessage }) => { return ( <> @@ -22,10 +24,6 @@ const MainLoader = ({ errorMessage }) => { } - //
- // - // - //
) } diff --git a/frontend/src/components/NavbarLinks.jsx b/frontend/src/components/NavbarLinks.jsx index 30b33a6..a75b283 100644 --- a/frontend/src/components/NavbarLinks.jsx +++ b/frontend/src/components/NavbarLinks.jsx @@ -1,7 +1,8 @@ +import React, { useState } from 'react' + +import { Link } from 'react-router-dom' import { NavLink, Text, ThemeIcon } from '@mantine/core' import { GearIcon, HomeIcon, PlayIcon } from '@radix-ui/react-icons' -import React, { useState } from 'react' -import { Link } from 'react-router-dom' const NavbarLinks = () => { const [active, setActive] = useState(null); diff --git a/frontend/src/components/Piece.jsx b/frontend/src/components/Piece.jsx index 0d3e5c0..b4f478d 100644 --- a/frontend/src/components/Piece.jsx +++ b/frontend/src/components/Piece.jsx @@ -17,6 +17,7 @@ const Piece = ({ cell }) => { let { square, type, color } = cell; let marked = isSquareMarked(square); let logo = null; + switch (type) { case 'p': logo = color === 'w' ? 'pawn_white' : 'pawn_black'; @@ -46,7 +47,6 @@ const Piece = ({ cell }) => { let borderColor = marked ? '#77777766' : 'transparent' - const style = transform ? { transform: `translate3d(${transform.x}px, ${transform.y}px, 0)`, cursor: isDragging ? 'grabbing' : 'pointer', diff --git a/frontend/src/context/chess-game-context.jsx b/frontend/src/context/chess-game-context.jsx index 6949588..f559927 100644 --- a/frontend/src/context/chess-game-context.jsx +++ b/frontend/src/context/chess-game-context.jsx @@ -1,12 +1,13 @@ import React, { createContext, useReducer, useRef, useState } from 'react' -import { ChessModified, chessInit } from '../utils/chess'; -import { DISPATCH_EVENTS, SOCKET_EVENTS } from '../constants'; + import { socket } from '../socket'; +import { ChessModified, chessInit } from '../utils/chess'; + +import { DISPATCH_EVENTS, SOCKET_EVENTS } from '../constants'; const { CAPTURE_PIECE, MOVE_PIECE, SELECT_PIECE, JUMP_TO, SET_GAME_HISTORY, END_GAME } = DISPATCH_EVENTS const { GAME_END, CHESS_MOVE } = SOCKET_EVENTS; -export const ChessGameContext = createContext(); -// myColor: null, chess: null, chessBoard: null, moveHints: null, selected: null, dispatch: null, handleOpponentMove: null, handleSquareClick: null, getSquareColor: null, isSquareMarked: null, selectPiece: null, handleDrop: null +export const ChessGameContext = createContext(); const reducer = (state, action) => { // console.log('Before', state); diff --git a/frontend/src/layout/MainLayout.jsx b/frontend/src/layout/MainLayout.jsx index 0604802..9a0a379 100644 --- a/frontend/src/layout/MainLayout.jsx +++ b/frontend/src/layout/MainLayout.jsx @@ -1,10 +1,12 @@ -import { AppShell, Burger, Container, Header, MediaQuery, Navbar, Paper, Text, createStyles, useMantineTheme } from '@mantine/core' import React, { useContext, useState } from 'react' -import NavbarLinks from '../components/NavbarLinks'; + import { Outlet } from 'react-router-dom' -import Logout from '../components/Logout'; +import { AppShell, Burger, Container, Header, MediaQuery, Navbar, Paper, Text, createStyles, useMantineTheme } from '@mantine/core' + import UserDataContextProvider, { UserDataContext } from '../context/user-data-context'; import MainLoader from '../components/MainLoader'; +import NavbarLinks from '../components/NavbarLinks'; +import Logout from '../components/Logout'; const useStyles = createStyles((theme) => ({ body: { @@ -27,7 +29,7 @@ const MainLayout = () => { const { classes } = useStyles(); const theme = useMantineTheme(); const [opened, setOpened] = useState(false); - const { isLoggedIn,errorMessage } = useContext(UserDataContext); + const { isLoggedIn, errorMessage } = useContext(UserDataContext); if (!isLoggedIn) { return diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx index fff52ec..ff9371e 100644 --- a/frontend/src/main.jsx +++ b/frontend/src/main.jsx @@ -1,10 +1,12 @@ import React from 'react' import ReactDOM from 'react-dom/client' + import App from './App.jsx' -import './index.css' import { MantineProvider } from '@mantine/styles' import UserDataContextProvider from './context/user-data-context.jsx' +import './index.css' + ReactDOM.createRoot(document.getElementById('root')).render( diff --git a/frontend/src/pages/Authentication/Authentication.jsx b/frontend/src/pages/Authentication/Authentication.jsx index 8330431..1b282a9 100644 --- a/frontend/src/pages/Authentication/Authentication.jsx +++ b/frontend/src/pages/Authentication/Authentication.jsx @@ -1,8 +1,10 @@ import React, { useContext, useState } from 'react'; + +import { redirect, useNavigate } from 'react-router-dom'; import { Button, Card, Container, Text, TextInput, Title } from '@mantine/core'; -import { Form, redirect, useNavigate } from 'react-router-dom'; -import { ZodError, z } from 'zod'; import { useForm } from 'react-hook-form' +import { ZodError, z } from 'zod'; + import { UserDataContext } from '../../context/user-data-context'; let host = import.meta.env.VITE_BACKEND_HOST; @@ -122,8 +124,6 @@ const SignupForm = () => { return navigate('/'); } else { setIsLoading(false); - console.log(resData); - console.log(resData.description); setErrorMsg(resData.message); resData?.error?.username && setError('username', { message: resData.error.username }); resData?.error?.email && setError('email', { message: resData.error.email }); @@ -157,67 +157,4 @@ const SignupForm = () => { ); }; -export const loginAction = async ({ request }) => { - try { - const data = await request.formData(); - let url = `${import.meta.env.VITE_BACKEND_HOST}/api/auth/login`; - - const authData = { - username: data.get('username'), - password: data.get('password') - } - - - - const response = await fetch(url, { - method: 'POST', - body: JSON.stringify(authData), - headers: { - 'Content-Type': 'application/json' - } - }) - - if (response.status >= 400) return response; - else { - const responseBody = await response.json(); - localStorage.setItem('token', responseBody.token); - localStorage.setItem('user', JSON.stringify(responseBody.user)) - return redirect('/home'); - } - } catch (err) { - if (err instanceof ZodError) { - - } else { - console.er - } - } -} - -export const signupAction = async ({ request }) => { - const data = await request.formData(); - let url = `${import.meta.env.VITE_BACKEND_HOST}/api/auth/signup`; - - const authData = { - username: data.get('username'), - email: data.get('email'), - password: data.get('password') - } - - const response = await fetch(url, { - method: 'POST', - body: JSON.stringify(authData), - headers: { - 'Content-Type': 'application/json' - } - }) - - if (response.status >= 400) return response; - else { - const responseBody = await response.json(); - localStorage.setItem('token', responseBody.token); - localStorage.setItem('user', JSON.stringify(responseBody.user)) - return redirect('/home'); - } -} - export default AuthenticationPage; diff --git a/frontend/src/pages/Chess/ChessBoard.jsx b/frontend/src/pages/Chess/ChessBoard.jsx index b41f8e8..326367a 100644 --- a/frontend/src/pages/Chess/ChessBoard.jsx +++ b/frontend/src/pages/Chess/ChessBoard.jsx @@ -1,11 +1,14 @@ -import React, { useContext, useEffect, useReducer, useRef } from 'react'; -import Cell from '../../components/Cell'; -import { socket } from '../../socket'; +import React, { useContext, useEffect } from 'react'; + import { Flex, createStyles } from '@mantine/core'; import { DndContext } from '@dnd-kit/core' + +import Cell from '../../components/Cell'; import { ChessGameContext } from '../../context/chess-game-context'; +import { socket } from '../../socket'; import { SOCKET_EVENTS } from '../../constants'; const { CHESS_OPPONENT_MOVE, CHESS_MOVE } = SOCKET_EVENTS + const useStyles = createStyles((theme) => ({ chessboard: { [theme.fn.largerThan('md')]: { @@ -35,15 +38,9 @@ const useStyles = createStyles((theme) => ({ const ChessBoard = () => { const { classes } = useStyles(); const { getChessBoard, handleOpponentMove, handleDrop, hasGameEnded, gameEndedReason } = useContext(ChessGameContext) - let roomID = localStorage.getItem('roomID'); + const roomID = localStorage.getItem('roomID'); const chessBoard = getChessBoard(); - let myColor = localStorage.getItem('myColor') - - // if (hasGameEnded) { - // console.log('Game ended due to', gameEndedReason) - // } else { - // console.log('Game not ended yet') - // } + const myColor = localStorage.getItem('myColor') useEffect(() => { socket.on(CHESS_OPPONENT_MOVE, handleOpponentMove) diff --git a/frontend/src/pages/Chess/ChessGame.jsx b/frontend/src/pages/Chess/ChessGame.jsx index 53f495c..0afaf29 100644 --- a/frontend/src/pages/Chess/ChessGame.jsx +++ b/frontend/src/pages/Chess/ChessGame.jsx @@ -1,13 +1,15 @@ -import { Avatar, Button, Flex, Group, Image, Loader, MediaQuery, Modal, NavLink, Text, Title } from '@mantine/core' import React, { useContext, useEffect, useState } from 'react' -import ChessBoard from '../Chess/ChessBoard' + import { useNavigate } from 'react-router-dom' +import { useDisclosure } from '@mantine/hooks' +import { Avatar, Button, Flex, Image, MediaQuery, Modal, NavLink, Text, Title } from '@mantine/core' + import { socket } from '../../socket' import { getUserData } from '../../utils/auth' import { ChessGameContext } from '../../context/chess-game-context' +import ChessBoard from '../Chess/ChessBoard' import GameHistory from '../../components/GameHistory' import MainLoader from '../../components/MainLoader' -import { useDisclosure } from '@mantine/hooks' import { SOCKET_EVENTS } from '../../constants' const { CONNECT, DISCONNECT, CHESS_OPPONENT_MOVE, USER_RESIGNED, JOIN_ROOM, JOIN_ROOM_ERROR, JOIN_ROOM_SUCCESS, ROOM_FULL, USER_JOINED_ROOM } = SOCKET_EVENTS; @@ -91,7 +93,7 @@ const ChessGame = () => { ) return ( - <> + Game ended due to {gameEndedReason} @@ -156,7 +158,7 @@ const ChessGame = () => { - + ) } diff --git a/frontend/src/pages/Chess/Timer.jsx b/frontend/src/pages/Chess/Timer.jsx index 64a0fcf..97781fa 100644 --- a/frontend/src/pages/Chess/Timer.jsx +++ b/frontend/src/pages/Chess/Timer.jsx @@ -1,7 +1,8 @@ -import React, { useContext } from 'react' -import useCountDown from '../../hooks/useCountDown' +import React from 'react' + import { Box } from '@mantine/core'; -import { ChessGameContext } from '../../context/chess-game-context'; + +import useCountDown from '../../hooks/useCountDown' const Timer = ({ on }) => { // const { isTimerOn } = useContext(ChessGameContext) diff --git a/frontend/src/pages/Home.jsx b/frontend/src/pages/Home.jsx index ba25c87..985d7ad 100644 --- a/frontend/src/pages/Home.jsx +++ b/frontend/src/pages/Home.jsx @@ -1,6 +1,7 @@ -import { Text } from '@mantine/core' import React from 'react' +import { Text } from '@mantine/core' + const Home = () => { return ( Home diff --git a/frontend/src/pages/Play/ChallengeFriend.jsx b/frontend/src/pages/Play/ChallengeFriend.jsx index c8854a8..2bc64a1 100644 --- a/frontend/src/pages/Play/ChallengeFriend.jsx +++ b/frontend/src/pages/Play/ChallengeFriend.jsx @@ -1,6 +1,8 @@ -import { Avatar, Button, Card, Flex, Select, Text, Title } from '@mantine/core' import React from 'react' + import { Form, redirect, useParams } from 'react-router-dom' +import { Avatar, Button, Card, Flex, Select, Text, Title } from '@mantine/core' + import { getUserData } from '../../utils/auth' const ChallengeFriend = () => { diff --git a/frontend/src/pages/Play/Layout.jsx b/frontend/src/pages/Play/Layout.jsx index 3dd88dc..66d9d63 100644 --- a/frontend/src/pages/Play/Layout.jsx +++ b/frontend/src/pages/Play/Layout.jsx @@ -1,6 +1,8 @@ -import { Avatar, Flex, Image, MediaQuery, NavLink } from '@mantine/core' import React from 'react' + import { Outlet } from 'react-router-dom' +import { Avatar, Flex, Image, MediaQuery, NavLink } from '@mantine/core' + import { getUserData } from '../../utils/auth'; const Layout = () => { diff --git a/frontend/src/pages/Play/Play.jsx b/frontend/src/pages/Play/Play.jsx index 0c906fc..f67114b 100644 --- a/frontend/src/pages/Play/Play.jsx +++ b/frontend/src/pages/Play/Play.jsx @@ -1,6 +1,7 @@ -import { Card, Flex, Image, NavLink, Title } from '@mantine/core' import React from 'react' + import { Link } from 'react-router-dom' +import { Card, Flex, Image, NavLink, Title } from '@mantine/core' const Play = () => { return ( @@ -8,7 +9,7 @@ const Play = () => { width: '100%', height: '600px', textAlign: 'center', - backgroundColor:'#262523' + backgroundColor: '#262523' }}> Play Chess diff --git a/frontend/src/pages/Play/PlayFriend.jsx b/frontend/src/pages/Play/PlayFriend.jsx index 744732c..f51b7b9 100644 --- a/frontend/src/pages/Play/PlayFriend.jsx +++ b/frontend/src/pages/Play/PlayFriend.jsx @@ -1,7 +1,9 @@ import React from 'react' -import { Button, Card, Flex, Image, Modal, NativeSelect, Text, TextInput, Title } from '@mantine/core' + import { useDisclosure } from '@mantine/hooks' import { IconSearch } from '@tabler/icons-react' +import { Button, Card, Flex, Image, Modal, NativeSelect, Text, TextInput, Title } from '@mantine/core' + import FriendsList from '../../components/FriendsList' import Challenges from '../../components/Challenges' diff --git a/frontend/src/pages/Settings/Friends.jsx b/frontend/src/pages/Settings/Friends.jsx index fb84bbd..71bc2c7 100644 --- a/frontend/src/pages/Settings/Friends.jsx +++ b/frontend/src/pages/Settings/Friends.jsx @@ -1,7 +1,9 @@ import React from 'react' + +import { useForm } from '@mantine/form' import { Button, Card, Flex, TextInput, Title } from '@mantine/core' import { IconSearch } from '@tabler/icons-react' -import { useForm } from '@mantine/form' + import FriendsList from '../../components/FriendsList' const Friends = () => { diff --git a/frontend/src/pages/Settings/Profile.jsx b/frontend/src/pages/Settings/Profile.jsx index 581f41c..d41224c 100644 --- a/frontend/src/pages/Settings/Profile.jsx +++ b/frontend/src/pages/Settings/Profile.jsx @@ -1,9 +1,11 @@ import React, { useContext } from 'react' -import { Avatar, Button, Flex, Grid, Group, Stack, Text, TextInput, Title } from '@mantine/core' -import { getUserData } from '../../utils/auth' -import { UserDataContext } from '../../context/user-data-context' + import { useForm } from '@mantine/form' import { Form } from 'react-router-dom' +import { Avatar, Button, Flex, Grid, Group, Stack, Text, TextInput, Title } from '@mantine/core' + +import { getUserData } from '../../utils/auth' +import { UserDataContext } from '../../context/user-data-context' import MainLoader from '../../components/MainLoader' const Profile = () => { diff --git a/frontend/src/pages/Settings/Settings.jsx b/frontend/src/pages/Settings/Settings.jsx index af571a0..23aabaf 100644 --- a/frontend/src/pages/Settings/Settings.jsx +++ b/frontend/src/pages/Settings/Settings.jsx @@ -1,7 +1,8 @@ +import React from 'react' + +import { Link, Outlet } from 'react-router-dom'; import { Box, Flex, NavLink, Title } from '@mantine/core' import { ColorWheelIcon, GearIcon, GlobeIcon, LockOpen1Icon, PersonIcon } from '@radix-ui/react-icons' -import React from 'react' -import { Link, Outlet } from 'react-router-dom'; const Settings = () => { return (