From 0faeb5fd6b3041252a8c28a0afd124fed0793958 Mon Sep 17 00:00:00 2001
From: Philipp Stracker
Date: Wed, 30 Oct 2024 16:52:06 +0100
Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Separate=20eligibility=20f?=
=?UTF-8?q?lags=20from=20user=20input?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../resources/js/data/onboarding/actions.js | 2 +-
.../resources/js/data/onboarding/reducer.js | 14 ++++-
.../resources/js/data/onboarding/selectors.js | 6 ++-
.../src/Data/OnboardingProfile.php | 54 +++++++------------
.../src/Endpoint/OnboardingRestEndpoint.php | 41 +++++++++-----
5 files changed, 67 insertions(+), 50 deletions(-)
diff --git a/modules/ppcp-settings/resources/js/data/onboarding/actions.js b/modules/ppcp-settings/resources/js/data/onboarding/actions.js
index 6ac070d3a..44fb37667 100644
--- a/modules/ppcp-settings/resources/js/data/onboarding/actions.js
+++ b/modules/ppcp-settings/resources/js/data/onboarding/actions.js
@@ -32,7 +32,7 @@ export const setIsSaving = ( isSaving ) => {
/**
* Persistent. Set the full onboarding details, usually during app initialization.
*
- * @param {Object} payload
+ * @param {{data: {}, flags?: {}}} payload
* @return {{type: string, payload}} The action.
*/
export const setOnboardingDetails = ( payload ) => {
diff --git a/modules/ppcp-settings/resources/js/data/onboarding/reducer.js b/modules/ppcp-settings/resources/js/data/onboarding/reducer.js
index e349d1f14..b932b3b9a 100644
--- a/modules/ppcp-settings/resources/js/data/onboarding/reducer.js
+++ b/modules/ppcp-settings/resources/js/data/onboarding/reducer.js
@@ -3,6 +3,8 @@ import ACTION_TYPES from './action-types';
const defaultState = {
isReady: false,
isSaving: false,
+
+ // Data persisted to the server.
data: {
completed: false,
step: 0,
@@ -10,6 +12,10 @@ const defaultState = {
useManualConnection: false,
clientId: '',
clientSecret: '',
+ },
+
+ // Read only values, provided by the server.
+ flags: {
canUseCasualSelling: false,
canUseVaulting: false,
canUseCardPayments: false,
@@ -49,7 +55,13 @@ export const onboardingReducer = (
// Persistent data.
case ACTION_TYPES.SET_ONBOARDING_DETAILS:
- return setPersistent( action.payload );
+ const newState = setPersistent( action.payload.data );
+
+ if ( action.payload.flags ) {
+ newState.flags = { ...newState.flags, ...action.payload.flags };
+ }
+
+ return newState;
case ACTION_TYPES.SET_ONBOARDING_COMPLETED:
return setPersistent( { completed: action.completed } );
diff --git a/modules/ppcp-settings/resources/js/data/onboarding/selectors.js b/modules/ppcp-settings/resources/js/data/onboarding/selectors.js
index 357ef963b..b7721b992 100644
--- a/modules/ppcp-settings/resources/js/data/onboarding/selectors.js
+++ b/modules/ppcp-settings/resources/js/data/onboarding/selectors.js
@@ -13,6 +13,10 @@ export const getPersistentData = ( state ) => {
};
export const getTransientData = ( state ) => {
- const { data, ...transientState } = getOnboardingState( state );
+ const { data, flags, ...transientState } = getOnboardingState( state );
return transientState || EMPTY_OBJ;
};
+
+export const getFlags = ( state ) => {
+ return getOnboardingState( state ).flags || EMPTY_OBJ;
+};
diff --git a/modules/ppcp-settings/src/Data/OnboardingProfile.php b/modules/ppcp-settings/src/Data/OnboardingProfile.php
index 9f4f2ce2b..b0f4b5121 100644
--- a/modules/ppcp-settings/src/Data/OnboardingProfile.php
+++ b/modules/ppcp-settings/src/Data/OnboardingProfile.php
@@ -29,6 +29,13 @@ class OnboardingProfile extends AbstractDataModel {
*/
protected const OPTION_KEY = 'woocommerce-ppcp-data-onboarding';
+ /**
+ * List of customization flags, provided by the server (read-only).
+ *
+ * @var array
+ */
+ protected array $flags = array();
+
/**
* Constructor.
*
@@ -45,9 +52,9 @@ class OnboardingProfile extends AbstractDataModel {
) {
parent::__construct();
- $this->data['can_use_casual_selling'] = $can_use_casual_selling;
- $this->data['can_use_vaulting'] = $can_use_vaulting;
- $this->data['can_use_card_payments'] = $can_use_card_payments;
+ $this->flags['can_use_casual_selling'] = $can_use_casual_selling;
+ $this->flags['can_use_vaulting'] = $can_use_vaulting;
+ $this->flags['can_use_card_payments'] = $can_use_card_payments;
}
/**
@@ -57,15 +64,12 @@ class OnboardingProfile extends AbstractDataModel {
*/
protected function get_defaults() : array {
return array(
- 'completed' => false,
- 'step' => 0,
- 'use_sandbox' => false,
- 'use_manual_connection' => false,
- 'client_id' => '',
- 'client_secret' => '',
- 'can_use_casual_selling' => null,
- 'can_use_vaulting' => null,
- 'can_use_card_payments' => null,
+ 'completed' => false,
+ 'step' => 0,
+ 'use_sandbox' => false,
+ 'use_manual_connection' => false,
+ 'client_id' => '',
+ 'client_secret' => '',
);
}
@@ -180,29 +184,11 @@ class OnboardingProfile extends AbstractDataModel {
}
/**
- * Gets whether casual selling can be used.
+ * Returns the list of read-only customization flags
*
- * @return bool
+ * @return array
*/
- public function get_can_use_casual_selling() : bool {
- return (bool) $this->data['can_use_casual_selling'];
- }
-
- /**
- * Gets whether vaulting can be used.
- *
- * @return bool
- */
- public function get_can_use_vaulting() : bool {
- return (bool) $this->data['can_use_vaulting'];
- }
-
- /**
- * Gets whether Credit Card payments can be used.
- *
- * @return bool
- */
- public function get_can_use_card_payments() : bool {
- return (bool) $this->data['can_use_card_payments'];
+ public function get_flags() : array {
+ return $this->flags;
}
}
diff --git a/modules/ppcp-settings/src/Endpoint/OnboardingRestEndpoint.php b/modules/ppcp-settings/src/Endpoint/OnboardingRestEndpoint.php
index 6e5e47bb5..bd8e57eee 100644
--- a/modules/ppcp-settings/src/Endpoint/OnboardingRestEndpoint.php
+++ b/modules/ppcp-settings/src/Endpoint/OnboardingRestEndpoint.php
@@ -41,41 +41,46 @@ class OnboardingRestEndpoint extends RestEndpoint {
* @var array
*/
private array $field_map = array(
- 'completed' => array(
+ 'completed' => array(
'js_name' => 'completed',
'sanitize' => 'to_boolean',
),
- 'step' => array(
+ 'step' => array(
'js_name' => 'step',
'sanitize' => 'to_number',
),
- 'use_sandbox' => array(
+ 'use_sandbox' => array(
'js_name' => 'useSandbox',
'sanitize' => 'to_boolean',
),
- 'use_manual_connection' => array(
+ 'use_manual_connection' => array(
'js_name' => 'useManualConnection',
'sanitize' => 'to_boolean',
),
- 'client_id' => array(
+ 'client_id' => array(
'js_name' => 'clientId',
'sanitize' => 'sanitize_text_field',
),
- 'client_secret' => array(
+ 'client_secret' => array(
'js_name' => 'clientSecret',
'sanitize' => 'sanitize_text_field',
),
+ );
+
+ /**
+ * Map the internal flags to JS names.
+ *
+ * @var array
+ */
+ private array $flag_map = array(
'can_use_casual_selling' => array(
- 'js_name' => 'canUseCasualSelling',
- 'sanitize' => 'read_only',
+ 'js_name' => 'canUseCasualSelling',
),
'can_use_vaulting' => array(
- 'js_name' => 'canUseVaulting',
- 'sanitize' => 'read_only',
+ 'js_name' => 'canUseVaulting',
),
'can_use_card_payments' => array(
- 'js_name' => 'canUseCardPayments',
- 'sanitize' => 'read_only',
+ 'js_name' => 'canUseCardPayments',
),
);
@@ -128,7 +133,17 @@ class OnboardingRestEndpoint extends RestEndpoint {
$this->field_map
);
- return rest_ensure_response( $js_data );
+ $js_flags = $this->sanitize_for_javascript(
+ $this->profile->get_flags(),
+ $this->flag_map
+ );
+
+ return rest_ensure_response(
+ array(
+ 'data' => $js_data,
+ 'flags' => $js_flags,
+ )
+ );
}
/**