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, + ) + ); } /**