| import React from 'react' |
|
|
| import { Form, redirect, useActionData, useParams } from 'react-router-dom' |
| import { Avatar, Button, Card, Flex, Select, Text, Title } from '@mantine/core' |
|
|
| import { getUserData } from '../../utils/auth' |
|
|
| const ChallengeFriend = () => { |
| const params = useParams(); |
| let friend_username = params["friend_username"]; |
| const res = useActionData(); |
| console.log(res); |
|
|
| return ( |
| <Card |
| sx={{ |
| width: '600px', |
| height: '80%', |
| textAlign: 'center', |
| backgroundColor: '#262523' |
| }} |
| px='20px' |
| > |
| <Form action={`/play/friend/${friend_username}`} method='POST'> |
| <Flex align="center" direction="column" justify="center" gap="xs" my="lg"> |
| <Title order={2}>Play vs {friend_username}</Title> |
| <Avatar mt="lg" color='lime' size="100px">{friend_username[0].toUpperCase()}</Avatar> |
| <Text>{friend_username}</Text> |
| </Flex> |
| <Select label="Time limit" placeholder='Time limit' name='timeLimit' defaultValue='10' data={['5', '10', '15', '30']} /> |
| <Select defaultValue='w' my="20px" color='lime' name='color' label={<Text mx="auto" order={3}>I play as</Text>} placeholder='choose your color' data={[ |
| { value: 'w', label: 'White' }, |
| { value: 'b', label: 'Black' }, |
| { value: 'RANDOM', label: 'Random' } |
| ]} /> |
| <Button color='lime' type='submit' >Challenge</Button> |
| <Text style={{ color: 'red' }}> |
| {res?.message} |
| </Text> |
| </Form> |
| </Card> |
| ) |
| } |
|
|
|
|
| |
| export const playFriendAction = async ({ request, params }) => { |
| const formData = await request.formData(); |
| let color = formData.get('color'); |
| let timeLimit = formData.get('timeLimit'); |
| let username = getUserData().username; |
| let challenged = params.friend_username; |
|
|
| let roomIDURL = `${import.meta.env.VITE_BACKEND_HOST}/api/room`; |
| let reqBody = { challenger: username, challenged, timeLimit, color } |
|
|
| try { |
| const response = await fetch(roomIDURL, { |
| method: 'POST', body: JSON.stringify(reqBody), headers: { |
| 'Content-Type': 'application/json' |
| }, |
| credentials: 'include' |
| }); |
|
|
| console.log(response.status); |
| if (response.ok) { |
|
|
| const resJSON = await response.json(); |
| const { roomID } = resJSON; |
| console.log('Room ID:', roomID); |
|
|
| |
| localStorage.setItem('roomID', roomID); |
| localStorage.setItem('myColor', color); |
| localStorage.setItem('timeLimit', timeLimit); |
| localStorage.setItem('opponent', challenged); |
|
|
| return redirect(`/game/friend/${roomID}`); |
| } else { |
| return response; |
| } |
| } catch (err) { |
| console.log(err) |
| return err; |
| } |
| } |
|
|
| export default ChallengeFriend; |