You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

150 lines
5.6 KiB

2 years ago
const publicKey = document.getElementById("mercado-pago-public-key").value;
const mercadopago = new MercadoPago(publicKey);
function loadCardForm() {
const productCost = document.getElementById('amount').value;
const productDescription = document.getElementById('product-description').innerText;
const cardForm = mercadopago.cardForm({
amount: productCost,
autoMount: true,
form: {
id: "form-checkout",
cardholderName: {
id: "form-checkout__cardholderName",
placeholder: "Holder name",
},
cardholderEmail: {
id: "form-checkout__cardholderEmail",
placeholder: "E-mail",
},
cardNumber: {
id: "form-checkout__cardNumber",
placeholder: "Card number",
},
cardExpirationMonth: {
id: "form-checkout__cardExpirationMonth",
placeholder: "MM",
},
cardExpirationYear: {
id: "form-checkout__cardExpirationYear",
placeholder: "YY",
},
securityCode: {
id: "form-checkout__securityCode",
placeholder: "Security code",
},
installments: {
id: "form-checkout__installments",
placeholder: "Installments",
},
identificationType: {
id: "form-checkout__identificationType",
},
identificationNumber: {
id: "form-checkout__identificationNumber",
placeholder: "Identification number",
},
issuer: {
id: "form-checkout__issuer",
placeholder: "Issuer",
},
},
callbacks: {
onFormMounted: error => {
if (error)
return console.warn("Form Mounted handling error: ", error);
console.log("Form mounted");
},
onSubmit: event => {
event.preventDefault();
document.getElementById("loading-message").style.display = "block";
const {
paymentMethodId,
issuerId,
cardholderEmail: email,
amount,
token,
installments,
identificationNumber,
identificationType,
} = cardForm.getCardFormData();
fetch("/process_payment", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
token,
issuerId,
paymentMethodId,
transactionAmount: Number(amount),
installments: Number(installments),
description: productDescription,
payer: {
email,
identification: {
type: identificationType,
number: identificationNumber,
},
},
}),
})
.then(response => {
return response.json();
})
.then(result => {
document.getElementById("payment-id").innerText = result.id;
document.getElementById("payment-status").innerText = result.status;
document.getElementById("payment-detail").innerText = result.detail;
$('.container__payment').fadeOut(500);
setTimeout(() => { $('.container__result').show(500).fadeIn(); }, 500);
})
.catch(error => {
alert("Unexpected error\n"+JSON.stringify(error));
});
},
onFetching: (resource) => {
console.log("Fetching resource: ", resource);
const payButton = document.getElementById("form-checkout__submit");
payButton.setAttribute('disabled', true);
return () => {
payButton.removeAttribute("disabled");
};
},
},
});
};
// Handle transitions
document.getElementById('checkout-btn').addEventListener('click', function(){
$('.container__cart').fadeOut(500);
setTimeout(() => {
loadCardForm();
$('.container__payment').show(500).fadeIn();
}, 500);
});
document.getElementById('go-back').addEventListener('click', function(){
$('.container__payment').fadeOut(500);
setTimeout(() => { $('.container__cart').show(500).fadeIn(); }, 500);
});
// Handle price update
function updatePrice(){
let quantity = document.getElementById('quantity').value;
let unitPrice = document.getElementById('unit-price').innerText;
let amount = parseInt(unitPrice) * parseInt(quantity);
document.getElementById('cart-total').innerText = '$ ' + amount;
document.getElementById('summary-price').innerText = '$ ' + unitPrice;
document.getElementById('summary-quantity').innerText = quantity;
document.getElementById('summary-total').innerText = '$ ' + amount;
document.getElementById('amount').value = amount;
};
document.getElementById('quantity').addEventListener('change', updatePrice);
updatePrice();