Benjamin Beganović 0de492d96f
Stripe: New payment flow (#67)
* stripe: ach

* stripe: klarna

* stripe: bank transfer

* assets build

* stripe: bacs

* stripe: bancontact

* stripe: becs

* stripe: eps

* stripe: fpx

* stripe: giropay

* stripe: ideal

* stripe: przelewy24

* stripe: sepa

* stripe: sofort

* assets build

* assets build

* pass context payload into livewirePaymentView

* update checkout.com

* update livewire method interface

* stripe: acss

* align methods with interface (array $data)
2024-07-16 18:43:55 +10:00

169 lines
6.6 KiB
JavaScript
Vendored

/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2024. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
import { wait } from '../wait';
wait('#stripe-ach-payment').then(() => ach());
function ach() {
let payNow = document.getElementById('pay-now');
if (payNow) {
Array.from(
document.getElementsByClassName('toggle-payment-with-token')
).forEach((element) =>
element.addEventListener('click', (element) => {
document.querySelector('input[name=source]').value =
element.target.dataset.token;
})
);
payNow.addEventListener('click', function () {
let payNowButton = document.getElementById('pay-now');
payNowButton.disabled = true;
payNowButton.querySelector('svg').classList.remove('hidden');
payNowButton.querySelector('span').classList.add('hidden');
document.getElementById('server-response').submit();
});
}
document.getElementById('new-bank').addEventListener('click', (ev) => {
if (!document.getElementById('accept-terms').checked) {
errors.textContent =
'You must accept the mandate terms prior to making payment.';
errors.hidden = false;
return;
}
errors.hidden = true;
let stripe;
let publishableKey = document.querySelector(
'meta[name="stripe-publishable-key"]'
).content;
let stripeConnect = document.querySelector(
'meta[name="stripe-account-id"]'
)?.content;
if (stripeConnect) {
stripe = Stripe(publishableKey, { stripeAccount: stripeConnect });
} else {
stripe = Stripe(publishableKey);
}
let newBankButton = document.getElementById('new-bank');
newBankButton.disabled = true;
newBankButton.querySelector('svg').classList.remove('hidden');
newBankButton.querySelector('span').classList.add('hidden');
ev.preventDefault();
const accountHolderNameField = document.getElementById(
'account-holder-name-field'
);
const emailField = document.getElementById('email-field');
const clientSecret = document.querySelector(
'meta[name="client_secret"]'
)?.content;
// Calling this method will open the instant verification dialog.
stripe
.collectBankAccountForPayment({
clientSecret: clientSecret,
params: {
payment_method_type: 'us_bank_account',
payment_method_data: {
billing_details: {
name: accountHolderNameField.value,
email: emailField.value,
},
},
},
expand: ['payment_method'],
})
.then(({ paymentIntent, error }) => {
if (error) {
console.error(error.message);
errors.textContent = error.message;
errors.hidden = false;
resetButtons();
// PaymentMethod collection failed for some reason.
} else if (paymentIntent.status === 'requires_payment_method') {
// Customer canceled the hosted verification modal. Present them with other
// payment method type options.
errors.textContent =
'We were unable to process the payment with this account, please try another one.';
errors.hidden = false;
resetButtons();
return;
} else if (paymentIntent.status === 'requires_confirmation') {
let bank_account_response = document.getElementById(
'bank_account_response'
);
bank_account_response.value = JSON.stringify(paymentIntent);
confirmPayment(stripe, clientSecret);
}
resetButtons();
return;
});
});
function confirmPayment(stripe, clientSecret) {
stripe
.confirmUsBankAccountPayment(clientSecret)
.then(({ paymentIntent, error }) => {
console.log(paymentIntent);
if (error) {
console.error(error.message);
// The payment failed for some reason.
} else if (paymentIntent.status === 'requires_payment_method') {
// Confirmation failed. Attempt again with a different payment method.
errors.textContent =
'We were unable to process the payment with this account, please try another one.';
errors.hidden = false;
resetButtons();
} else if (paymentIntent.status === 'processing') {
// Confirmation succeeded! The account will be debited.
let gateway_response =
document.getElementById('gateway_response');
gateway_response.value = JSON.stringify(paymentIntent);
document.getElementById('server-response').submit();
} else if (
paymentIntent.next_action?.type ===
'verify_with_microdeposits' ||
paymentIntent.next_action?.type === 'requires_source_action'
) {
errors.textContent =
'You will receive an email with details on how to verify your bank account and process payment.';
errors.hidden = false;
document.getElementById('new-bank').style.visibility =
'hidden';
let gateway_response =
document.getElementById('gateway_response');
gateway_response.value = JSON.stringify(paymentIntent);
document.getElementById('server-response').submit();
}
});
}
function resetButtons() {
let newBankButton = document.getElementById('new-bank');
newBankButton.disabled = false;
newBankButton.querySelector('svg').classList.add('hidden');
newBankButton.querySelector('span').classList.remove('hidden');
}
}