diff --git a/modules/ppcp-applepay/resources/css/styles.scss b/modules/ppcp-applepay/resources/css/styles.scss new file mode 100644 index 000000000..7fac53ecd --- /dev/null +++ b/modules/ppcp-applepay/resources/css/styles.scss @@ -0,0 +1,6 @@ +#applepay-container { + margin-top: 0.5rem; + overflow: hidden; + border-radius: 50px; + height: 45px; +} diff --git a/modules/ppcp-applepay/services.php b/modules/ppcp-applepay/services.php index 3a817cf12..a72c5361c 100644 --- a/modules/ppcp-applepay/services.php +++ b/modules/ppcp-applepay/services.php @@ -10,6 +10,9 @@ declare(strict_types=1); namespace WooCommerce\PayPalCommerce\Applepay; use WooCommerce\PayPalCommerce\ApiClient\Helper\Cache; +use WooCommerce\PayPalCommerce\Applepay\Assets\ApplePayButton; +use WooCommerce\PayPalCommerce\Applepay\Assets\AppleProductStatus; +use WooCommerce\PayPalCommerce\Applepay\Assets\DataToAppleButtonScripts; use WooCommerce\PayPalCommerce\Vendor\Psr\Container\ContainerInterface; use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings; @@ -42,13 +45,6 @@ return array( } return $settings->get( 'applepay_validated' ) === 'yes'; }, - 'applepay.payment_method' => static function ( ContainerInterface $container ): ApplepayPaymentMethod { - $settings = $container->get( 'wcgateway.settings' ); - $logger = $container->get( 'woocommerce.logger.woocommerce' ); - $order_processor = $container->get( 'wcgateway.order-processor' ); - - return new ApplepayPaymentMethod( $settings, $logger, $order_processor ); - }, 'applepay.url' => static function ( ContainerInterface $container ): string { $path = realpath( __FILE__ ); if ( false === $path ) { @@ -62,29 +58,18 @@ return array( 'applepay.sdk_script_url' => static function ( ContainerInterface $container ): string { return 'https://applepay.cdn-apple.com/jsapi/v1/apple-pay-sdk.js'; }, - 'applepay.script_url' => static function ( ContainerInterface $container ): string { - return trailingslashit( $container->get( 'applepay.url' ) ) . '/assets/js/applePayDirect.js'; - }, - 'applepay.style_url' => static function ( ContainerInterface $container ): string { - return trailingslashit( $container->get( 'applepay.url' ) ) . '/assets/css/applepaydirect.css'; - }, - 'applepay.setting_button_enabled_product' => static function ( ContainerInterface $container ): bool { - $settings = $container->get( 'wcgateway.settings' ); - assert( $settings instanceof ContainerInterface ); - - return $settings->has( 'applepay_button_enabled_product' ) ? - (bool) $settings->get( 'applepay_button_enabled_product' ) : - false; - }, - 'applepay.setting_button_enabled_cart' => static function ( ContainerInterface $container ): bool { - $settings = $container->get( 'wcgateway.settings' ); - assert( $settings instanceof ContainerInterface ); - - return $settings->has( 'applepay_button_enabled_cart' ) ? - (bool) $settings->get( 'applepay_button_enabled_cart' ) : - false; - }, 'applepay.data_to_scripts' => static function ( ContainerInterface $container ): DataToAppleButtonScripts { - return new DataToAppleButtonScripts(); + $sdk_url = $container->get( 'applepay.sdk_script_url' ); + return new DataToAppleButtonScripts($sdk_url); + }, + 'applepay.button' => static function ( ContainerInterface $container ): ApplePayButton { + $settings = $container->get( 'wcgateway.settings' ); + $logger = $container->get( 'woocommerce.logger.woocommerce' ); + $order_processor = $container->get( 'wcgateway.order-processor' ); + $version = $container->get('ppcp.asset-version'); + $module_url = $container->get( 'applepay.url' ); + $data = $container->get('applepay.data_to_scripts'); + + return new ApplePayButton( $settings, $logger, $order_processor, $module_url, $version, $data, $settings ); }, ); diff --git a/modules/ppcp-applepay/src/ApplepayModule.php b/modules/ppcp-applepay/src/ApplepayModule.php index dc1e618a3..fde37a885 100644 --- a/modules/ppcp-applepay/src/ApplepayModule.php +++ b/modules/ppcp-applepay/src/ApplepayModule.php @@ -10,6 +10,7 @@ declare(strict_types=1); namespace WooCommerce\PayPalCommerce\Applepay; use WooCommerce\PayPalCommerce\ApiClient\Helper\Cache; +use WooCommerce\PayPalCommerce\ApplePay\Assets\ButtonInterface; use WooCommerce\PayPalCommerce\Onboarding\Environment; use WooCommerce\PayPalCommerce\Vendor\Dhii\Container\ServiceProvider; use WooCommerce\PayPalCommerce\Vendor\Dhii\Modular\Module\ModuleInterface; @@ -86,6 +87,13 @@ class ApplepayModule implements ModuleInterface { $this->render_buttons( $c ); $apple_payment_method->bootstrap_ajax_request(); + add_filter( + 'woocommerce_paypal_payments_sdk_components_hook', + function( $components ) { + $components[] = 'applepay'; + return $components; + } + ); add_action( 'woocommerce_paypal_payments_gateway_migrate_on_update', static function() use ( $c ) { @@ -152,54 +160,18 @@ class ApplepayModule implements ModuleInterface { */ public function load_assets( ContainerInterface $c ): void { add_action( - 'wp', + 'wp_enqueue_scripts', function () use ( $c ) { - wp_register_script( - 'wc-ppcp-applepay-sdk', - $c->get( 'applepay.sdk_script_url' ), - array(), - $c->get( 'ppcp.asset-version' ), - true - ); - wp_enqueue_script( 'wc-ppcp-applepay-sdk' ); - wp_register_script( - 'wc-ppcp-applepay', - $c->get( 'applepay.script_url' ), - array( 'wc-ppcp-applepay-sdk' ), - $c->get( 'ppcp.asset-version' ), - true - ); - wp_register_style( - 'wc-ppcp-applepay', - $c->get( 'applepay.style_url' ), - array(), - $c->get( 'ppcp.asset-version' ) - ); - wp_enqueue_style( 'wc-ppcp-applepay' ); - wp_enqueue_script( 'wc-ppcp-applepay' ); - $data = $c->get( 'applepay.data_to_scripts' )->apple_pay_script_data(); - wp_localize_script( - 'wc-ppcp-applepay', - 'wc_ppcp_applepay', - $data - ); + $button = $c->get( 'applepay.button' ); + assert( $button instanceof ButtonInterface ); + + if ( $button->should_load_script() ) { + $button->enqueue(); + } } ); } - /** - * ApplePay button markup - */ - protected function apple_pay_direct_button(): void { - ?> -
- get( 'applepay.setting_button_enabled_product' ); - $button_enabled_cart = $c->get( 'applepay.setting_button_enabled_cart' ); - add_filter( - 'woocommerce_paypal_payments_sdk_components_hook', - function( $components ) { - $components[] = 'applepay'; - return $components; + add_action( + 'wp', + static function () use ( $c ) { + if ( is_admin() ) { + return; + } + $button = $c->get( 'applepay.button' ); + + /** + * The Button. + * + * @var ButtonInterface $button + */ + $button->render_buttons(); } ); - if ( $button_enabled_product ) { - $render_placeholder = apply_filters( 'woocommerce_paypal_payments_applepay_render_hook_product', 'woocommerce_after_add_to_cart_form' ); - $render_placeholder = is_string( $render_placeholder ) ? $render_placeholder : 'woocommerce_after_add_to_cart_form'; - add_action( - $render_placeholder, - function () { - $this->apple_pay_direct_button(); - } - ); - } - if ( $button_enabled_cart ) { - $render_placeholder = apply_filters( 'woocommerce_paypal_payments_applepay_render_hook_cart', 'woocommerce_cart_totals_after_order_total' ); - $render_placeholder = is_string( $render_placeholder ) ? $render_placeholder : 'woocommerce_cart_totals_after_order_total'; - add_action( - $render_placeholder, - function () { - $this->apple_pay_direct_button(); - } - ); - } } } diff --git a/modules/ppcp-applepay/src/ApplepayPaymentMethod.php b/modules/ppcp-applepay/src/assets/ApplePayButton.php similarity index 88% rename from modules/ppcp-applepay/src/ApplepayPaymentMethod.php rename to modules/ppcp-applepay/src/assets/ApplePayButton.php index 93d527859..4eb7756b9 100644 --- a/modules/ppcp-applepay/src/ApplepayPaymentMethod.php +++ b/modules/ppcp-applepay/src/assets/ApplePayButton.php @@ -7,7 +7,7 @@ declare(strict_types=1); -namespace WooCommerce\PayPalCommerce\Applepay; +namespace WooCommerce\PayPalCommerce\Applepay\Assets; use Psr\Log\LoggerInterface; use WC_Cart; @@ -27,14 +27,14 @@ use WooCommerce\PayPalCommerce\Webhooks\Handler\RequestHandlerTrait; /** * Class PayPalPaymentMethod */ -class ApplepayPaymentMethod { +class ApplePayButton implements ButtonInterface { use RequestHandlerTrait; /** * The settings. * * @var Settings */ - private $plugin_settings; + private $settings; /** * The logger. * @@ -73,25 +73,40 @@ class ApplepayPaymentMethod { * @var bool Whether to reload the cart after the order is processed. */ protected $reload_cart = false; + private $version; + /** + * @var string + */ + private $module_url; + /** + * @var string + */ + private $script_data; /** * PayPalPaymentMethod constructor. * - * @param Settings $plugin_settings The settings. + * @param Settings $settings The settings. * @param LoggerInterface $logger The logger. * @param OrderProcessor $order_processor The Order processor. */ public function __construct( - Settings $plugin_settings, - LoggerInterface $logger, - OrderProcessor $order_processor + Settings $settings, + LoggerInterface $logger, + OrderProcessor $order_processor, + string $module_url, + string $version, + DataToAppleButtonScripts $data ) { - $this->plugin_settings = $plugin_settings; + $this->settings = $settings; $this->response_templates = new ResponsesToApple(); $this->logger = $logger; $this->id = 'applepay'; $this->method_title = __( 'Apple Pay', 'woocommerce-paypal-payments' ); $this->order_processor = $order_processor; + $this->module_url = $module_url; + $this->version = $version; + $this->script_data = $data; } /** @@ -103,7 +118,7 @@ class ApplepayPaymentMethod { 'ppcp_partner_referrals_data', function ( array $data ): array { try { - $onboard_with_apple = $this->plugin_settings->get( 'ppcp-onboarding-apple' ); + $onboard_with_apple = $this->settings->get( 'ppcp-onboarding-apple' ); if ( $onboard_with_apple !== '1' ) { return $data; } @@ -150,7 +165,7 @@ class ApplepayPaymentMethod { public function add_apple_onboarding_option( $options ): string { $checked = ''; try { - $onboard_with_apple = $this->plugin_settings->get( 'ppcp-onboarding-apple' ); + $onboard_with_apple = $this->settings->get( 'ppcp-onboarding-apple' ); if ( $onboard_with_apple === '1' ) { $checked = 'checked'; } @@ -790,4 +805,80 @@ class ApplepayPaymentMethod { } ); } + + public function render_buttons(): bool + { + $button_enabled_product = $this->settings->has( 'applepay_button_enabled_product' ) ? $this->settings->get( 'applepay_button_enabled_product' ) : false; + $button_enabled_cart = $this->settings->has( 'applepay_button_enabled_cart' ) ? $this->settings->get( 'applepay_button_enabled_cart' ) : false; + + if ( $button_enabled_product ) { + $render_placeholder = apply_filters( 'woocommerce_paypal_payments_applepay_render_hook_product', 'woocommerce_after_add_to_cart_form' ); + $render_placeholder = is_string( $render_placeholder ) ? $render_placeholder : 'woocommerce_after_add_to_cart_form'; + add_action( + $render_placeholder, + function () { + $this->apple_pay_direct_button(); + } + ); + } + if ( $button_enabled_cart ) { + $render_placeholder = apply_filters( 'woocommerce_paypal_payments_applepay_render_hook_cart', 'woocommerce_cart_totals_after_order_total' ); + $render_placeholder = is_string( $render_placeholder ) ? $render_placeholder : 'woocommerce_cart_totals_after_order_total'; + add_action( + $render_placeholder, + function () { + $this->apple_pay_direct_button(); + } + ); + } + return true; + } + /** + * ApplePay button markup + */ + protected function apple_pay_direct_button(): void { + ?> + + module_url ) . '/assets/js/applePayDirect.js', + array(), + $this->version, + true + ); + wp_enqueue_script( 'wc-ppcp-applepay' ); + + wp_register_style( + 'wc-ppcp-applepay', + untrailingslashit( $this->module_url ) . '/assets/css/styles.css', + array(), + $this->version + ); + wp_enqueue_style( 'wc-ppcp-applepay' ); + + wp_localize_script( + 'wc-ppcp-applepay', + 'wc_ppcp_applepay', + $this->script_data() + ); + } + + public function script_data(): array + { + return $this->script_data->apple_pay_script_data(); + } } diff --git a/modules/ppcp-applepay/src/ApplePayDataObjectHttp.php b/modules/ppcp-applepay/src/assets/ApplePayDataObjectHttp.php similarity index 99% rename from modules/ppcp-applepay/src/ApplePayDataObjectHttp.php rename to modules/ppcp-applepay/src/assets/ApplePayDataObjectHttp.php index e3f76b8e6..aad0a41d7 100644 --- a/modules/ppcp-applepay/src/ApplePayDataObjectHttp.php +++ b/modules/ppcp-applepay/src/assets/ApplePayDataObjectHttp.php @@ -7,7 +7,7 @@ declare(strict_types=1); -namespace WooCommerce\PayPalCommerce\Applepay; +namespace WooCommerce\PayPalCommerce\Applepay\Assets; use Psr\Log\LoggerInterface as Logger; diff --git a/modules/ppcp-applepay/src/AppleProductStatus.php b/modules/ppcp-applepay/src/assets/AppleProductStatus.php similarity index 98% rename from modules/ppcp-applepay/src/AppleProductStatus.php rename to modules/ppcp-applepay/src/assets/AppleProductStatus.php index 7453b4047..e804bc069 100644 --- a/modules/ppcp-applepay/src/AppleProductStatus.php +++ b/modules/ppcp-applepay/src/assets/AppleProductStatus.php @@ -7,7 +7,7 @@ declare( strict_types=1 ); -namespace WooCommerce\PayPalCommerce\Applepay; +namespace WooCommerce\PayPalCommerce\Applepay\Assets; use Throwable; use WooCommerce\PayPalCommerce\ApiClient\Endpoint\PartnersEndpoint; diff --git a/modules/ppcp-applepay/src/assets/ButtonInterface.php b/modules/ppcp-applepay/src/assets/ButtonInterface.php new file mode 100644 index 000000000..be1c85083 --- /dev/null +++ b/modules/ppcp-applepay/src/assets/ButtonInterface.php @@ -0,0 +1,40 @@ +sdk_url = $sdk_url; + } + /** * Sets the appropriate data to send to ApplePay script * Data differs between product page and cart page @@ -80,7 +91,6 @@ class DataToAppleButtonScripts { $currency_code, $total_label ) { - $product = wc_get_product( get_the_id() ); if ( ! $product ) { return array(); @@ -95,6 +105,7 @@ class DataToAppleButtonScripts { $product_stock = $product->get_stock_status(); return array( + 'sdk_url' => $this->sdk_url, 'product' => array( 'needShipping' => $product_need_shipping, 'id' => $product_id, @@ -131,6 +142,7 @@ class DataToAppleButtonScripts { . $nonce . ''; return array( + 'sdk_url' => $this->sdk_url, 'product' => array( 'needShipping' => $cart->needs_shipping(), 'subtotal' => $cart->get_subtotal(), diff --git a/modules/ppcp-applepay/src/PropertiesDictionary.php b/modules/ppcp-applepay/src/assets/PropertiesDictionary.php similarity index 97% rename from modules/ppcp-applepay/src/PropertiesDictionary.php rename to modules/ppcp-applepay/src/assets/PropertiesDictionary.php index abeef3675..d039749c3 100644 --- a/modules/ppcp-applepay/src/PropertiesDictionary.php +++ b/modules/ppcp-applepay/src/assets/PropertiesDictionary.php @@ -7,7 +7,7 @@ declare(strict_types=1); -namespace WooCommerce\PayPalCommerce\Applepay; +namespace WooCommerce\PayPalCommerce\Applepay\Assets; /** * Class PropertiesDictionary diff --git a/modules/ppcp-applepay/src/ResponsesToApple.php b/modules/ppcp-applepay/src/assets/ResponsesToApple.php similarity index 98% rename from modules/ppcp-applepay/src/ResponsesToApple.php rename to modules/ppcp-applepay/src/assets/ResponsesToApple.php index 5c8495ae6..8b8074f6b 100644 --- a/modules/ppcp-applepay/src/ResponsesToApple.php +++ b/modules/ppcp-applepay/src/assets/ResponsesToApple.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace WooCommerce\PayPalCommerce\Applepay; +namespace WooCommerce\PayPalCommerce\Applepay\Assets; use Psr\Log\LoggerInterface; use WC_Payment_Gateway; diff --git a/modules/ppcp-applepay/webpack.config.js b/modules/ppcp-applepay/webpack.config.js index 3783e7614..8ab5fe680 100644 --- a/modules/ppcp-applepay/webpack.config.js +++ b/modules/ppcp-applepay/webpack.config.js @@ -10,7 +10,7 @@ module.exports = { plugins: [ new DependencyExtractionWebpackPlugin() ], entry: { 'applepayDirect': path.resolve('./resources/js/applepayDirect.js'), - 'applepayDirectCart': path.resolve('./resources/js/applepayDirectCart.js') + "styles": path.resolve('./resources/css/styles.scss') }, output: { path: path.resolve(__dirname, 'assets/'),