diff --git a/public/js/clients/payments/stripe-becs.js b/public/js/clients/payments/stripe-becs.js new file mode 100644 index 000000000000..817b06574349 --- /dev/null +++ b/public/js/clients/payments/stripe-becs.js @@ -0,0 +1 @@ +!function(n){var o={};function r(e){if(o[e])return o[e].exports;var t=o[e]={i:e,l:!1,exports:{}};return n[e].call(t.exports,t,t.exports,r),t.l=!0,t.exports}r.m=n,r.c=o,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)r.d(n,o,function(e){return t[e]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="/",r(r.s=28)}({28:function(e,t,n){e.exports=n("guV3")},guV3:function(e,t){var n;function o(e,t){for(var n=0;n svg").classList.add("hidden"),document.querySelector("#pay-now > span").classList.remove("hidden")}}]),u),c=null!==(n=null===(c=document.querySelector('meta[name="stripe-publishable-key"]'))||void 0===c?void 0:c.content)&&void 0!==n?n:"",i=null!==(n=null===(n=document.querySelector('meta[name="stripe-account-id"]'))||void 0===n?void 0:n.content)&&void 0!==n?n:"";function u(e,t){var n=this;!function(e){if(!(e instanceof u))throw new TypeError("Cannot call a class as a function")}(this),r(this,"setupStripe",function(){n.stripe=Stripe(n.key),n.stripeConnect&&(n.stripe.stripeAccount=i);const e=n.stripe.elements();var t={style:{base:{color:"#32325d",fontSize:"16px","::placeholder":{color:"#aab7c4"},":-webkit-autofill":{color:"#32325d"}},invalid:{color:"#fa755a",iconColor:"#fa755a",":-webkit-autofill":{color:"#fa755a"}}},disabled:!1,hideIcon:!1,iconStyle:"default"};return n.auBankAccount=e.create("auBankAccount",t),n.auBankAccount.mount("#becs-iban"),n}),r(this,"handle",function(){document.getElementById("pay-now").addEventListener("click",e=>{let t=document.getElementById("errors");return""===document.getElementById("becs-name").value?(document.getElementById("becs-name").focus(),t.textContent="Name required.",void(t.hidden=!1)):""===document.getElementById("becs-email-address").value?(document.getElementById("becs-email-address").focus(),t.textContent="Email required.",void(t.hidden=!1)):document.getElementById("becs-mandate-acceptance").checked?(document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden"),void this.stripe.confirmAuBecsDebitPayment(document.querySelector("meta[name=pi-client-secret").content,{payment_method:{au_becs_debit:this.auBankAccount,billing_details:{name:document.getElementById("becs-name").value,email:document.getElementById("becs-email-address").value}}}).then(e=>e.error?this.handleFailure(e.error.message):this.handleSuccess(e))):(document.getElementById("becs-mandate-acceptance").focus(),t.textContent="Accept Terms",t.hidden=!1,void console.log("Terms"))})}),this.key=e,this.errors=document.getElementById("errors"),this.stripeConnect=t}new a(c,i).setupStripe().handle()}}); diff --git a/public/js/clients/payments/stripe-becs.js.LICENSE.txt b/public/js/clients/payments/stripe-becs.js.LICENSE.txt new file mode 100644 index 000000000000..585c6ab0e4fc --- /dev/null +++ b/public/js/clients/payments/stripe-becs.js.LICENSE.txt @@ -0,0 +1,9 @@ +/** + * Invoice Ninja (https://invoiceninja.com) + * + * @link https://github.com/invoiceninja/invoiceninja source repository + * + * @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com) + * + * @license https://opensource.org/licenses/AAL + */ diff --git a/resources/js/clients/payments/stripe-becs.js b/resources/js/clients/payments/stripe-becs.js new file mode 100644 index 000000000000..5aaa85ee3933 --- /dev/null +++ b/resources/js/clients/payments/stripe-becs.js @@ -0,0 +1,136 @@ +/** + * Invoice Ninja (https://invoiceninja.com) + * + * @link https://github.com/invoiceninja/invoiceninja source repository + * + * @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com) + * + * @license https://opensource.org/licenses/AAL + */ + +class ProcessBECS { + constructor(key, stripeConnect) { + this.key = key; + this.errors = document.getElementById('errors'); + this.stripeConnect = stripeConnect; + } + + setupStripe = () => { + this.stripe = Stripe(this.key); + + if(this.stripeConnect) + this.stripe.stripeAccount = stripeConnect; + const elements = this.stripe.elements(); + const style = { + base: { + color: '#32325d', + fontSize: '16px', + '::placeholder': { + color: '#aab7c4' + }, + ':-webkit-autofill': { + color: '#32325d', + }, + }, + invalid: { + color: '#fa755a', + iconColor: '#fa755a', + ':-webkit-autofill': { + color: '#fa755a', + }, + } + }; + + const options = { + style: style, + disabled: false, + hideIcon: false, + iconStyle: "default", // or "solid" + }; + this.auBankAccount = elements.create("auBankAccount", options); + this.auBankAccount.mount("#becs-iban"); + return this; + }; + + handle = () => { + document.getElementById('pay-now').addEventListener('click', (e) => { + + let errors = document.getElementById('errors'); + + if (document.getElementById('becs-name').value === "") { + document.getElementById('becs-name').focus(); + errors.textContent = "Name required."; + errors.hidden = false; + return; + } + + if (document.getElementById('becs-email-address').value === "") { + document.getElementById('becs-email-address').focus(); + errors.textContent = "Email required."; + errors.hidden = false; + return ; + } + + + if (!document.getElementById('becs-mandate-acceptance').checked) { + document.getElementById('becs-mandate-acceptance').focus(); + errors.textContent = "Accept Terms"; + errors.hidden = false; + console.log("Terms"); + return ; + } + + document.getElementById('pay-now').disabled = true; + document.querySelector('#pay-now > svg').classList.remove('hidden'); + document.querySelector('#pay-now > span').classList.add('hidden'); + + this.stripe.confirmAuBecsDebitPayment( + document.querySelector('meta[name=pi-client-secret').content, + { + payment_method: { + au_becs_debit: this.auBankAccount, + billing_details: { + name: document.getElementById("becs-name").value, + email: document.getElementById("becs-email-address").value, + }, + }, + } + ).then((result) => { + if (result.error) { + return this.handleFailure(result.error.message); + } + + return this.handleSuccess(result); + }); + }); + }; + + handleSuccess(result) { + document.querySelector( + 'input[name="gateway_response"]' + ).value = JSON.stringify(result.paymentIntent); + + document.getElementById('server-response').submit(); + } + + handleFailure(message) { + let errors = document.getElementById('errors'); + + errors.textContent = ''; + errors.textContent = message; + errors.hidden = false; + + document.getElementById('pay-now').disabled = false; + document.querySelector('#pay-now > svg').classList.add('hidden'); + document.querySelector('#pay-now > span').classList.remove('hidden'); + } +} + +const publishableKey = document.querySelector( + 'meta[name="stripe-publishable-key"]' +)?.content ?? ''; + +const stripeConnect = + document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; + +new ProcessBECS(publishableKey, stripeConnect).setupStripe().handle();