159 lines
5.8 KiB
JavaScript
159 lines
5.8 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
|