This repository has been archived on 2024-10-29. You can view files and clone it, but cannot push or open issues or pull requests.
FunctionProject/website/pages/functions/rightPrice.jsx

198 lines
6.4 KiB
React
Raw Permalink Normal View History

2020-08-03 12:04:07 +02:00
import { useState } from 'react'
import redirect from '../../utils/redirect'
import FunctionPage from '../../components/FunctionPage/FunctionPage'
import FunctionTabs from '../../components/FunctionPage/FunctionTabs'
import FunctionArticle from '../../components/FunctionPage/FunctionArticle'
import FunctionComments from '../../components/FunctionPage/FunctionComments/FunctionComments'
import Loader from '../../components/Loader'
import api from '../../utils/api'
2020-04-28 18:46:13 +02:00
const PlayRightPrice = () => {
2020-08-03 12:04:07 +02:00
const [isPlaying, setIsPlaying] = useState(false)
const [productToGuess, setProductToGuess] = useState({})
const [isLoadingProduct, setIsLoadingProduct] = useState(false)
const [enteredPrice, setEnteredPrice] = useState('')
const [attemptsArray, setAttemptsArray] = useState([])
2020-04-28 18:46:13 +02:00
2020-08-03 12:04:07 +02:00
const handlePlaying = () => {
setIsPlaying(true)
setAttemptsArray([])
fetchRandomAmazonProduct()
}
2020-04-28 18:46:13 +02:00
2020-08-03 12:04:07 +02:00
const fetchRandomAmazonProduct = async () => {
setIsLoadingProduct(true)
const { data } = await api.post('/functions/rightPrice')
setProductToGuess(data)
setIsLoadingProduct(false)
}
2020-04-28 18:46:13 +02:00
const handleChange = event => {
2020-08-03 12:04:07 +02:00
setEnteredPrice(event.target.value)
}
2020-04-28 18:46:13 +02:00
const handleSubmit = async event => {
2020-08-03 12:04:07 +02:00
event.preventDefault()
const objectTry = {}
const guessedPrice = Number(enteredPrice.replace(',', '.').replace(' ', ''))
2020-08-03 12:04:07 +02:00
if (!isNaN(guessedPrice)) {
objectTry.guessedPrice = guessedPrice
objectTry.numberTry = attemptsArray.length + 1
if (guessedPrice > productToGuess.price) {
objectTry.message = "C'est moins !"
} else if (guessedPrice < productToGuess.price) {
objectTry.message = "C'est plus !"
} else {
objectTry.message = 'Bravo, vous avez trouvé le juste prix !'
}
setAttemptsArray([objectTry, ...attemptsArray])
2020-04-28 18:46:13 +02:00
}
2020-08-03 12:04:07 +02:00
setEnteredPrice('')
}
2020-04-28 18:46:13 +02:00
2020-08-03 12:04:07 +02:00
return (
<div className='container-fluid'>
{!isPlaying
? (
<div className='row justify-content-center'>
<div className='form-group text-center'>
<button
onClick={handlePlaying}
type='submit'
className='btn btn-dark'
>
Jouer
</button>
2020-08-03 12:04:07 +02:00
</div>
</div>
)
: isLoadingProduct
? (
<div className='row justify-content-center'>
<Loader />
</div>
)
: (
<>
<div className='row justify-content-center'>
<div
style={{ marginBottom: '20px' }}
className='col-24 text-center'
>
<h4>{productToGuess.name}</h4>
<img
src={productToGuess.image}
alt={productToGuess.name}
className='Product__image'
/>
2020-08-03 12:04:07 +02:00
</div>
</div>
<div className='row justify-content-center'>
<div style={{ marginBottom: '25px' }} className='col-24'>
{attemptsArray.length > 0 &&
attemptsArray[0].message ===
'Bravo, vous avez trouvé le juste prix !'
? (
<div className='form-group text-center'>
<button
onClick={handlePlaying}
type='submit'
className='btn btn-dark'
>
Rejouer ?
</button>
</div>
)
: (
<form onSubmit={handleSubmit}>
<div className='text-center'>
<input
value={enteredPrice}
onChange={handleChange}
name='enteredPrice'
id='enteredPrice'
type='number'
step='0.01'
className='form-control'
autoComplete='off'
placeholder='Devinez le prix (prix à virgule possible!)'
/>
</div>
<div className='form-group text-center'>
<button type='submit' className='btn btn-dark'>
Deviner
</button>
</div>
</form>
)}
</div>
</div>
<div
style={{ marginBottom: '30px' }}
className='row justify-content-center'
>
{attemptsArray.map((attempt, index) => {
const { message } = attempt
let priceResultClass
if (message === "C'est moins !") {
priceResultClass = 'Price__result-moins'
} else if (message === "C'est plus !") {
priceResultClass = 'Price__result-plus'
} else {
priceResultClass = 'Price__result-success'
}
return (
<div
key={index}
className={`col-24 Price__result ${priceResultClass}`}
>
# {attempt.numberTry} ({attempt.guessedPrice}) {message}
</div>
)
})}
</div>
</>
)}
2020-08-03 12:04:07 +02:00
</div>
)
2020-04-28 18:46:13 +02:00
}
const FunctionTabManager = props => {
2020-08-03 12:04:07 +02:00
return (
<FunctionTabs
setSlideIndex={props.setSlideIndex}
slideIndex={props.slideIndex}
>
2020-08-03 12:04:07 +02:00
<div style={{ marginTop: '10px' }}>
<PlayRightPrice />
</div>
<div className='FunctionComponent__slide'>
<FunctionArticle article={props.article} />
</div>
<div className='FunctionComponent__slide'>
<FunctionComments functionId={props.id} />
</div>
</FunctionTabs>
)
2020-04-28 18:46:13 +02:00
}
const rightPrice = props => (
2020-08-03 12:04:07 +02:00
<FunctionPage
FunctionTabManager={FunctionTabManager}
{...props}
tabNames={['🕹️ Jouer', '📝 Article', '📬 Commentaires']}
/>
)
2020-04-28 18:46:13 +02:00
2020-08-03 12:04:07 +02:00
export async function getServerSideProps (context) {
return api
.get('/functions/rightPrice')
.then(response => ({ props: response.data }))
2020-08-03 12:04:07 +02:00
.catch(() => redirect(context, '/404'))
2020-04-28 18:46:13 +02:00
}
2020-08-03 12:04:07 +02:00
export default rightPrice