FunctionProject/website/pages/functions/rightPrice.js
2020-08-03 12:04:07 +02:00

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