|
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 |