diff --git a/modules/ppcp-applepay/resources/js/ApplepayButton.js b/modules/ppcp-applepay/resources/js/ApplepayButton.js index 15615d7ee..2c1b6fb4c 100644 --- a/modules/ppcp-applepay/resources/js/ApplepayButton.js +++ b/modules/ppcp-applepay/resources/js/ApplepayButton.js @@ -244,6 +244,11 @@ class ApplepayButton { requiredShippingContactFields: ["postalAddress", "email", "phone"], requiredBillingContactFields: ["postalAddress", "email", "phone"], } + + if (!this.contextHandler.shippingAllowed()) { + baseRequest.requiredShippingContactFields = []; + } + const paymentDataRequest = Object.assign({}, baseRequest); paymentDataRequest.currencyCode = buttonConfig.shop.currencyCode; paymentDataRequest.total = { @@ -508,18 +513,53 @@ class ApplepayButton { if (confirmOrderResponse && confirmOrderResponse.approveApplePayPayment) { if (confirmOrderResponse.approveApplePayPayment.status === "APPROVED") { try { - let data = { - billing_contact: event.payment.billingContact, - shipping_contact: event.payment.shippingContact, - paypal_order_id: id, - }; - let authorizationResult = await processInWooAndCapture(data); - if (authorizationResult.result === "success") { - session.completePayment(ApplePaySession.STATUS_SUCCESS) - window.location.href = authorizationResult.redirect + + if (!this.contextHandler.shippingAllowed()) { + // No shipping, expect immediate capture, ex: PayNow. + + let approveFailed = false; + await this.contextHandler.approveOrder({ + orderID: id + }, { // actions mock object. + restart: () => new Promise((resolve, reject) => { + approveFailed = true; + resolve(); + }), + order: { + get: () => new Promise((resolve, reject) => { + resolve(null); + }) + } + }); + + if (!approveFailed) { + this.log('onpaymentauthorized approveOrder OK'); + session.completePayment(ApplePaySession.STATUS_SUCCESS); + } else { + this.log('onpaymentauthorized approveOrder FAIL'); + session.completePayment(ApplePaySession.STATUS_FAILURE); + session.abort() + console.error(error); + } + } else { - session.completePayment(ApplePaySession.STATUS_FAILURE) + // Default payment. + + let data = { + billing_contact: event.payment.billingContact, + shipping_contact: event.payment.shippingContact, + paypal_order_id: id, + }; + let authorizationResult = await processInWooAndCapture(data); + if (authorizationResult.result === "success") { + session.completePayment(ApplePaySession.STATUS_SUCCESS) + window.location.href = authorizationResult.redirect + } else { + session.completePayment(ApplePaySession.STATUS_FAILURE) + } + } + } catch (error) { session.completePayment(ApplePaySession.STATUS_FAILURE); session.abort() diff --git a/modules/ppcp-applepay/resources/js/Context/BaseHandler.js b/modules/ppcp-applepay/resources/js/Context/BaseHandler.js index dea7de698..f08c2d6a1 100644 --- a/modules/ppcp-applepay/resources/js/Context/BaseHandler.js +++ b/modules/ppcp-applepay/resources/js/Context/BaseHandler.js @@ -1,8 +1,6 @@ import ErrorHandler from "../../../../ppcp-button/resources/js/modules/ErrorHandler"; import CartActionHandler from "../../../../ppcp-button/resources/js/modules/ActionHandler/CartActionHandler"; -import onApprove - from "../../../../ppcp-button/resources/js/modules/OnApproveHandler/onApproveForContinue"; class BaseHandler { @@ -11,6 +9,10 @@ class BaseHandler { this.ppcpConfig = ppcpConfig; } + shippingAllowed() { + return true; + } + transactionInfo() { return new Promise((resolve, reject) => { @@ -42,30 +44,25 @@ class BaseHandler { } createOrder() { - const errorHandler = new ErrorHandler( - this.ppcpConfig.labels.error.generic, - document.querySelector('.woocommerce-notices-wrapper') - ); - - const actionHandler = new CartActionHandler( - this.ppcpConfig, - errorHandler, - ); - - return actionHandler.configuration().createOrder(null, null); + return this.actionHandler().configuration().createOrder(null, null); } - approveOrderForContinue(data, actions) { - const errorHandler = new ErrorHandler( + approveOrder(data, actions) { + return this.actionHandler().configuration().onApprove(data, actions); + } + + actionHandler() { + return new CartActionHandler( + this.ppcpConfig, + this.errorHandler(), + ); + } + + errorHandler() { + return new ErrorHandler( this.ppcpConfig.labels.error.generic, document.querySelector('.woocommerce-notices-wrapper') ); - - let onApproveHandler = onApprove({ - config: this.ppcpConfig - }, errorHandler); - - return onApproveHandler(data, actions); } } diff --git a/modules/ppcp-applepay/resources/js/Context/ContextHandlerFactory.js b/modules/ppcp-applepay/resources/js/Context/ContextHandlerFactory.js index 72ee4f5fa..04338354b 100644 --- a/modules/ppcp-applepay/resources/js/Context/ContextHandlerFactory.js +++ b/modules/ppcp-applepay/resources/js/Context/ContextHandlerFactory.js @@ -4,6 +4,7 @@ import CheckoutHandler from "./CheckoutHandler"; import CartBlockHandler from "./CartBlockHandler"; import CheckoutBlockHandler from "./CheckoutBlockHandler"; import MiniCartHandler from "./MiniCartHandler"; +import PayNowHandler from "./PayNowHandler"; class ContextHandlerFactory { @@ -14,8 +15,9 @@ class ContextHandlerFactory { case 'cart': return new CartHandler(buttonConfig, ppcpConfig); case 'checkout': - case 'pay-now': // same as checkout return new CheckoutHandler(buttonConfig, ppcpConfig); + case 'pay-now': + return new PayNowHandler(buttonConfig, ppcpConfig); case 'mini-cart': return new MiniCartHandler(buttonConfig, ppcpConfig); case 'cart-block': diff --git a/modules/ppcp-applepay/resources/js/Context/PayNowHandler.js b/modules/ppcp-applepay/resources/js/Context/PayNowHandler.js new file mode 100644 index 000000000..add275608 --- /dev/null +++ b/modules/ppcp-applepay/resources/js/Context/PayNowHandler.js @@ -0,0 +1,35 @@ +import Spinner from "../../../../ppcp-button/resources/js/modules/Helper/Spinner"; +import BaseHandler from "./BaseHandler"; +import CheckoutActionHandler + from "../../../../ppcp-button/resources/js/modules/ActionHandler/CheckoutActionHandler"; + +class PayNowHandler extends BaseHandler { + + shippingAllowed() { + return false; + } + + transactionInfo() { + return new Promise(async (resolve, reject) => { + const data = this.ppcpConfig['pay_now']; + + resolve({ + countryCode: data.country_code, + currencyCode: data.currency_code, + totalPriceStatus: 'FINAL', + totalPrice: data.total_str + }); + }); + } + + actionHandler() { + return new CheckoutActionHandler( + this.ppcpConfig, + this.errorHandler(), + new Spinner() + ); + } + +} + +export default PayNowHandler; diff --git a/modules/ppcp-applepay/resources/js/Context/SingleProductHandler.js b/modules/ppcp-applepay/resources/js/Context/SingleProductHandler.js index ddb7ad531..a014f2ae6 100644 --- a/modules/ppcp-applepay/resources/js/Context/SingleProductHandler.js +++ b/modules/ppcp-applepay/resources/js/Context/SingleProductHandler.js @@ -48,23 +48,16 @@ class SingleProductHandler extends BaseHandler { }); } - createOrder() { - const errorHandler = new ErrorHandler( - this.ppcpConfig.labels.error.generic, - document.querySelector('.woocommerce-notices-wrapper') - ); - - const actionHandler = new SingleProductActionHandler( + actionHandler() { + return new SingleProductActionHandler( this.ppcpConfig, new UpdateCart( this.ppcpConfig.ajax.change_cart.endpoint, this.ppcpConfig.ajax.change_cart.nonce, ), document.querySelector('form.cart'), - errorHandler, + this.errorHandler(), ); - - return actionHandler.configuration().createOrder(); } }