2022-02-19 22:15:03 +04:00
|
|
|
|
import {useState} from 'react'
|
|
|
|
|
|
import PropTypes from 'prop-types'
|
|
|
|
|
|
import {
|
|
|
|
|
|
PaymentElement,
|
|
|
|
|
|
useStripe,
|
|
|
|
|
|
useElements
|
|
|
|
|
|
} from '@stripe/react-stripe-js'
|
|
|
|
|
|
import {Button, Container, LinearProgress, Paper} from '@mui/material'
|
|
|
|
|
|
|
|
|
|
|
|
const SITE_URL = process.env.NEXT_PUBLIC_SITE_URL || 'http://localhost:3001'
|
|
|
|
|
|
|
2022-06-21 19:45:39 +04:00
|
|
|
|
export default function CheckoutForm({prices, validMontant, setError, isLoading, setIsLoading}) {
|
2022-02-19 22:15:03 +04:00
|
|
|
|
const stripe = useStripe()
|
|
|
|
|
|
const elements = useElements()
|
|
|
|
|
|
const [isPaymentLoading, setIsPaymentLoading] = useState(false)
|
2022-03-14 18:59:11 +04:00
|
|
|
|
const amount = prices.find(({id}) => id === validMontant).unit_amount
|
2022-02-19 22:15:03 +04:00
|
|
|
|
|
|
|
|
|
|
const handleSubmit = async event => {
|
|
|
|
|
|
event.preventDefault()
|
|
|
|
|
|
|
|
|
|
|
|
if (!stripe || !elements) {
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
setIsPaymentLoading(true)
|
|
|
|
|
|
|
|
|
|
|
|
const {error} = await stripe.confirmPayment({
|
|
|
|
|
|
elements,
|
|
|
|
|
|
confirmParams: {
|
|
|
|
|
|
return_url: `${SITE_URL}/soutyen`
|
|
|
|
|
|
},
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if (error.type === 'card_error' || error.type === 'validation_error') {
|
|
|
|
|
|
setError(error.message)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
setError('Une erreur s’est produite.')
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
setIsPaymentLoading(false)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const handleReady = () => {
|
|
|
|
|
|
setIsLoading(false)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
|
<Container maxWidth='sm' sx={{marginBottom: 1}}>
|
|
|
|
|
|
<Paper sx={{padding: 2, marginTop: 3}}>
|
|
|
|
|
|
<PaymentElement id='payment-element' onReady={handleReady} />
|
|
|
|
|
|
{!isLoading && (
|
|
|
|
|
|
<Button fullWidth sx={{marginTop: 2}} variant='outlined' disabled={isPaymentLoading || !stripe || !elements} id='submit' onClick={handleSubmit}>
|
2022-03-14 18:59:11 +04:00
|
|
|
|
Valider le paiement de <strong>{amount / 100} euros</strong>
|
2022-02-19 22:15:03 +04:00
|
|
|
|
</Button>
|
|
|
|
|
|
)}
|
|
|
|
|
|
{isPaymentLoading && (
|
2022-03-06 10:08:32 +04:00
|
|
|
|
<LinearProgress size={24} style={{width: '100%', marginTop: 10}} />
|
2022-02-19 22:15:03 +04:00
|
|
|
|
)}
|
|
|
|
|
|
</Paper>
|
|
|
|
|
|
</Container>
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CheckoutForm.propTypes = {
|
2022-03-14 18:59:11 +04:00
|
|
|
|
validMontant: PropTypes.string.isRequired,
|
|
|
|
|
|
prices: PropTypes.array.isRequired,
|
2022-02-19 22:15:03 +04:00
|
|
|
|
setError: PropTypes.func.isRequired,
|
|
|
|
|
|
isLoading: PropTypes.bool.isRequired,
|
|
|
|
|
|
setIsLoading: PropTypes.func.isRequired
|
|
|
|
|
|
}
|