| 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); |
|
|
| useEffect(() => { |
| if (error) return; |
| const fetchData = async () => { |
| let url = `${import.meta.env.VITE_BACKEND_HOST}/api/user/challenges`; |
| try { |
| const response = await fetch(url, { |
| credentials: 'include' |
| }); |
| const data = await response.json(); |
| if (response.ok) { |
| setChallenges(data); |
| } else { |
| setError('Cannot fetch challenges') |
| } |
| } catch (error) { |
| console.log(error); |
| setError("Something went wrong") |
| } |
| } |
|
|
| fetchData(); |
| }, [error]) |
|
|
| if (!challenges || challenges.length === 0) { |
| return ( |
| <React.Fragment> |
| <Title mt="20px" mb="10px" order={3}>Challenges</Title> |
| <Text>No challenges found</Text> |
| </React.Fragment> |
| ) |
| } |
|
|
| if (error) { |
| return ( |
| <> |
| <Title mt="20px" mb="10px" order={3}>Challenges</Title> |
| <Text>{error}</Text><Text onClick={() => setError(null)} fw={800} sx={{ cursor: 'pointer' }}>Retry</Text> |
| </> |
| ) |
| } |
|
|
|
|
|
|
| return ( |
| <div> |
| <Title mt="20px" mb="10px" order={3}>Challenges</Title> |
| <Stack> |
| { |
| challenges.map(({ id, challenger, roomID, color, timeLimit }, index) => { |
| console.log(challenger, roomID, color, timeLimit); |
| return ( |
| <Group position='apart' key={id}> |
| <Text>Challenge by {challenger}</Text> |
| <Group position='center'> |
| <Button color='lime' onClick={async () => { |
| try { |
| let url = `${import.meta.env.VITE_BACKEND_HOST}/api/user/challenges/${id}` |
| const response = await fetch(url, { method: 'DELETE', credentials: 'include' }); |
| console.log(id, challenger); |
| const resData = await response.json(); |
| if (response.ok) { |
| localStorage.setItem('myColor', color === 'b' ? 'w' : 'b'); |
| localStorage.setItem('roomID', roomID); |
| localStorage.setItem('opponent', challenger); |
| localStorage.setItem('timeLimit', timeLimit); |
| navigate(`/game/friend/${roomID}`); |
| } else { |
| console.log(resData) |
| } |
| } catch (err) { |
| setError("Something went wrong"); |
| console.log(err); |
| } |
| }}>Accept</Button> |
| <Button color='gray' onClick={async () => { |
| try { |
| let url = `${import.meta.env.VITE_BACKEND_HOST}/api/user/challenges/${id}` |
| const response = await fetch(url, { method: 'DELETE', credentials: 'include' }); |
| console.log(id, challenger); |
| if (response.ok) { |
| challenges.splice(index, 1); |
| setChallenges(challenges); |
| } else { |
| const resData = await response.json(); |
| console.log(resData) |
| } |
| } catch (err) { |
| setError("Something went wrong"); |
| console.log(err); |
| } |
| }}>Decline</Button> |
| </Group> |
| </Group> |
| ) |
| }) |
| } |
| </Stack> |
| </div> |
| ) |
| } |
|
|
|
|
|
|
| export default Challenges |