/* global wc_ppec_context */ ;( function ( $, window, document ) { 'use strict'; // Show error notice at top of checkout form, or else within button container var showError = function( errorMessage, selector ) { var $container = $( '.woocommerce-notices-wrapper, form.checkout' ); if ( ! $container || ! $container.length ) { $( selector ).prepend( errorMessage ); return; } else { $container = $container.first(); } // Adapted from https://github.com/woocommerce/woocommerce/blob/ea9aa8cd59c9fa735460abf0ebcb97fa18f80d03/assets/js/frontend/checkout.js#L514-L529 $( '.woocommerce-NoticeGroup-checkout, .woocommerce-error, .woocommerce-message' ).remove(); $container.prepend( '
' + errorMessage + '
' ); $container.find( '.input-text, select, input:checkbox' ).trigger( 'validate' ).blur(); var scrollElement = $( '.woocommerce-NoticeGroup-checkout' ); if ( ! scrollElement.length ) { scrollElement = $container; } if ( $.scroll_to_notices ) { $.scroll_to_notices( scrollElement ); } else { // Compatibility with WC <3.3 $( 'html, body' ).animate( { scrollTop: ( $container.offset().top - 100 ) }, 1000 ); } $( document.body ).trigger( 'checkout_error' ); } // Map funding method settings to enumerated options provided by PayPal. var getFundingMethods = function( methods ) { if ( ! methods ) { return undefined; } var paypal_funding_methods = []; for ( var i = 0; i < methods.length; i++ ) { var method = paypal.FUNDING[ methods[ i ] ]; if ( method ) { paypal_funding_methods.push( method ); } } return paypal_funding_methods; } var render = function( isMiniCart ) { var prefix = isMiniCart ? 'mini_cart_' : ''; var button_size = wc_ppec_context[ prefix + 'button_size' ]; var button_layout = wc_ppec_context[ prefix + 'button_layout' ]; var button_label = wc_ppec_context[ prefix + 'button_label' ]; var allowed = wc_ppec_context[ prefix + 'allowed_methods' ]; var disallowed = wc_ppec_context[ prefix + 'disallowed_methods' ]; var selector = isMiniCart ? '#woo_pp_ec_button_mini_cart' : '#woo_pp_ec_button_' + wc_ppec_context.page; paypal.Button.render( { env: wc_ppec_context.environment, locale: wc_ppec_context.locale, commit: 'checkout' === wc_ppec_context.page && ! isMiniCart, funding: { allowed: getFundingMethods( allowed ), disallowed: getFundingMethods( disallowed ), }, style: { color: wc_ppec_context.button_color, shape: wc_ppec_context.button_shape, layout: button_layout, size: button_size, label: button_label, branding: true, tagline: false, }, validate: function( actions ) { // Only enable on variable product page if purchasable variation selected. $( '#woo_pp_ec_button_product' ).off( '.legacy' ) .on( 'enable', actions.enable ) .on( 'disable', actions.disable ); }, payment: function() { // Clear any errors from previous attempt. $( '.woocommerce-error', selector ).remove(); return new paypal.Promise( function( resolve, reject ) { // First, generate cart if triggered from single product. if ( 'product' === wc_ppec_context.page && ! isMiniCart ) { window.wc_ppec_generate_cart( resolve ); } else { resolve(); } } ).then( function() { // Make PayPal Checkout initialization request. var data = $( selector ).closest( 'form' ) .add( $( ' ' ) .attr( 'value', wc_ppec_context.start_checkout_nonce ) ) .add( $( ' ' ) .attr( 'value', 'checkout' === wc_ppec_context.page && ! isMiniCart ? 'yes' : 'no' ) ) .serialize(); return paypal.request( { method: 'post', url: wc_ppec_context.start_checkout_url, body: data, } ).then( function( response ) { if ( ! response.success ) { var messageItems = response.data.messages.map( function( message ) { return '
  • ' + message + '
  • '; } ).join( '' ); showError( '', selector ); return null; } return response.data.token; } ); } ); }, onAuthorize: function( data, actions ) { if ( 'checkout' === wc_ppec_context.page && ! isMiniCart ) { // Pass data necessary for authorizing payment to back-end. $( 'form.checkout' ) .append( $( ' ' ).attr( 'value', data.paymentToken ) ) .append( $( ' ' ).attr( 'value', data.payerID ) ) .submit(); } else { // Navigate to order confirmation URL specified in original request to PayPal from back-end. return actions.redirect(); } }, }, selector ); }; // Render cart, single product, or checkout buttons. if ( wc_ppec_context.page ) { render(); $( document.body ).on( 'updated_cart_totals updated_checkout', render.bind( this, false ) ); } // Render buttons in mini-cart if present. $( document.body ).on( 'wc_fragments_loaded wc_fragments_refreshed', function() { var $button = $( '.widget_shopping_cart #woo_pp_ec_button_mini_cart' ); if ( $button.length ) { // Clear any existing button in container, and render. $button.empty(); render( true ); } } ); } )( jQuery, window, document );