200 lines
6.6 KiB
JavaScript
200 lines
6.6 KiB
JavaScript
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'
|
|
import '../../public/css/pages/FunctionComponent.css'
|
|
import '../../public/css/pages/functions/rightPrice.css'
|
|
|
|
const PlayRightPrice = () => {
|
|
const [isPlaying, setIsPlaying] = useState(false)
|
|
const [productToGuess, setProductToGuess] = useState({})
|
|
const [isLoadingProduct, setIsLoadingProduct] = useState(false)
|
|
const [enteredPrice, setEnteredPrice] = useState('')
|
|
const [attemptsArray, setAttemptsArray] = useState([])
|
|
|
|
const handlePlaying = () => {
|
|
setIsPlaying(true)
|
|
setAttemptsArray([])
|
|
fetchRandomAmazonProduct()
|
|
}
|
|
|
|
const fetchRandomAmazonProduct = async () => {
|
|
setIsLoadingProduct(true)
|
|
const { data } = await api.post('/functions/rightPrice')
|
|
setProductToGuess(data)
|
|
setIsLoadingProduct(false)
|
|
}
|
|
|
|
const handleChange = event => {
|
|
setEnteredPrice(event.target.value)
|
|
}
|
|
|
|
const handleSubmit = async event => {
|
|
event.preventDefault()
|
|
const objectTry = {}
|
|
const guessedPrice = Number(enteredPrice.replace(',', '.').replace(' ', ''))
|
|
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])
|
|
}
|
|
setEnteredPrice('')
|
|
}
|
|
|
|
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>
|
|
</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'
|
|
/>
|
|
</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>
|
|
</>
|
|
)}
|
|
</div>
|
|
)
|
|
}
|
|
|
|
const FunctionTabManager = props => {
|
|
return (
|
|
<FunctionTabs
|
|
setSlideIndex={props.setSlideIndex}
|
|
slideIndex={props.slideIndex}
|
|
>
|
|
<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>
|
|
)
|
|
}
|
|
|
|
const rightPrice = props => (
|
|
<FunctionPage
|
|
FunctionTabManager={FunctionTabManager}
|
|
{...props}
|
|
tabNames={['🕹️ Jouer', '📝 Article', '📬 Commentaires']}
|
|
/>
|
|
)
|
|
|
|
export async function getServerSideProps (context) {
|
|
return api
|
|
.get('/functions/rightPrice')
|
|
.then(response => ({ props: response.data }))
|
|
.catch(() => redirect(context, '/404'))
|
|
}
|
|
|
|
export default rightPrice
|