From 25fa11b0f8d9cdd1e571da7e0366036b95cf473d Mon Sep 17 00:00:00 2001 From: David Remer Date: Thu, 24 Sep 2020 08:41:08 +0300 Subject: [PATCH 01/38] extract sandbox host into its own container key. With #21, we do not know anymore if we are currently in sandbox or production mode. We seperate the two hosts, so we can later instantiate different Api endpoint objects with different hosts. This enables us to call two different hosts in the same PHP process. In the current scope, just seperating the hosts (and not secrets/keys) should be sufficient. --- modules/ppcp-onboarding/services.php | 40 ++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/modules/ppcp-onboarding/services.php b/modules/ppcp-onboarding/services.php index 08d05e3b1..c0d8cf027 100644 --- a/modules/ppcp-onboarding/services.php +++ b/modules/ppcp-onboarding/services.php @@ -20,12 +20,10 @@ use WooCommerce\PayPalCommerce\Onboarding\Render\OnboardingRenderer; use WpOop\TransientCache\CachePoolFactory; return array( + 'api.sandbox-host' => static function ( $container ): string { - 'api.host' => static function ( $container ): string { $state = $container->get( 'onboarding.state' ); - $environment = $container->get( 'onboarding.environment' ); - // ToDo: Correct the URLs. /** * The Environment and State variables. * @@ -33,17 +31,37 @@ return array( * @var State $state */ if ( $state->current_state() >= State::STATE_ONBOARDED ) { - if ( $environment->current_environment_is( Environment::SANDBOX ) ) { - return 'https://api.sandbox.paypal.com'; - } return 'https://api.sandbox.paypal.com'; } - - // ToDo: Real connect.woocommerce.com. - if ( $environment->current_environment_is( Environment::SANDBOX ) ) { - return 'http://connect-woo.wpcust.com'; - } + // ToDo: Real connect.woocommerce.com sandbox link. return 'http://connect-woo.wpcust.com'; + }, + 'api.production-host' => static function ( $container ): string { + + $state = $container->get( 'onboarding.state' ); + + /** + * The Environment and State variables. + * + * @var Environment $environment + * @var State $state + */ + if ( $state->current_state() >= State::STATE_ONBOARDED ) { + return 'https://api.paypal.com'; + } + // ToDo: Real connect.woocommerce.com production link. + return 'http://connect-woo.wpcust.com'; + }, + 'api.host' => static function ( $container ): string { + $environment = $container->get( 'onboarding.environment' ); + + /** + * The Environment and State variables. + * + * @var Environment $environment + */ + return $environment->current_environment_is( Environment::SANDBOX ) + ? (string) $container->get('api.sandbox-host') : (string) $container->get('api.production-host'); }, 'api.paypal-host' => function( $container ) : string { From 7fd2712aa43dec04776300d0943a6ea03963f7d5 Mon Sep 17 00:00:00 2001 From: David Remer Date: Thu, 24 Sep 2020 09:38:20 +0300 Subject: [PATCH 02/38] do not send the email when creating referreldata for link --- .../src/Repository/class-partnerreferralsdata.php | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/ppcp-api-client/src/Repository/class-partnerreferralsdata.php b/modules/ppcp-api-client/src/Repository/class-partnerreferralsdata.php index e3a5e8727..2b1fb0a97 100644 --- a/modules/ppcp-api-client/src/Repository/class-partnerreferralsdata.php +++ b/modules/ppcp-api-client/src/Repository/class-partnerreferralsdata.php @@ -72,7 +72,6 @@ class PartnerReferralsData { private function default_data(): array { return array( - 'email' => $this->merchant_email, 'partner_config_override' => array( 'partner_logo_url' => 'https://connect.woocommerce.com/images/woocommerce_logo.png', 'return_url' => admin_url( From 920b428ac73b191f51505f6f4037eb8729200a9c Mon Sep 17 00:00:00 2001 From: David Remer Date: Thu, 24 Sep 2020 09:50:06 +0300 Subject: [PATCH 03/38] show buttons on start screen --- modules/ppcp-wc-gateway/services.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ppcp-wc-gateway/services.php b/modules/ppcp-wc-gateway/services.php index f7bbe6ee1..9c8d348cf 100644 --- a/modules/ppcp-wc-gateway/services.php +++ b/modules/ppcp-wc-gateway/services.php @@ -180,7 +180,7 @@ return array( 'title' => __( 'Connect to PayPal', 'paypal-payments-for-woocommerce' ), 'type' => 'ppcp_onboarding', 'screens' => array( - State::STATE_PROGRESSIVE, + State::STATE_START, ), 'requirements' => array(), 'gateway' => 'paypal', From b70819847b38b83558748d0f0d2daff670ba3462 Mon Sep 17 00:00:00 2001 From: David Remer Date: Thu, 24 Sep 2020 09:57:55 +0300 Subject: [PATCH 04/38] load onboarding script on start screen --- modules/ppcp-onboarding/src/Assets/class-onboardingassets.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ppcp-onboarding/src/Assets/class-onboardingassets.php b/modules/ppcp-onboarding/src/Assets/class-onboardingassets.php index 75a232205..0744db2c6 100644 --- a/modules/ppcp-onboarding/src/Assets/class-onboardingassets.php +++ b/modules/ppcp-onboarding/src/Assets/class-onboardingassets.php @@ -133,7 +133,7 @@ class OnboardingAssets { return false; } - $should_render = $this->state->current_state() === State::STATE_PROGRESSIVE; + $should_render = $this->state->current_state() === State::STATE_START; return $should_render; } } From 6f870ec7a5eb9a72e157d562f9f1e313f0de7494 Mon Sep 17 00:00:00 2001 From: David Remer Date: Thu, 24 Sep 2020 09:58:28 +0300 Subject: [PATCH 05/38] render sandbox and live connect button and toggle between those depending on sandbox checkbox --- .../ppcp-onboarding/assets/js/onboarding.js | 28 +++++ modules/ppcp-onboarding/services.php | 49 ++++++--- .../src/Render/class-onboardingrenderer.php | 103 +++++++++++++----- 3 files changed, 137 insertions(+), 43 deletions(-) diff --git a/modules/ppcp-onboarding/assets/js/onboarding.js b/modules/ppcp-onboarding/assets/js/onboarding.js index c2632f6f4..4c8b9d5e9 100644 --- a/modules/ppcp-onboarding/assets/js/onboarding.js +++ b/modules/ppcp-onboarding/assets/js/onboarding.js @@ -25,3 +25,31 @@ function onboardingCallback(authCode, sharedId) { } ); } + +const sandboxSwitch = (element) => { + + const toggleConnectButtons = (showProduction) => { + if (showProduction) { + document.querySelector('#connect-to-production').style.display = ''; + document.querySelector('#connect-to-sandbox').style.display = 'none'; + return; + } + document.querySelector('#connect-to-production').style.display = 'none'; + document.querySelector('#connect-to-sandbox').style.display = ''; + } + toggleConnectButtons(! element.checked); + + element.addEventListener( + 'change', + (event) => { + toggleConnectButtons(! element.checked); + } + ); +}; + +(() => { + const sandboxSwitchElement = document.querySelector('#ppcp-sandbox_on'); + if (sandboxSwitchElement) { + sandboxSwitch(sandboxSwitchElement); + } +})(); \ No newline at end of file diff --git a/modules/ppcp-onboarding/services.php b/modules/ppcp-onboarding/services.php index c0d8cf027..6a99336a1 100644 --- a/modules/ppcp-onboarding/services.php +++ b/modules/ppcp-onboarding/services.php @@ -13,6 +13,7 @@ use Dhii\Data\Container\ContainerInterface; use WooCommerce\PayPalCommerce\ApiClient\Authentication\Bearer; use WooCommerce\PayPalCommerce\ApiClient\Authentication\ConnectBearer; use WooCommerce\PayPalCommerce\ApiClient\Authentication\PayPalBearer; +use WooCommerce\PayPalCommerce\ApiClient\Endpoint\PartnerReferrals; use WooCommerce\PayPalCommerce\ApiClient\Helper\Cache; use WooCommerce\PayPalCommerce\Onboarding\Assets\OnboardingAssets; use WooCommerce\PayPalCommerce\Onboarding\Endpoint\LoginSellerEndpoint; @@ -20,7 +21,7 @@ use WooCommerce\PayPalCommerce\Onboarding\Render\OnboardingRenderer; use WpOop\TransientCache\CachePoolFactory; return array( - 'api.sandbox-host' => static function ( $container ): string { + 'api.sandbox-host' => static function ( $container ): string { $state = $container->get( 'onboarding.state' ); @@ -36,7 +37,7 @@ return array( // ToDo: Real connect.woocommerce.com sandbox link. return 'http://connect-woo.wpcust.com'; }, - 'api.production-host' => static function ( $container ): string { + 'api.production-host' => static function ( $container ): string { $state = $container->get( 'onboarding.state' ); @@ -52,7 +53,7 @@ return array( // ToDo: Real connect.woocommerce.com production link. return 'http://connect-woo.wpcust.com'; }, - 'api.host' => static function ( $container ): string { + 'api.host' => static function ( $container ): string { $environment = $container->get( 'onboarding.environment' ); /** @@ -61,10 +62,10 @@ return array( * @var Environment $environment */ return $environment->current_environment_is( Environment::SANDBOX ) - ? (string) $container->get('api.sandbox-host') : (string) $container->get('api.production-host'); + ? (string) $container->get( 'api.sandbox-host' ) : (string) $container->get( 'api.production-host' ); }, - 'api.paypal-host' => function( $container ) : string { + 'api.paypal-host' => function( $container ) : string { $environment = $container->get( 'onboarding.environment' ); /** * The current environment. @@ -77,7 +78,7 @@ return array( return 'https://api.paypal.com'; }, - 'api.bearer' => static function ( $container ): Bearer { + 'api.bearer' => static function ( $container ): Bearer { $state = $container->get( 'onboarding.state' ); @@ -103,17 +104,17 @@ return array( $logger ); }, - 'onboarding.state' => function( $container ) : State { + 'onboarding.state' => function( $container ) : State { $environment = $container->get( 'onboarding.environment' ); $settings = $container->get( 'wcgateway.settings' ); return new State( $environment, $settings ); }, - 'onboarding.environment' => function( $container ) : Environment { + 'onboarding.environment' => function( $container ) : Environment { $settings = $container->get( 'wcgateway.settings' ); return new Environment( $settings ); }, - 'onboarding.assets' => function( $container ) : OnboardingAssets { + 'onboarding.assets' => function( $container ) : OnboardingAssets { $state = $container->get( 'onboarding.state' ); $login_seller_endpoint = $container->get( 'onboarding.endpoint.login-seller' ); return new OnboardingAssets( @@ -123,14 +124,14 @@ return array( ); }, - 'onboarding.url' => static function ( $container ): string { + 'onboarding.url' => static function ( $container ): string { return plugins_url( '/modules/ppcp-onboarding/', dirname( __FILE__, 3 ) . '/woocommerce-paypal-commerce-gateway.php' ); }, - 'onboarding.endpoint.login-seller' => static function ( $container ) : LoginSellerEndpoint { + 'onboarding.endpoint.login-seller' => static function ( $container ) : LoginSellerEndpoint { $request_data = $container->get( 'button.request-data' ); $login_seller = $container->get( 'api.endpoint.login-seller' ); @@ -146,11 +147,31 @@ return array( $cache ); }, - 'onboarding.render' => static function ( $container ) : OnboardingRenderer { + 'api.endpoint.partner-referrals-sandbox' => static function ( $container ) : PartnerReferrals { + return new PartnerReferrals( + $container->get( 'api.sandbox-host' ), + $container->get( 'api.bearer' ), + $container->get( 'api.repository.partner-referrals-data' ), + $container->get( 'woocommerce.logger.woocommerce' ) + ); + }, + 'api.endpoint.partner-referrals-production' => static function ( $container ) : PartnerReferrals { + return new PartnerReferrals( + $container->get( 'api.production-host' ), + $container->get( 'api.bearer' ), + $container->get( 'api.repository.partner-referrals-data' ), + $container->get( 'woocommerce.logger.woocommerce' ) + ); + }, + 'onboarding.render' => static function ( $container ) : OnboardingRenderer { - $partner_referrals = $container->get( 'api.endpoint.partner-referrals' ); + $partner_referrals = $container->get( 'api.endpoint.partner-referrals-production' ); + $partner_referrals_sandbox = $container->get( 'api.endpoint.partner-referrals-sandbox' ); + $settings = $container->get( 'wcgateway.settings' ); return new OnboardingRenderer( - $partner_referrals + $settings, + $partner_referrals, + $partner_referrals_sandbox ); }, ); diff --git a/modules/ppcp-onboarding/src/Render/class-onboardingrenderer.php b/modules/ppcp-onboarding/src/Render/class-onboardingrenderer.php index f82c9020e..de4a59358 100644 --- a/modules/ppcp-onboarding/src/Render/class-onboardingrenderer.php +++ b/modules/ppcp-onboarding/src/Render/class-onboardingrenderer.php @@ -11,6 +11,7 @@ namespace WooCommerce\PayPalCommerce\Onboarding\Render; use WooCommerce\PayPalCommerce\ApiClient\Endpoint\PartnerReferrals; use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException; +use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings; /** * Class OnboardingRenderer @@ -18,19 +19,37 @@ use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException; class OnboardingRenderer { /** - * The partner referrals object. + * The settings. + * + * @var Settings + */ + private $settings; + + /** + * The partner referrals object for the production environment. * * @var PartnerReferrals */ - private $partner_referrals; + private $production_partner_referrals; + + /** + * The partner referrals object for the sandbox environment. + * + * @var PartnerReferrals + */ + private $sandbox_partner_referrals; /** * OnboardingRenderer constructor. * - * @param PartnerReferrals $partner_referrals The PartnerReferrals. + * @param Settings $settings The settings. + * @param PartnerReferrals $production_partner_referrals The PartnerReferrals for production. + * @param PartnerReferrals $sandbox_partner_referrals The PartnerReferrals for sandbox. */ - public function __construct( PartnerReferrals $partner_referrals ) { - $this->partner_referrals = $partner_referrals; + public function __construct( Settings $settings, PartnerReferrals $production_partner_referrals, PartnerReferrals $sandbox_partner_referrals ) { + $this->settings = $settings; + $this->production_partner_referrals = $production_partner_referrals; + $this->sandbox_partner_referrals = $sandbox_partner_referrals; } /** @@ -38,32 +57,36 @@ class OnboardingRenderer { */ public function render() { try { - $url = add_query_arg( - array( - 'displayMode' => 'minibrowser', - ), - $this->partner_referrals->signup_link() + $args = array( + 'displayMode' => 'minibrowser', ); + $production_url = add_query_arg( $args, $this->production_partner_referrals->signup_link() ); + $sandbox_url = add_query_arg( $args, $this->sandbox_partner_referrals->signup_link() ); + $this->render_button( + $production_url, + 'connect-to-production', + __( + 'Connect to PayPal', + 'paypal-payments-for-woocommerce' + ) + ); + $this->render_button( + $sandbox_url, + 'connect-to-sandbox', + __( + 'Connect to PayPal Sandbox', + 'paypal-payments-for-woocommerce' + ) + ); + + $script_url = $this->settings->has( 'sandbox_on' ) && $this->settings->get( 'sandbox_on' ) ? + 'https://www.sandbox.paypal.com/webapps/merchantboarding/js/lib/lightbox/partner.js' : 'https://www.paypal.com/webapps/merchantboarding/js/lib/lightbox/partner.js'; ?> - - - - - + + + + + + Date: Thu, 24 Sep 2020 10:29:09 +0300 Subject: [PATCH 06/38] enable loginseller endpoint to switch between sandbox and live --- .../ppcp-onboarding/assets/js/onboarding.js | 4 +- modules/ppcp-onboarding/services.php | 44 ++++++++++++++++--- .../Endpoint/class-loginsellerendpoint.php | 33 +++++++++----- 3 files changed, 63 insertions(+), 18 deletions(-) diff --git a/modules/ppcp-onboarding/assets/js/onboarding.js b/modules/ppcp-onboarding/assets/js/onboarding.js index 4c8b9d5e9..07a7c7915 100644 --- a/modules/ppcp-onboarding/assets/js/onboarding.js +++ b/modules/ppcp-onboarding/assets/js/onboarding.js @@ -1,4 +1,5 @@ function onboardingCallback(authCode, sharedId) { + const sandboxSwitchElement = document.querySelector('#ppcp-sandbox_on') fetch( PayPalCommerceGatewayOnboarding.endpoint, { @@ -10,7 +11,8 @@ function onboardingCallback(authCode, sharedId) { { authCode: authCode, sharedId: sharedId, - nonce: PayPalCommerceGatewayOnboarding.nonce + nonce: PayPalCommerceGatewayOnboarding.nonce, + env: sandboxSwitchElement && sandboxSwitchElement.checked ? 'sandbox' : 'production' } ) } diff --git a/modules/ppcp-onboarding/services.php b/modules/ppcp-onboarding/services.php index 6a99336a1..805004e6e 100644 --- a/modules/ppcp-onboarding/services.php +++ b/modules/ppcp-onboarding/services.php @@ -13,6 +13,7 @@ use Dhii\Data\Container\ContainerInterface; use WooCommerce\PayPalCommerce\ApiClient\Authentication\Bearer; use WooCommerce\PayPalCommerce\ApiClient\Authentication\ConnectBearer; use WooCommerce\PayPalCommerce\ApiClient\Authentication\PayPalBearer; +use WooCommerce\PayPalCommerce\ApiClient\Endpoint\LoginSeller; use WooCommerce\PayPalCommerce\ApiClient\Endpoint\PartnerReferrals; use WooCommerce\PayPalCommerce\ApiClient\Helper\Cache; use WooCommerce\PayPalCommerce\Onboarding\Assets\OnboardingAssets; @@ -65,6 +66,12 @@ return array( ? (string) $container->get( 'api.sandbox-host' ) : (string) $container->get( 'api.production-host' ); }, + 'api.paypal-host-production' => static function( $container ) : string { + return 'https://api.paypal.com'; + }, + 'api.paypal-host-sandbox' => static function( $container ) : string { + return 'https://api.sandbox.paypal.com'; + }, 'api.paypal-host' => function( $container ) : string { $environment = $container->get( 'onboarding.environment' ); /** @@ -73,9 +80,10 @@ return array( * @var Environment $environment */ if ( $environment->current_environment_is( Environment::SANDBOX ) ) { - return 'https://api.sandbox.paypal.com'; + return $container->get( 'api.paypal-host-sandbox' ); } - return 'https://api.paypal.com'; + return $container->get( 'api.paypal-host-production' ); + }, 'api.bearer' => static function ( $container ): Bearer { @@ -131,17 +139,39 @@ return array( ); }, + 'api.endpoint.login-seller-production' => static function ( $container ) : LoginSeller { + + $logger = $container->get( 'woocommerce.logger.woocommerce' ); + return new LoginSeller( + $container->get( 'api.paypal-host-production' ), + $container->get( 'api.partner_merchant_id' ), + $logger + ); + }, + + 'api.endpoint.login-seller-sandbox' => static function ( $container ) : LoginSeller { + + $logger = $container->get( 'woocommerce.logger.woocommerce' ); + return new LoginSeller( + $container->get( 'api.paypal-host-sandbox' ), + $container->get( 'api.partner_merchant_id' ), + $logger + ); + }, + 'onboarding.endpoint.login-seller' => static function ( $container ) : LoginSellerEndpoint { - $request_data = $container->get( 'button.request-data' ); - $login_seller = $container->get( 'api.endpoint.login-seller' ); - $partner_referrals_data = $container->get( 'api.repository.partner-referrals-data' ); - $settings = $container->get( 'wcgateway.settings' ); + $request_data = $container->get( 'button.request-data' ); + $login_seller_production = $container->get( 'api.endpoint.login-seller-production' ); + $login_seller_sandbox = $container->get( 'api.endpoint.login-seller-sandbox' ); + $partner_referrals_data = $container->get( 'api.repository.partner-referrals-data' ); + $settings = $container->get( 'wcgateway.settings' ); $cache = new Cache( 'ppcp-paypal-bearer' ); return new LoginSellerEndpoint( $request_data, - $login_seller, + $login_seller_production, + $login_seller_sandbox, $partner_referrals_data, $settings, $cache diff --git a/modules/ppcp-onboarding/src/Endpoint/class-loginsellerendpoint.php b/modules/ppcp-onboarding/src/Endpoint/class-loginsellerendpoint.php index 4a02c0f8b..0a7393926 100644 --- a/modules/ppcp-onboarding/src/Endpoint/class-loginsellerendpoint.php +++ b/modules/ppcp-onboarding/src/Endpoint/class-loginsellerendpoint.php @@ -33,11 +33,18 @@ class LoginSellerEndpoint implements EndpointInterface { private $request_data; /** - * The Login Seller Endpoint. + * The Login Seller Endpoint for the production environment * * @var LoginSeller */ - private $login_seller_endpoint; + private $login_seller_production; + + /** + * The Login Seller Endpoint for the sandbox environment + * + * @var LoginSeller + */ + private $login_seller_sandbox; /** * The Partner Referrals Data. @@ -64,24 +71,27 @@ class LoginSellerEndpoint implements EndpointInterface { * LoginSellerEndpoint constructor. * * @param RequestData $request_data The Request Data. - * @param LoginSeller $login_seller The Login Seller. + * @param LoginSeller $login_seller_production The Login Seller for the production environment. + * @param LoginSeller $login_seller_sandbox The Login Seller for the sandbox environment. * @param PartnerReferralsData $partner_referrals_data The Partner Referrals Data. * @param Settings $settings The Settings. * @param Cache $cache The Cache. */ public function __construct( RequestData $request_data, - LoginSeller $login_seller, + LoginSeller $login_seller_production, + LoginSeller $login_seller_sandbox, PartnerReferralsData $partner_referrals_data, Settings $settings, Cache $cache ) { - $this->request_data = $request_data; - $this->login_seller_endpoint = $login_seller; - $this->partner_referrals_data = $partner_referrals_data; - $this->settings = $settings; - $this->cache = $cache; + $this->request_data = $request_data; + $this->login_seller_production = $login_seller_production; + $this->login_seller_sandbox = $login_seller_sandbox; + $this->partner_referrals_data = $partner_referrals_data; + $this->settings = $settings; + $this->cache = $cache; } /** @@ -102,13 +112,16 @@ class LoginSellerEndpoint implements EndpointInterface { try { $data = $this->request_data->read_request( $this->nonce() ); - $credentials = $this->login_seller_endpoint->credentials_for( + $is_sandbox = isset( $data['env'] ) && 'sandbox' === $data['env']; + $endpoint = $is_sandbox ? $this->login_seller_sandbox : $this->login_seller_production; + $credentials = $endpoint->credentials_for( $data['sharedId'], $data['authCode'], $this->partner_referrals_data->nonce() ); $this->settings->set( 'client_secret', $credentials->client_secret ); $this->settings->set( 'client_id', $credentials->client_id ); + $this->settings->set( 'sandbox_on', $is_sandbox ); $this->settings->persist(); if ( $this->cache->has( PayPalBearer::CACHE_KEY ) ) { $this->cache->delete( PayPalBearer::CACHE_KEY ); From 9f45ca618fb66c1878dfd8eb9e99096946995f83 Mon Sep 17 00:00:00 2001 From: David Remer Date: Thu, 24 Sep 2020 10:42:20 +0300 Subject: [PATCH 07/38] remove some setting fields from start screen --- modules/ppcp-wc-gateway/services.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/ppcp-wc-gateway/services.php b/modules/ppcp-wc-gateway/services.php index 9c8d348cf..e4ca2c767 100644 --- a/modules/ppcp-wc-gateway/services.php +++ b/modules/ppcp-wc-gateway/services.php @@ -495,7 +495,6 @@ return array( 'description' => __( 'Enable logging of unexpected behavior. This can also log private data and should only be enabled in a development or stage environment.', 'paypal-payments-for-woocommerce' ), 'default' => false, 'screens' => array( - State::STATE_START, State::STATE_PROGRESSIVE, State::STATE_ONBOARDED, ), @@ -509,7 +508,6 @@ return array( 'description' => __( 'If you use your PayPal account with more than one installation, please use a distinct prefix to seperate those installations. Please do not use numbers in your prefix.', 'paypal-payments-for-woocommerce' ), 'default' => 'WC-', 'screens' => array( - State::STATE_START, State::STATE_PROGRESSIVE, State::STATE_ONBOARDED, ), From 1b3061f59a7f1dad9f92992b1938b6c179f74ab2 Mon Sep 17 00:00:00 2001 From: David Remer Date: Thu, 24 Sep 2020 10:42:38 +0300 Subject: [PATCH 08/38] save merchant email when merchant comes back from onboarding --- .../ppcp-wc-gateway/src/Settings/class-settingslistener.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ppcp-wc-gateway/src/Settings/class-settingslistener.php b/modules/ppcp-wc-gateway/src/Settings/class-settingslistener.php index 50ff3feea..015fb94dc 100644 --- a/modules/ppcp-wc-gateway/src/Settings/class-settingslistener.php +++ b/modules/ppcp-wc-gateway/src/Settings/class-settingslistener.php @@ -97,8 +97,9 @@ class SettingsListener { * phpcs:disable WordPress.Security.NonceVerification.Missing * phpcs:disable WordPress.Security.NonceVerification.Recommended */ - if ( isset( $_GET['merchantIdInPayPal'] ) ) { + if ( isset( $_GET['merchantIdInPayPal'] ) && isset( $_GET['merchantId'] ) ) { $this->settings->set( 'merchant_id', sanitize_text_field( wp_unslash( $_GET['merchantIdInPayPal'] ) ) ); + $this->settings->set( 'merchant_email', sanitize_text_field( wp_unslash( $_GET['merchantId'] ) ) ); $this->settings->persist(); } // phpcs:enable WordPress.Security.NonceVerification.Missing From 2679afd819975d7309d1c47d2d234a42c8297ab0 Mon Sep 17 00:00:00 2001 From: David Remer Date: Thu, 24 Sep 2020 10:44:39 +0300 Subject: [PATCH 09/38] keep email input always editable without the need of reset --- modules/ppcp-wc-gateway/services.php | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/modules/ppcp-wc-gateway/services.php b/modules/ppcp-wc-gateway/services.php index e4ca2c767..d86ccdccc 100644 --- a/modules/ppcp-wc-gateway/services.php +++ b/modules/ppcp-wc-gateway/services.php @@ -164,17 +164,6 @@ return array( '' ); - $merchant_email_text = sprintf( - // translators: %1$s is the email address %2$s and %3$s are button tags. - __( - 'You are connected with your email address %1$s. - If you want to change this settings, please click %2$sReset%3$s', - 'paypal-payments-for-woocommerce' - ), - $settings->has( 'merchant_email' ) ? '' . $settings->get( 'merchant_email' ) . '' : '', - '' - ); $fields = array( 'ppcp_onboarding' => array( 'title' => __( 'Connect to PayPal', 'paypal-payments-for-woocommerce' ), @@ -217,19 +206,9 @@ return array( 'default' => '', 'screens' => array( State::STATE_START, - ), - 'requirements' => array(), - 'gateway' => 'paypal', - ), - 'merchant_email_info' => array( - 'title' => __( 'Email address', 'paypal-payments-for-woocommerce' ), - 'type' => 'ppcp-text', - 'text' => $merchant_email_text, - 'screens' => array( State::STATE_PROGRESSIVE, State::STATE_ONBOARDED, ), - 'hidden' => 'merchant_email', 'requirements' => array(), 'gateway' => 'paypal', ), From 5907d03cedfd66f3816941089a01a09e4bb2e27b Mon Sep 17 00:00:00 2001 From: David Remer Date: Thu, 24 Sep 2020 10:46:31 +0300 Subject: [PATCH 10/38] move merchant email into toggle --- .../ppcp-onboarding/assets/css/onboarding.css | 3 ++- modules/ppcp-onboarding/assets/js/settings.js | 1 + modules/ppcp-wc-gateway/services.php | 22 +++++++++---------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/modules/ppcp-onboarding/assets/css/onboarding.css b/modules/ppcp-onboarding/assets/css/onboarding.css index 878a8715d..b2d06a26b 100644 --- a/modules/ppcp-onboarding/assets/css/onboarding.css +++ b/modules/ppcp-onboarding/assets/css/onboarding.css @@ -4,7 +4,8 @@ #field-client_secret, #field-client_id, -#field-merchant_id { +#field-merchant_id, +#field-merchant_email{ display: none; } diff --git a/modules/ppcp-onboarding/assets/js/settings.js b/modules/ppcp-onboarding/assets/js/settings.js index e2ad199e0..3bd7bd494 100644 --- a/modules/ppcp-onboarding/assets/js/settings.js +++ b/modules/ppcp-onboarding/assets/js/settings.js @@ -65,6 +65,7 @@ const groupToggleSelect = (selector, group) => { (event) => { event.preventDefault(); document.querySelector('#field-toggle_manual_input').style.display = 'none'; + document.querySelector('#field-merchant_email').style.display = 'table-row'; document.querySelector('#field-merchant_id').style.display = 'table-row'; document.querySelector('#field-client_id').style.display = 'table-row'; document.querySelector('#field-client_secret').style.display = 'table-row'; diff --git a/modules/ppcp-wc-gateway/services.php b/modules/ppcp-wc-gateway/services.php index d86ccdccc..c81267ca9 100644 --- a/modules/ppcp-wc-gateway/services.php +++ b/modules/ppcp-wc-gateway/services.php @@ -197,13 +197,10 @@ return array( 'requirements' => array(), 'gateway' => 'paypal', ), - 'merchant_email' => array( - 'title' => __( 'Email address', 'paypal-payments-for-woocommerce' ), - 'type' => 'text', - 'required' => true, - 'desc_tip' => true, - 'description' => __( 'The email address of your PayPal account.', 'paypal-payments-for-woocommerce' ), - 'default' => '', + 'toggle_manual_input' => array( + 'type' => 'ppcp-text', + 'title' => __( 'Manual mode', 'paypal-payments-for-woocommerce' ), + 'text' => '', 'screens' => array( State::STATE_START, State::STATE_PROGRESSIVE, @@ -212,10 +209,13 @@ return array( 'requirements' => array(), 'gateway' => 'paypal', ), - 'toggle_manual_input' => array( - 'type' => 'ppcp-text', - 'title' => __( 'Manual mode', 'paypal-payments-for-woocommerce' ), - 'text' => '', + 'merchant_email' => array( + 'title' => __( 'Email address', 'paypal-payments-for-woocommerce' ), + 'type' => 'text', + 'required' => true, + 'desc_tip' => true, + 'description' => __( 'The email address of your PayPal account.', 'paypal-payments-for-woocommerce' ), + 'default' => '', 'screens' => array( State::STATE_START, State::STATE_PROGRESSIVE, From 3281043bc238489de30bb2d868686f4bd0a8c475 Mon Sep 17 00:00:00 2001 From: David Remer Date: Thu, 24 Sep 2020 12:49:57 +0300 Subject: [PATCH 11/38] do not show enable button on start screen --- modules/ppcp-wc-gateway/src/Gateway/class-paypalgateway.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/ppcp-wc-gateway/src/Gateway/class-paypalgateway.php b/modules/ppcp-wc-gateway/src/Gateway/class-paypalgateway.php index 6bb72fa96..10b04a2d3 100644 --- a/modules/ppcp-wc-gateway/src/Gateway/class-paypalgateway.php +++ b/modules/ppcp-wc-gateway/src/Gateway/class-paypalgateway.php @@ -165,7 +165,9 @@ class PayPalGateway extends \WC_Payment_Gateway { 'type' => 'ppcp', ), ); - if ( $this->is_credit_card_tab() ) { + + $should_show_enabled_checkbox = ! $this->is_credit_card_tab() && ( $this->config->has( 'merchant_email' ) && $this->config->get( 'merchant_email' ) ); + if ( ! $should_show_enabled_checkbox ) { unset( $this->form_fields['enabled'] ); } } From 6d8b6bf693883e8ee8cc688b39cbdcf4f0d11c8d Mon Sep 17 00:00:00 2001 From: David Remer Date: Thu, 24 Sep 2020 12:50:35 +0300 Subject: [PATCH 12/38] prevent 'do you want to leave'-alert when redirect occurs through paypal module. --- .../ppcp-onboarding/assets/js/onboarding.js | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/modules/ppcp-onboarding/assets/js/onboarding.js b/modules/ppcp-onboarding/assets/js/onboarding.js index 07a7c7915..54241b447 100644 --- a/modules/ppcp-onboarding/assets/js/onboarding.js +++ b/modules/ppcp-onboarding/assets/js/onboarding.js @@ -28,6 +28,24 @@ function onboardingCallback(authCode, sharedId) { ); } +/** + * Since the PayPal modal will redirect the user a dirty form + * provokes an alert if the user wants to leave the page. Since the user + * needs to toggle the sandbox switch, we disable this dirty state with the + * following workaround for checkboxes. + * + * @param event + */ +const checkBoxOnClick = (event) => { + const value = event.target.checked; + event.preventDefault(); + event.stopPropagation(); + setTimeout( () => { + event.target.checked = value; + },1 + ); +} + const sandboxSwitch = (element) => { const toggleConnectButtons = (showProduction) => { @@ -54,4 +72,11 @@ const sandboxSwitch = (element) => { if (sandboxSwitchElement) { sandboxSwitch(sandboxSwitchElement); } + + document.querySelectorAll('#mainform input[type="checkbox"]').forEach( + (checkbox) => { + checkbox.addEventListener('click', checkBoxOnClick); + } + ); + })(); \ No newline at end of file From b41e760df666128ff04139003f15ef2ad2c35f7d Mon Sep 17 00:00:00 2001 From: David Remer Date: Thu, 24 Sep 2020 13:40:43 +0300 Subject: [PATCH 13/38] fix button toggle, which was prevented from the general checkbox change handler --- .../ppcp-onboarding/assets/js/onboarding.js | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/modules/ppcp-onboarding/assets/js/onboarding.js b/modules/ppcp-onboarding/assets/js/onboarding.js index 54241b447..cc8d8a813 100644 --- a/modules/ppcp-onboarding/assets/js/onboarding.js +++ b/modules/ppcp-onboarding/assets/js/onboarding.js @@ -38,6 +38,9 @@ function onboardingCallback(authCode, sharedId) { */ const checkBoxOnClick = (event) => { const value = event.target.checked; + if (event.target.getAttribute('id') === 'ppcp-sandbox_on') { + toggleConnectButtons(! value); + } event.preventDefault(); event.stopPropagation(); setTimeout( () => { @@ -46,31 +49,20 @@ const checkBoxOnClick = (event) => { ); } -const sandboxSwitch = (element) => { - - const toggleConnectButtons = (showProduction) => { - if (showProduction) { - document.querySelector('#connect-to-production').style.display = ''; - document.querySelector('#connect-to-sandbox').style.display = 'none'; - return; - } - document.querySelector('#connect-to-production').style.display = 'none'; - document.querySelector('#connect-to-sandbox').style.display = ''; +const toggleConnectButtons = (showProduction) => { + if (showProduction) { + document.querySelector('#connect-to-production').style.display = ''; + document.querySelector('#connect-to-sandbox').style.display = 'none'; + return; } - toggleConnectButtons(! element.checked); - - element.addEventListener( - 'change', - (event) => { - toggleConnectButtons(! element.checked); - } - ); -}; + document.querySelector('#connect-to-production').style.display = 'none'; + document.querySelector('#connect-to-sandbox').style.display = ''; +} (() => { const sandboxSwitchElement = document.querySelector('#ppcp-sandbox_on'); if (sandboxSwitchElement) { - sandboxSwitch(sandboxSwitchElement); + toggleConnectButtons(! sandboxSwitchElement.checked); } document.querySelectorAll('#mainform input[type="checkbox"]').forEach( From 8a3ae89d404292cc32ba488cdde5f11532f5ac5d Mon Sep 17 00:00:00 2001 From: David Remer Date: Thu, 24 Sep 2020 13:43:28 +0300 Subject: [PATCH 14/38] codestyle fix --- modules/ppcp-wc-gateway/src/Settings/class-settingslistener.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ppcp-wc-gateway/src/Settings/class-settingslistener.php b/modules/ppcp-wc-gateway/src/Settings/class-settingslistener.php index 015fb94dc..302dfd013 100644 --- a/modules/ppcp-wc-gateway/src/Settings/class-settingslistener.php +++ b/modules/ppcp-wc-gateway/src/Settings/class-settingslistener.php @@ -97,7 +97,7 @@ class SettingsListener { * phpcs:disable WordPress.Security.NonceVerification.Missing * phpcs:disable WordPress.Security.NonceVerification.Recommended */ - if ( isset( $_GET['merchantIdInPayPal'] ) && isset( $_GET['merchantId'] ) ) { + if ( isset( $_GET['merchantIdInPayPal'] ) && isset( $_GET['merchantId'] ) ) { $this->settings->set( 'merchant_id', sanitize_text_field( wp_unslash( $_GET['merchantIdInPayPal'] ) ) ); $this->settings->set( 'merchant_email', sanitize_text_field( wp_unslash( $_GET['merchantId'] ) ) ); $this->settings->persist(); From 8d682afc6c14e584a5e3a6ac0701428993d176a9 Mon Sep 17 00:00:00 2001 From: David Remer Date: Fri, 25 Sep 2020 07:17:48 +0300 Subject: [PATCH 15/38] add new setting fields to differentiate between live/sandbox credentials --- .../ppcp-onboarding/assets/css/onboarding.css | 3 +- modules/ppcp-wc-gateway/services.php | 111 +++++++++++++++--- 2 files changed, 99 insertions(+), 15 deletions(-) diff --git a/modules/ppcp-onboarding/assets/css/onboarding.css b/modules/ppcp-onboarding/assets/css/onboarding.css index afd9c0c14..5d4dd8ea1 100644 --- a/modules/ppcp-onboarding/assets/css/onboarding.css +++ b/modules/ppcp-onboarding/assets/css/onboarding.css @@ -23,7 +23,8 @@ display: unset; } -#field-toggle_manual_input button { +#field-production_toggle_manual_input button, +#field-sandbox_toggle_manual_input button { color: #0073aa; transition-property: border, background, color; transition-duration: .05s; diff --git a/modules/ppcp-wc-gateway/services.php b/modules/ppcp-wc-gateway/services.php index 5c5b79b87..703d7a78e 100644 --- a/modules/ppcp-wc-gateway/services.php +++ b/modules/ppcp-wc-gateway/services.php @@ -181,23 +181,25 @@ return array( 'default' => 0, 'screens' => array( State::STATE_START, + State::STATE_PROGRESSIVE, + State::STATE_ONBOARDED, ), 'requirements' => array(), 'gateway' => 'paypal', ), - 'sandbox_on_info' => array( - 'title' => __( 'Sandbox', 'paypal-payments-for-woocommerce' ), - 'type' => 'ppcp-text', - 'text' => $sandbox_text, + + // Production credentials. + 'credentials_production_heading' => array( + 'heading' => __( 'API', 'paypal-payments-for-woocommerce' ), + 'type' => 'ppcp-heading', 'screens' => array( State::STATE_PROGRESSIVE, State::STATE_ONBOARDED, ), - 'hidden' => 'sandbox_on', 'requirements' => array(), 'gateway' => 'paypal', ), - 'toggle_manual_input' => array( + 'production_toggle_manual_input' => array( 'type' => 'ppcp-text', 'title' => __( 'Manual mode', 'paypal-payments-for-woocommerce' ), 'text' => '', @@ -209,8 +211,8 @@ return array( 'requirements' => array(), 'gateway' => 'paypal', ), - 'merchant_email' => array( - 'title' => __( 'Email address', 'paypal-payments-for-woocommerce' ), + 'merchant_email_production' => array( + 'title' => __( 'Live Email address', 'paypal-payments-for-woocommerce' ), 'type' => 'text', 'required' => true, 'desc_tip' => true, @@ -224,8 +226,8 @@ return array( 'requirements' => array(), 'gateway' => 'paypal', ), - 'merchant_id' => array( - 'title' => __( 'Merchant Id', 'paypal-payments-for-woocommerce' ), + 'merchant_id_production' => array( + 'title' => __( 'Live Merchant Id', 'paypal-payments-for-woocommerce' ), 'type' => 'ppcp-text-input', 'desc_tip' => true, 'description' => __( 'The merchant id of your account ', 'paypal-payments-for-woocommerce' ), @@ -238,8 +240,8 @@ return array( 'requirements' => array(), 'gateway' => 'paypal', ), - 'client_id' => array( - 'title' => __( 'Client Id', 'paypal-payments-for-woocommerce' ), + 'client_id_production' => array( + 'title' => __( 'Live Client Id', 'paypal-payments-for-woocommerce' ), 'type' => 'ppcp-text-input', 'desc_tip' => true, 'description' => __( 'The client id of your api ', 'paypal-payments-for-woocommerce' ), @@ -252,8 +254,89 @@ return array( 'requirements' => array(), 'gateway' => 'paypal', ), - 'client_secret' => array( - 'title' => __( 'Secret Key', 'paypal-payments-for-woocommerce' ), + 'client_secret_production' => array( + 'title' => __( 'Live Secret Key', 'paypal-payments-for-woocommerce' ), + 'type' => 'ppcp-password', + 'desc_tip' => true, + 'description' => __( 'The secret key of your api', 'paypal-payments-for-woocommerce' ), + 'default' => false, + 'screens' => array( + State::STATE_START, + State::STATE_PROGRESSIVE, + State::STATE_ONBOARDED, + ), + 'requirements' => array(), + 'gateway' => 'paypal', + ), + + // Sandbox credentials. + 'credentials_sandbox_heading' => array( + 'heading' => __( 'Sandbox API', 'paypal-payments-for-woocommerce' ), + 'type' => 'ppcp-heading', + 'screens' => array( + State::STATE_PROGRESSIVE, + State::STATE_ONBOARDED, + ), + 'requirements' => array(), + 'gateway' => 'paypal', + ), + 'sandbox_toggle_manual_input' => array( + 'type' => 'ppcp-text', + 'title' => __( 'Manual mode', 'paypal-payments-for-woocommerce' ), + 'text' => '', + 'screens' => array( + State::STATE_START, + State::STATE_PROGRESSIVE, + State::STATE_ONBOARDED, + ), + 'requirements' => array(), + 'gateway' => 'paypal', + ), + 'merchant_email_sandbox' => array( + 'title' => __( 'Sandbox Email address', 'paypal-payments-for-woocommerce' ), + 'type' => 'text', + 'required' => true, + 'desc_tip' => true, + 'description' => __( 'The email address of your PayPal account.', 'paypal-payments-for-woocommerce' ), + 'default' => '', + 'screens' => array( + State::STATE_START, + State::STATE_PROGRESSIVE, + State::STATE_ONBOARDED, + ), + 'requirements' => array(), + 'gateway' => 'paypal', + ), + 'merchant_id_sandbox' => array( + 'title' => __( 'Sandbox Merchant Id', 'paypal-payments-for-woocommerce' ), + 'type' => 'ppcp-text-input', + 'desc_tip' => true, + 'description' => __( 'The merchant id of your account ', 'paypal-payments-for-woocommerce' ), + 'default' => false, + 'screens' => array( + State::STATE_START, + State::STATE_PROGRESSIVE, + State::STATE_ONBOARDED, + ), + 'requirements' => array(), + 'gateway' => 'paypal', + ), + 'client_id_sandbox' => array( + 'title' => __( 'Sandbox Client Id', 'paypal-payments-for-woocommerce' ), + 'type' => 'ppcp-text-input', + 'desc_tip' => true, + 'description' => __( 'The client id of your api ', 'paypal-payments-for-woocommerce' ), + 'default' => false, + 'screens' => array( + State::STATE_START, + State::STATE_PROGRESSIVE, + State::STATE_ONBOARDED, + ), + 'requirements' => array(), + 'gateway' => 'paypal', + ), + 'client_secret_sandbox' => array( + 'title' => __( 'Sandbox Secret Key', 'paypal-payments-for-woocommerce' ), 'type' => 'ppcp-password', 'desc_tip' => true, 'description' => __( 'The secret key of your api', 'paypal-payments-for-woocommerce' ), From 9327b19b7dc9604b4c70c9f121be3a8dd827560f Mon Sep 17 00:00:00 2001 From: David Remer Date: Fri, 25 Sep 2020 09:19:43 +0300 Subject: [PATCH 16/38] add new fields for production and sandbox credentials. Change toggle functionality. Load connect-to-sandbox-button and connect-to-production-button in case credentials are missing --- .../ppcp-onboarding/assets/css/onboarding.css | 24 +- .../ppcp-onboarding/assets/js/onboarding.js | 95 +++++++- modules/ppcp-onboarding/assets/js/settings.js | 11 - .../src/Assets/class-onboardingassets.php | 4 +- .../src/Render/class-onboardingrenderer.php | 38 ++-- .../src/class-onboardingmodule.php | 5 +- modules/ppcp-wc-gateway/services.php | 207 ++++++++++-------- 7 files changed, 238 insertions(+), 146 deletions(-) diff --git a/modules/ppcp-onboarding/assets/css/onboarding.css b/modules/ppcp-onboarding/assets/css/onboarding.css index 5d4dd8ea1..0aa5a0c6b 100644 --- a/modules/ppcp-onboarding/assets/css/onboarding.css +++ b/modules/ppcp-onboarding/assets/css/onboarding.css @@ -2,16 +2,24 @@ display: none; } -#field-client_secret, -#field-client_id, -#field-merchant_id, -#field-merchant_email{ +#field-merchant_email_production, +#field-merchant_id_production, +#field-client_id_production, +#field-client_secret_production, +#field-merchant_email_sandbox, +#field-merchant_id_sandbox, +#field-client_id_sandbox, +#field-client_secret_sandbox{ display: none; } -#field-client_secret.show, -#field-client_id.show, -#field-merchant_id.show, -#field-merchant_email.show { +#field-merchant_email_production.show, +#field-merchant_id_production.show, +#field-client_id_production.show, +#field-client_secret_production.show, +#field-merchant_email_sandbox.show, +#field-merchant_id_sandbox.show, +#field-client_id_sandbox.show, +#field-client_secret_sandbox.show { display: table-row; } diff --git a/modules/ppcp-onboarding/assets/js/onboarding.js b/modules/ppcp-onboarding/assets/js/onboarding.js index cc8d8a813..325a98eb2 100644 --- a/modules/ppcp-onboarding/assets/js/onboarding.js +++ b/modules/ppcp-onboarding/assets/js/onboarding.js @@ -39,7 +39,7 @@ function onboardingCallback(authCode, sharedId) { const checkBoxOnClick = (event) => { const value = event.target.checked; if (event.target.getAttribute('id') === 'ppcp-sandbox_on') { - toggleConnectButtons(! value); + toggleSandboxProduction(! value); } event.preventDefault(); event.stopPropagation(); @@ -49,20 +49,88 @@ const checkBoxOnClick = (event) => { ); } -const toggleConnectButtons = (showProduction) => { +/** + * Toggles the credential input fields. + * + * @param forProduction + */ +const credentialToggle = (forProduction) => { + + const sandboxClassSelectors = [ + '#field-merchant_email_sandbox', + '#field-merchant_id_sandbox', + '#field-client_id_sandbox', + '#field-client_secret_sandbox', + ]; + const productionClassSelectors = [ + '#field-merchant_email_production', + '#field-merchant_id_production', + '#field-client_id_production', + '#field-client_secret_production', + ]; + + const selectors = forProduction ? productionClassSelectors : sandboxClassSelectors; + document.querySelectorAll(selectors.join()).forEach( + (element) => {element.classList.toggle('show')} + ) +} + +/** + * Toggles the visibility of the sandbox/production input fields. + * + * @param showProduction + */ +const toggleSandboxProduction = (showProduction) => { + const productionDisplaySelectors = [ + '#field-credentials_production_heading', + '#field-production_toggle_manual_input', + '#field-ppcp_onboarding_production', + ]; + const productionClassSelectors = [ + '#field-merchant_email_production', + '#field-merchant_id_production', + '#field-client_id_production', + '#field-client_secret_production', + ]; + const sandboxDisplaySelectors = [ + '#field-credentials_sandbox_heading', + '#field-sandbox_toggle_manual_input', + '#field-ppcp_onboarding_sandbox', + ]; + const sandboxClassSelectors = [ + '#field-merchant_email_sandbox', + '#field-merchant_id_sandbox', + '#field-client_id_sandbox', + '#field-client_secret_sandbox', + ]; + if (showProduction) { - document.querySelector('#connect-to-production').style.display = ''; - document.querySelector('#connect-to-sandbox').style.display = 'none'; + document.querySelectorAll(productionDisplaySelectors.join()).forEach( + (element) => {element.style.display = ''} + ) + document.querySelectorAll(sandboxDisplaySelectors.join()).forEach( + (element) => {element.style.display = 'none'} + ) + document.querySelectorAll(sandboxClassSelectors.join()).forEach( + (element) => {element.classList.remove('show')} + ) return; } - document.querySelector('#connect-to-production').style.display = 'none'; - document.querySelector('#connect-to-sandbox').style.display = ''; + document.querySelectorAll(productionDisplaySelectors.join()).forEach( + (element) => {element.style.display = 'none'} + ) + document.querySelectorAll(sandboxDisplaySelectors.join()).forEach( + (element) => {element.style.display = ''} + ) + document.querySelectorAll(productionClassSelectors.join()).forEach( + (element) => {element.classList.remove('show')} + ) } (() => { const sandboxSwitchElement = document.querySelector('#ppcp-sandbox_on'); if (sandboxSwitchElement) { - toggleConnectButtons(! sandboxSwitchElement.checked); + toggleSandboxProduction(! sandboxSwitchElement.checked); } document.querySelectorAll('#mainform input[type="checkbox"]').forEach( @@ -71,4 +139,17 @@ const toggleConnectButtons = (showProduction) => { } ); + document.querySelectorAll('#field-sandbox_toggle_manual_input button, #field-production_toggle_manual_input button').forEach( + (button) => { + button.addEventListener( + 'click', + (event) => { + event.preventDefault(); + const isProduction = event.target.classList.contains('production-toggle'); + credentialToggle(isProduction); + } + ) + } + ) + })(); \ No newline at end of file diff --git a/modules/ppcp-onboarding/assets/js/settings.js b/modules/ppcp-onboarding/assets/js/settings.js index ad403baae..f29926951 100644 --- a/modules/ppcp-onboarding/assets/js/settings.js +++ b/modules/ppcp-onboarding/assets/js/settings.js @@ -60,17 +60,6 @@ const groupToggleSelect = (selector, group) => { } (() => { - document.querySelector('#field-toggle_manual_input').addEventListener( - 'click', - (event) => { - event.preventDefault(); - document.querySelector('#field-toggle_manual_input').classList.toggle('show'); - document.querySelector('#field-merchant_id').classList.toggle('show'); - document.querySelector('#field-merchant_email').classList.toggle('show'); - document.querySelector('#field-client_id').classList.toggle('show'); - document.querySelector('#field-client_secret').classList.toggle('show'); - } - ) groupToggle( '#ppcp-button_enabled', diff --git a/modules/ppcp-onboarding/src/Assets/class-onboardingassets.php b/modules/ppcp-onboarding/src/Assets/class-onboardingassets.php index 0744db2c6..2fd30de37 100644 --- a/modules/ppcp-onboarding/src/Assets/class-onboardingassets.php +++ b/modules/ppcp-onboarding/src/Assets/class-onboardingassets.php @@ -132,8 +132,6 @@ class OnboardingAssets { if ( 'ppcp-gateway' !== $current_section ) { return false; } - - $should_render = $this->state->current_state() === State::STATE_START; - return $should_render; + return true; } } diff --git a/modules/ppcp-onboarding/src/Render/class-onboardingrenderer.php b/modules/ppcp-onboarding/src/Render/class-onboardingrenderer.php index de4a59358..2fe2e14d2 100644 --- a/modules/ppcp-onboarding/src/Render/class-onboardingrenderer.php +++ b/modules/ppcp-onboarding/src/Render/class-onboardingrenderer.php @@ -54,34 +54,26 @@ class OnboardingRenderer { /** * Renders the "Connect to PayPal" button. + * + * @param bool $is_production Whether the production or sandbox button should be rendered. */ - public function render() { + public function render( bool $is_production ) { try { - $args = array( + $args = array( 'displayMode' => 'minibrowser', ); - $production_url = add_query_arg( $args, $this->production_partner_referrals->signup_link() ); - $sandbox_url = add_query_arg( $args, $this->sandbox_partner_referrals->signup_link() ); - $this->render_button( - $production_url, - 'connect-to-production', - __( - 'Connect to PayPal', - 'paypal-payments-for-woocommerce' - ) - ); - $this->render_button( - $sandbox_url, - 'connect-to-sandbox', - __( - 'Connect to PayPal Sandbox', - 'paypal-payments-for-woocommerce' - ) - ); - $script_url = $this->settings->has( 'sandbox_on' ) && $this->settings->get( 'sandbox_on' ) ? - 'https://www.sandbox.paypal.com/webapps/merchantboarding/js/lib/lightbox/partner.js' : 'https://www.paypal.com/webapps/merchantboarding/js/lib/lightbox/partner.js'; - ?> + $url = $is_production ? $this->production_partner_referrals->signup_link() : $this->sandbox_partner_referrals->signup_link(); + $url = add_query_arg( $args, $url ); + $id = $is_production ? 'connect-to-production' : 'connect-to-sandbox'; + $label = $is_production ? __( 'Connect to PayPal', 'paypal-payments-for-woocommerce' ) : __( 'Connect to PayPal Sandbox', 'paypal-payments-for-woocommerce' ); + $this->render_button( + $url, + $id, + $label + ); + + $script_url = 'https://www.paypal.com/webapps/merchantboarding/js/lib/lightbox/partner.js'; ?>