woocommerce/plugins/woocommerce-blocks/assets/js/base/context/cart-checkout/checkout-state/reducer.js

236 lines
5.4 KiB
JavaScript
Raw Normal View History

/**
* External dependencies
*/
import { decodeEntities } from '@wordpress/html-entities';
/**
* Internal dependencies
*/
import { TYPES, DEFAULT_STATE, STATUS } from './constants';
const {
SET_PRISTINE,
Refactor checkout status and event emitters to support stripe intents and more complex payment methods. (https://github.com/woocommerce/woocommerce-blocks/pull/2189) * initial mapping out of stripe payment intents * rename checkout processing statuses to be clearer * Add new status and refactor checkout complete behaviour. * Make sure payment result data is included in checkout processing response * add payment intent handling Still testing * make sure promise is returned * include site url with endpoint * modify setComplete status to optionally receive redirectUrl for changing in state at the same time as setting status * fix typo in property retrieval * add error handling for after checkout processing event * add notices area for payment methods * implement error handling for stripe intents * hook into stripe error processing and include error in payment response * clear notices so they don’t show in block and merge payment details * add notice handling to payment context * modify error processing in checkout processor * handle errors with fallback in checkout state context * hook into after processing for stripe cc error handling * set checkout to idle status if before processing emitters result in error * Add emit response type-defs and normalize expectations for observer responses * improve doc block * switch checkoutIsComplete check to checkoutAfterProcessing for payment complete status change * remove unneeded event emitters and consolidate some logic * fix idle status set logic
2020-04-14 16:52:23 +00:00
SET_IDLE,
SET_PROCESSING,
Refactor checkout status and event emitters to support stripe intents and more complex payment methods. (https://github.com/woocommerce/woocommerce-blocks/pull/2189) * initial mapping out of stripe payment intents * rename checkout processing statuses to be clearer * Add new status and refactor checkout complete behaviour. * Make sure payment result data is included in checkout processing response * add payment intent handling Still testing * make sure promise is returned * include site url with endpoint * modify setComplete status to optionally receive redirectUrl for changing in state at the same time as setting status * fix typo in property retrieval * add error handling for after checkout processing event * add notices area for payment methods * implement error handling for stripe intents * hook into stripe error processing and include error in payment response * clear notices so they don’t show in block and merge payment details * add notice handling to payment context * modify error processing in checkout processor * handle errors with fallback in checkout state context * hook into after processing for stripe cc error handling * set checkout to idle status if before processing emitters result in error * Add emit response type-defs and normalize expectations for observer responses * improve doc block * switch checkoutIsComplete check to checkoutAfterProcessing for payment complete status change * remove unneeded event emitters and consolidate some logic * fix idle status set logic
2020-04-14 16:52:23 +00:00
SET_BEFORE_PROCESSING,
SET_AFTER_PROCESSING,
SET_PROCESSING_RESPONSE,
SET_REDIRECT_URL,
SET_COMPLETE,
SET_HAS_ERROR,
SET_NO_ERROR,
INCREMENT_CALCULATING,
DECREMENT_CALCULATING,
SET_CUSTOMER_ID,
SET_ORDER_ID,
SET_ORDER_NOTES,
Support "create account" option in checkout block (https://github.com/woocommerce/woocommerce-blocks/pull/2851) * prototype 'create account' checkbox in checkout block * expose store config for generating password/username to blocks: + use FILTER_VALIDATE_BOOLEAN instead of hard-coded `yes` * stub out signup form in checkout block * context / provider to store checkout signup form data * revert signup form - checkout block will always generate username etc * persist signup checkbox in checkout state & pass to checkout API * add `create_account` param to order API, fix name in client POST * handle creating user account as part of order (first cut) * ensure the order is associated with the new customer * only show 'create account' checkbox when appropriate (guest checkout) * remove unnecessary username/password variables * refactor account-creation logic into functions: - clarify inputs and outputs - use RouteException for error handling - use woo options directly, avoid dependency on WC_Checkout * update "email exists" error message to use existing error message text * handle all known errors from wc_create_new_customer + use core message * only show "create account" checkbox to shopper when necessary: - if guest checkout is disabled, user must create account - not optional * only show "create account" if account creation is optional: - fixes incorrect logic in previous commit - add some comments to clarify * fix create account logic in API when checkout requires account: - use correct woo setting option name - reverse logic to match option = allow guest false means registration required * strip html tags from create account error messages * temporarily force enable autogenerate user/pass in new account API * fix rebase errors * add new allowCreateAccount attribute in checkout block * show/hide `Create account` checkbox dependent on block attribute: - previously was dependent on store setting * new create user API, with set initial password email (first cut): - use core register_new_user for creating the user - this triggers core "set new password" email - generate username using logic lifted from WC core - rough cut, lots to tidy/polish here * remove alternative/unused create account function * set `Customer` role for signups during checkout * eslint fix - switch case break * remove comments that mirror code & might go stale * tidy func comment * remove unused function * use store setting `allow signup` for default value of new block option * refactor order signup logic to service class first cut: - new CreateAccount service - hook up via custom action (for now at least) - paste over existing create account logic (temporary - will be replaced) * adapt wc_create_new_customer logic in CreateAccount service (WIP) * set default_password_nag on new account + throw instead of WP_Error * rename `createAccount` => `shouldCreateAccount` to clarify meaning * fix checkout block - renamed `shouldCreateAccount` (missed in prev commit) * prototype sending alternative email template for checkout signup * add magic link to set password to blocks new account html email * tidy up new account email templates - set password link, subject/heading * use same id so merchant setting tweaks apply to our new improved email * remove logging * code tidies in CreateAccount service: - remove unnecessary constructor - type-hint in should_create_customer_account - streamline logic in should_create_customer_account - remove unnecessary `empty` check - add comments to illuminate different use-cases handled by should_create_customer_account * don't provide password to new account email templates (no longer used) * declare dependencies in root namespace * code tidies on new account email class: - correct namespace and camelcase name - declare class in file, don't instantiate; instantiate in client code (CreateAccount service) when used - no require/file import, use `use` * move CustomerNewEmail to folder matching namespace * use Package->get_path for email template paths: - CreateAccount service now depends on Package - CreateAccount passes Package to email class so it can use `get_path` - note: CustomerNewAccount is not registered with DI container as it needs to be instantiated after Woo init (for `WC_Email`) - shift email templates to {plugin}/templates, consistent with WP convention * call CreateAccount::from_order_request directly, no custom hook: - custom hook is not appropriate as we may not want to allow extensibility in this way - TBD * add appropriate margin above create account checkbox * remove unnecessary direct-access protection * generalise name of error-handling method * simplify CustomerNewAccount - instantiate directly, when needed * remove unused new_account_email member - now instantiated on demand * numerous fixes and updates due to rebase changes * fix typo in name of CustomerNewAccount php file (missing `n`) * experiment - link to lost-password form in my-account (prototype branded screen) * Revert "experiment - link to lost-password form in my-account (prototype branded screen)" This reverts commit e1dc6dd5e9f0218ede81da92188d813c2d0856d9. * feature gate CreateAccount service init to dev build only + + remove stale comment * feature gate front end "Create account" checkbox to feature plugin only * feature gate editor "allow signup" option to dev build only * feature gate checkout api create account - dev build only * tweak feature gating PHP logic so it's robust: - all PHP feature gating is in the service class - all publicly-available methods return early if feature gate off - Checkout rest API transparently calls service - no explicit feature gate at API level * ensure frontend/editor features are feature gated (isExperimentalBuild is a function) * feature gate value of checkoutAllowsSignup - can only be true in feature plugin * fix a / an typo in comment Co-authored-by: Albert Juhé Lluveras <contact@albertjuhe.com> * remove commented code * hello world unit test (doesn't test anything yet) * add a command for running unit tests when container already up: - this should probably move to another PR/branch * basic tests of core logic in CreateAccount service * import isExperimentalBuild direct: - import from alias package was causing an issue, likely a dependency cycle * refactor from_order_request to return new user ID so it's easier to test * test creating a customer from an order + rest request: - i.e. a full end-to-end integration test * delete redundant test and tidy comments * generalise test to provider format * refactor create-dup-user err test to use same approach as success test * add test for when user should not be created * don't hard-code options in "create" test, remove redundant provider in no-account-requested test * de-generalise "user already signed up" test * add test for malformed email * flesh out & comment successful signup tests * flesh out "invalid email" tests * clarify no account requested test comment * remove phpunit:quick - I don't think it's needed * add comment explaining this is an integration test * experiment – disable feature flag, is this why the tests are failing? * revert test commit - restore feature gate (experimental flag) * skip all tests if CreateAccount is disabled due to feature flag * d'oh - expose CreateAccount:is_feature_enabled so can be used in tests * add jsdoc for checkout-state shouldCreateAccount field * remove unnecessary comment + fix whitespace/indentation * simulate logged-out user for createaccount signup tests * use a single, compound if statement for early return (review nitpick) * don't hide `checkoutAllowsSignup` store setting behind feature flag: - the feature flag should be used to enable/disable behaviour - it's dangerous to adjust store settings/options based on feature flag * rejig tests so they require woocommerce_blocks_phase==3: - make feature gate method private to avoid exposing - remove feature flag check & test skip for other builds - set blocks phase in travis config * remove redundant user-logout in test setup - cleaner to just require this * use WP function bracket style (same line) Co-authored-by: Darren Ethier <darren@roughsmootheng.in> Co-authored-by: Albert Juhé Lluveras <contact@albertjuhe.com>
2020-10-01 02:07:16 +00:00
SET_SHOULD_CREATE_ACCOUNT,
} = TYPES;
Refactor checkout status and event emitters to support stripe intents and more complex payment methods. (https://github.com/woocommerce/woocommerce-blocks/pull/2189) * initial mapping out of stripe payment intents * rename checkout processing statuses to be clearer * Add new status and refactor checkout complete behaviour. * Make sure payment result data is included in checkout processing response * add payment intent handling Still testing * make sure promise is returned * include site url with endpoint * modify setComplete status to optionally receive redirectUrl for changing in state at the same time as setting status * fix typo in property retrieval * add error handling for after checkout processing event * add notices area for payment methods * implement error handling for stripe intents * hook into stripe error processing and include error in payment response * clear notices so they don’t show in block and merge payment details * add notice handling to payment context * modify error processing in checkout processor * handle errors with fallback in checkout state context * hook into after processing for stripe cc error handling * set checkout to idle status if before processing emitters result in error * Add emit response type-defs and normalize expectations for observer responses * improve doc block * switch checkoutIsComplete check to checkoutAfterProcessing for payment complete status change * remove unneeded event emitters and consolidate some logic * fix idle status set logic
2020-04-14 16:52:23 +00:00
const {
PRISTINE,
IDLE,
PROCESSING,
BEFORE_PROCESSING,
AFTER_PROCESSING,
COMPLETE,
} = STATUS;
/**
* Prepares the payment_result data from the server checkout endpoint response.
*
* @param {Object} data The value of `payment_result` from the checkout
* processing endpoint response.
* @param {string} data.message If there was a general error message it will appear
* on this property.
Refactor checkout status and event emitters to support stripe intents and more complex payment methods. (https://github.com/woocommerce/woocommerce-blocks/pull/2189) * initial mapping out of stripe payment intents * rename checkout processing statuses to be clearer * Add new status and refactor checkout complete behaviour. * Make sure payment result data is included in checkout processing response * add payment intent handling Still testing * make sure promise is returned * include site url with endpoint * modify setComplete status to optionally receive redirectUrl for changing in state at the same time as setting status * fix typo in property retrieval * add error handling for after checkout processing event * add notices area for payment methods * implement error handling for stripe intents * hook into stripe error processing and include error in payment response * clear notices so they don’t show in block and merge payment details * add notice handling to payment context * modify error processing in checkout processor * handle errors with fallback in checkout state context * hook into after processing for stripe cc error handling * set checkout to idle status if before processing emitters result in error * Add emit response type-defs and normalize expectations for observer responses * improve doc block * switch checkoutIsComplete check to checkoutAfterProcessing for payment complete status change * remove unneeded event emitters and consolidate some logic * fix idle status set logic
2020-04-14 16:52:23 +00:00
* @param {string} data.payment_status The payment status. One of 'success', 'failure',
* 'pending', 'error'.
* @param {Array<Object>} data.payment_details An array of Objects with a 'key' property that is a
* string and value property that is a string. These are
* converted to a flat object where the key becomes the
* object property and value the property value.
*
* @return {Object} A new object with 'paymentStatus', and 'paymentDetails' as the properties.
*/
export const prepareResponseData = ( data ) => {
const responseData = {
message: data?.message || '',
Refactor checkout status and event emitters to support stripe intents and more complex payment methods. (https://github.com/woocommerce/woocommerce-blocks/pull/2189) * initial mapping out of stripe payment intents * rename checkout processing statuses to be clearer * Add new status and refactor checkout complete behaviour. * Make sure payment result data is included in checkout processing response * add payment intent handling Still testing * make sure promise is returned * include site url with endpoint * modify setComplete status to optionally receive redirectUrl for changing in state at the same time as setting status * fix typo in property retrieval * add error handling for after checkout processing event * add notices area for payment methods * implement error handling for stripe intents * hook into stripe error processing and include error in payment response * clear notices so they don’t show in block and merge payment details * add notice handling to payment context * modify error processing in checkout processor * handle errors with fallback in checkout state context * hook into after processing for stripe cc error handling * set checkout to idle status if before processing emitters result in error * Add emit response type-defs and normalize expectations for observer responses * improve doc block * switch checkoutIsComplete check to checkoutAfterProcessing for payment complete status change * remove unneeded event emitters and consolidate some logic * fix idle status set logic
2020-04-14 16:52:23 +00:00
paymentStatus: data.payment_status,
paymentDetails: {},
};
if ( Array.isArray( data.payment_details ) ) {
data.payment_details.forEach( ( { key, value } ) => {
responseData.paymentDetails[ key ] = decodeEntities( value );
Refactor checkout status and event emitters to support stripe intents and more complex payment methods. (https://github.com/woocommerce/woocommerce-blocks/pull/2189) * initial mapping out of stripe payment intents * rename checkout processing statuses to be clearer * Add new status and refactor checkout complete behaviour. * Make sure payment result data is included in checkout processing response * add payment intent handling Still testing * make sure promise is returned * include site url with endpoint * modify setComplete status to optionally receive redirectUrl for changing in state at the same time as setting status * fix typo in property retrieval * add error handling for after checkout processing event * add notices area for payment methods * implement error handling for stripe intents * hook into stripe error processing and include error in payment response * clear notices so they don’t show in block and merge payment details * add notice handling to payment context * modify error processing in checkout processor * handle errors with fallback in checkout state context * hook into after processing for stripe cc error handling * set checkout to idle status if before processing emitters result in error * Add emit response type-defs and normalize expectations for observer responses * improve doc block * switch checkoutIsComplete check to checkoutAfterProcessing for payment complete status change * remove unneeded event emitters and consolidate some logic * fix idle status set logic
2020-04-14 16:52:23 +00:00
} );
}
return responseData;
};
/**
* Reducer for the checkout state
*
* @param {Object} state Current state.
* @param {Object} action Incoming action object.
* @param {string} action.url URL passed in.
* @param {string} action.type Type of action.
* @param {string} action.customerId Customer ID.
* @param {string} action.orderId Order ID.
* @param {Array} action.orderNotes Order notes.
Support "create account" option in checkout block (https://github.com/woocommerce/woocommerce-blocks/pull/2851) * prototype 'create account' checkbox in checkout block * expose store config for generating password/username to blocks: + use FILTER_VALIDATE_BOOLEAN instead of hard-coded `yes` * stub out signup form in checkout block * context / provider to store checkout signup form data * revert signup form - checkout block will always generate username etc * persist signup checkbox in checkout state & pass to checkout API * add `create_account` param to order API, fix name in client POST * handle creating user account as part of order (first cut) * ensure the order is associated with the new customer * only show 'create account' checkbox when appropriate (guest checkout) * remove unnecessary username/password variables * refactor account-creation logic into functions: - clarify inputs and outputs - use RouteException for error handling - use woo options directly, avoid dependency on WC_Checkout * update "email exists" error message to use existing error message text * handle all known errors from wc_create_new_customer + use core message * only show "create account" checkbox to shopper when necessary: - if guest checkout is disabled, user must create account - not optional * only show "create account" if account creation is optional: - fixes incorrect logic in previous commit - add some comments to clarify * fix create account logic in API when checkout requires account: - use correct woo setting option name - reverse logic to match option = allow guest false means registration required * strip html tags from create account error messages * temporarily force enable autogenerate user/pass in new account API * fix rebase errors * add new allowCreateAccount attribute in checkout block * show/hide `Create account` checkbox dependent on block attribute: - previously was dependent on store setting * new create user API, with set initial password email (first cut): - use core register_new_user for creating the user - this triggers core "set new password" email - generate username using logic lifted from WC core - rough cut, lots to tidy/polish here * remove alternative/unused create account function * set `Customer` role for signups during checkout * eslint fix - switch case break * remove comments that mirror code & might go stale * tidy func comment * remove unused function * use store setting `allow signup` for default value of new block option * refactor order signup logic to service class first cut: - new CreateAccount service - hook up via custom action (for now at least) - paste over existing create account logic (temporary - will be replaced) * adapt wc_create_new_customer logic in CreateAccount service (WIP) * set default_password_nag on new account + throw instead of WP_Error * rename `createAccount` => `shouldCreateAccount` to clarify meaning * fix checkout block - renamed `shouldCreateAccount` (missed in prev commit) * prototype sending alternative email template for checkout signup * add magic link to set password to blocks new account html email * tidy up new account email templates - set password link, subject/heading * use same id so merchant setting tweaks apply to our new improved email * remove logging * code tidies in CreateAccount service: - remove unnecessary constructor - type-hint in should_create_customer_account - streamline logic in should_create_customer_account - remove unnecessary `empty` check - add comments to illuminate different use-cases handled by should_create_customer_account * don't provide password to new account email templates (no longer used) * declare dependencies in root namespace * code tidies on new account email class: - correct namespace and camelcase name - declare class in file, don't instantiate; instantiate in client code (CreateAccount service) when used - no require/file import, use `use` * move CustomerNewEmail to folder matching namespace * use Package->get_path for email template paths: - CreateAccount service now depends on Package - CreateAccount passes Package to email class so it can use `get_path` - note: CustomerNewAccount is not registered with DI container as it needs to be instantiated after Woo init (for `WC_Email`) - shift email templates to {plugin}/templates, consistent with WP convention * call CreateAccount::from_order_request directly, no custom hook: - custom hook is not appropriate as we may not want to allow extensibility in this way - TBD * add appropriate margin above create account checkbox * remove unnecessary direct-access protection * generalise name of error-handling method * simplify CustomerNewAccount - instantiate directly, when needed * remove unused new_account_email member - now instantiated on demand * numerous fixes and updates due to rebase changes * fix typo in name of CustomerNewAccount php file (missing `n`) * experiment - link to lost-password form in my-account (prototype branded screen) * Revert "experiment - link to lost-password form in my-account (prototype branded screen)" This reverts commit e1dc6dd5e9f0218ede81da92188d813c2d0856d9. * feature gate CreateAccount service init to dev build only + + remove stale comment * feature gate front end "Create account" checkbox to feature plugin only * feature gate editor "allow signup" option to dev build only * feature gate checkout api create account - dev build only * tweak feature gating PHP logic so it's robust: - all PHP feature gating is in the service class - all publicly-available methods return early if feature gate off - Checkout rest API transparently calls service - no explicit feature gate at API level * ensure frontend/editor features are feature gated (isExperimentalBuild is a function) * feature gate value of checkoutAllowsSignup - can only be true in feature plugin * fix a / an typo in comment Co-authored-by: Albert Juhé Lluveras <contact@albertjuhe.com> * remove commented code * hello world unit test (doesn't test anything yet) * add a command for running unit tests when container already up: - this should probably move to another PR/branch * basic tests of core logic in CreateAccount service * import isExperimentalBuild direct: - import from alias package was causing an issue, likely a dependency cycle * refactor from_order_request to return new user ID so it's easier to test * test creating a customer from an order + rest request: - i.e. a full end-to-end integration test * delete redundant test and tidy comments * generalise test to provider format * refactor create-dup-user err test to use same approach as success test * add test for when user should not be created * don't hard-code options in "create" test, remove redundant provider in no-account-requested test * de-generalise "user already signed up" test * add test for malformed email * flesh out & comment successful signup tests * flesh out "invalid email" tests * clarify no account requested test comment * remove phpunit:quick - I don't think it's needed * add comment explaining this is an integration test * experiment – disable feature flag, is this why the tests are failing? * revert test commit - restore feature gate (experimental flag) * skip all tests if CreateAccount is disabled due to feature flag * d'oh - expose CreateAccount:is_feature_enabled so can be used in tests * add jsdoc for checkout-state shouldCreateAccount field * remove unnecessary comment + fix whitespace/indentation * simulate logged-out user for createaccount signup tests * use a single, compound if statement for early return (review nitpick) * don't hide `checkoutAllowsSignup` store setting behind feature flag: - the feature flag should be used to enable/disable behaviour - it's dangerous to adjust store settings/options based on feature flag * rejig tests so they require woocommerce_blocks_phase==3: - make feature gate method private to avoid exposing - remove feature flag check & test skip for other builds - set blocks phase in travis config * remove redundant user-logout in test setup - cleaner to just require this * use WP function bracket style (same line) Co-authored-by: Darren Ethier <darren@roughsmootheng.in> Co-authored-by: Albert Juhé Lluveras <contact@albertjuhe.com>
2020-10-01 02:07:16 +00:00
* @param {boolean} action.shouldCreateAccount True if shopper has requested a user account (signup checkbox).
* @param {Object} action.data Other action payload.
*/
Refactor checkout status and event emitters to support stripe intents and more complex payment methods. (https://github.com/woocommerce/woocommerce-blocks/pull/2189) * initial mapping out of stripe payment intents * rename checkout processing statuses to be clearer * Add new status and refactor checkout complete behaviour. * Make sure payment result data is included in checkout processing response * add payment intent handling Still testing * make sure promise is returned * include site url with endpoint * modify setComplete status to optionally receive redirectUrl for changing in state at the same time as setting status * fix typo in property retrieval * add error handling for after checkout processing event * add notices area for payment methods * implement error handling for stripe intents * hook into stripe error processing and include error in payment response * clear notices so they don’t show in block and merge payment details * add notice handling to payment context * modify error processing in checkout processor * handle errors with fallback in checkout state context * hook into after processing for stripe cc error handling * set checkout to idle status if before processing emitters result in error * Add emit response type-defs and normalize expectations for observer responses * improve doc block * switch checkoutIsComplete check to checkoutAfterProcessing for payment complete status change * remove unneeded event emitters and consolidate some logic * fix idle status set logic
2020-04-14 16:52:23 +00:00
export const reducer = (
state = DEFAULT_STATE,
{ url, type, customerId, orderId, orderNotes, shouldCreateAccount, data }
Refactor checkout status and event emitters to support stripe intents and more complex payment methods. (https://github.com/woocommerce/woocommerce-blocks/pull/2189) * initial mapping out of stripe payment intents * rename checkout processing statuses to be clearer * Add new status and refactor checkout complete behaviour. * Make sure payment result data is included in checkout processing response * add payment intent handling Still testing * make sure promise is returned * include site url with endpoint * modify setComplete status to optionally receive redirectUrl for changing in state at the same time as setting status * fix typo in property retrieval * add error handling for after checkout processing event * add notices area for payment methods * implement error handling for stripe intents * hook into stripe error processing and include error in payment response * clear notices so they don’t show in block and merge payment details * add notice handling to payment context * modify error processing in checkout processor * handle errors with fallback in checkout state context * hook into after processing for stripe cc error handling * set checkout to idle status if before processing emitters result in error * Add emit response type-defs and normalize expectations for observer responses * improve doc block * switch checkoutIsComplete check to checkoutAfterProcessing for payment complete status change * remove unneeded event emitters and consolidate some logic * fix idle status set logic
2020-04-14 16:52:23 +00:00
) => {
let newState = state;
switch ( type ) {
case SET_PRISTINE:
newState = DEFAULT_STATE;
break;
Refactor checkout status and event emitters to support stripe intents and more complex payment methods. (https://github.com/woocommerce/woocommerce-blocks/pull/2189) * initial mapping out of stripe payment intents * rename checkout processing statuses to be clearer * Add new status and refactor checkout complete behaviour. * Make sure payment result data is included in checkout processing response * add payment intent handling Still testing * make sure promise is returned * include site url with endpoint * modify setComplete status to optionally receive redirectUrl for changing in state at the same time as setting status * fix typo in property retrieval * add error handling for after checkout processing event * add notices area for payment methods * implement error handling for stripe intents * hook into stripe error processing and include error in payment response * clear notices so they don’t show in block and merge payment details * add notice handling to payment context * modify error processing in checkout processor * handle errors with fallback in checkout state context * hook into after processing for stripe cc error handling * set checkout to idle status if before processing emitters result in error * Add emit response type-defs and normalize expectations for observer responses * improve doc block * switch checkoutIsComplete check to checkoutAfterProcessing for payment complete status change * remove unneeded event emitters and consolidate some logic * fix idle status set logic
2020-04-14 16:52:23 +00:00
case SET_IDLE:
newState =
state.status !== IDLE
Refactor checkout status and event emitters to support stripe intents and more complex payment methods. (https://github.com/woocommerce/woocommerce-blocks/pull/2189) * initial mapping out of stripe payment intents * rename checkout processing statuses to be clearer * Add new status and refactor checkout complete behaviour. * Make sure payment result data is included in checkout processing response * add payment intent handling Still testing * make sure promise is returned * include site url with endpoint * modify setComplete status to optionally receive redirectUrl for changing in state at the same time as setting status * fix typo in property retrieval * add error handling for after checkout processing event * add notices area for payment methods * implement error handling for stripe intents * hook into stripe error processing and include error in payment response * clear notices so they don’t show in block and merge payment details * add notice handling to payment context * modify error processing in checkout processor * handle errors with fallback in checkout state context * hook into after processing for stripe cc error handling * set checkout to idle status if before processing emitters result in error * Add emit response type-defs and normalize expectations for observer responses * improve doc block * switch checkoutIsComplete check to checkoutAfterProcessing for payment complete status change * remove unneeded event emitters and consolidate some logic * fix idle status set logic
2020-04-14 16:52:23 +00:00
? {
...state,
status: IDLE,
}
: state;
break;
case SET_REDIRECT_URL:
newState =
url !== state.url
? {
...state,
redirectUrl: url,
}
: state;
break;
Refactor checkout status and event emitters to support stripe intents and more complex payment methods. (https://github.com/woocommerce/woocommerce-blocks/pull/2189) * initial mapping out of stripe payment intents * rename checkout processing statuses to be clearer * Add new status and refactor checkout complete behaviour. * Make sure payment result data is included in checkout processing response * add payment intent handling Still testing * make sure promise is returned * include site url with endpoint * modify setComplete status to optionally receive redirectUrl for changing in state at the same time as setting status * fix typo in property retrieval * add error handling for after checkout processing event * add notices area for payment methods * implement error handling for stripe intents * hook into stripe error processing and include error in payment response * clear notices so they don’t show in block and merge payment details * add notice handling to payment context * modify error processing in checkout processor * handle errors with fallback in checkout state context * hook into after processing for stripe cc error handling * set checkout to idle status if before processing emitters result in error * Add emit response type-defs and normalize expectations for observer responses * improve doc block * switch checkoutIsComplete check to checkoutAfterProcessing for payment complete status change * remove unneeded event emitters and consolidate some logic * fix idle status set logic
2020-04-14 16:52:23 +00:00
case SET_PROCESSING_RESPONSE:
newState = {
...state,
processingResponse: data,
};
break;
case SET_COMPLETE:
newState =
state.status !== COMPLETE
? {
...state,
status: COMPLETE,
redirectUrl: data?.redirectUrl || state.redirectUrl,
}
: state;
break;
case SET_PROCESSING:
newState =
state.status !== PROCESSING
? {
...state,
status: PROCESSING,
hasError: false,
}
: state;
// clear any error state.
newState =
newState.hasError === false
? newState
: { ...newState, hasError: false };
break;
Refactor checkout status and event emitters to support stripe intents and more complex payment methods. (https://github.com/woocommerce/woocommerce-blocks/pull/2189) * initial mapping out of stripe payment intents * rename checkout processing statuses to be clearer * Add new status and refactor checkout complete behaviour. * Make sure payment result data is included in checkout processing response * add payment intent handling Still testing * make sure promise is returned * include site url with endpoint * modify setComplete status to optionally receive redirectUrl for changing in state at the same time as setting status * fix typo in property retrieval * add error handling for after checkout processing event * add notices area for payment methods * implement error handling for stripe intents * hook into stripe error processing and include error in payment response * clear notices so they don’t show in block and merge payment details * add notice handling to payment context * modify error processing in checkout processor * handle errors with fallback in checkout state context * hook into after processing for stripe cc error handling * set checkout to idle status if before processing emitters result in error * Add emit response type-defs and normalize expectations for observer responses * improve doc block * switch checkoutIsComplete check to checkoutAfterProcessing for payment complete status change * remove unneeded event emitters and consolidate some logic * fix idle status set logic
2020-04-14 16:52:23 +00:00
case SET_BEFORE_PROCESSING:
newState =
Refactor checkout status and event emitters to support stripe intents and more complex payment methods. (https://github.com/woocommerce/woocommerce-blocks/pull/2189) * initial mapping out of stripe payment intents * rename checkout processing statuses to be clearer * Add new status and refactor checkout complete behaviour. * Make sure payment result data is included in checkout processing response * add payment intent handling Still testing * make sure promise is returned * include site url with endpoint * modify setComplete status to optionally receive redirectUrl for changing in state at the same time as setting status * fix typo in property retrieval * add error handling for after checkout processing event * add notices area for payment methods * implement error handling for stripe intents * hook into stripe error processing and include error in payment response * clear notices so they don’t show in block and merge payment details * add notice handling to payment context * modify error processing in checkout processor * handle errors with fallback in checkout state context * hook into after processing for stripe cc error handling * set checkout to idle status if before processing emitters result in error * Add emit response type-defs and normalize expectations for observer responses * improve doc block * switch checkoutIsComplete check to checkoutAfterProcessing for payment complete status change * remove unneeded event emitters and consolidate some logic * fix idle status set logic
2020-04-14 16:52:23 +00:00
state.status !== BEFORE_PROCESSING
? {
...state,
Refactor checkout status and event emitters to support stripe intents and more complex payment methods. (https://github.com/woocommerce/woocommerce-blocks/pull/2189) * initial mapping out of stripe payment intents * rename checkout processing statuses to be clearer * Add new status and refactor checkout complete behaviour. * Make sure payment result data is included in checkout processing response * add payment intent handling Still testing * make sure promise is returned * include site url with endpoint * modify setComplete status to optionally receive redirectUrl for changing in state at the same time as setting status * fix typo in property retrieval * add error handling for after checkout processing event * add notices area for payment methods * implement error handling for stripe intents * hook into stripe error processing and include error in payment response * clear notices so they don’t show in block and merge payment details * add notice handling to payment context * modify error processing in checkout processor * handle errors with fallback in checkout state context * hook into after processing for stripe cc error handling * set checkout to idle status if before processing emitters result in error * Add emit response type-defs and normalize expectations for observer responses * improve doc block * switch checkoutIsComplete check to checkoutAfterProcessing for payment complete status change * remove unneeded event emitters and consolidate some logic * fix idle status set logic
2020-04-14 16:52:23 +00:00
status: BEFORE_PROCESSING,
hasError: false,
}
: state;
break;
Refactor checkout status and event emitters to support stripe intents and more complex payment methods. (https://github.com/woocommerce/woocommerce-blocks/pull/2189) * initial mapping out of stripe payment intents * rename checkout processing statuses to be clearer * Add new status and refactor checkout complete behaviour. * Make sure payment result data is included in checkout processing response * add payment intent handling Still testing * make sure promise is returned * include site url with endpoint * modify setComplete status to optionally receive redirectUrl for changing in state at the same time as setting status * fix typo in property retrieval * add error handling for after checkout processing event * add notices area for payment methods * implement error handling for stripe intents * hook into stripe error processing and include error in payment response * clear notices so they don’t show in block and merge payment details * add notice handling to payment context * modify error processing in checkout processor * handle errors with fallback in checkout state context * hook into after processing for stripe cc error handling * set checkout to idle status if before processing emitters result in error * Add emit response type-defs and normalize expectations for observer responses * improve doc block * switch checkoutIsComplete check to checkoutAfterProcessing for payment complete status change * remove unneeded event emitters and consolidate some logic * fix idle status set logic
2020-04-14 16:52:23 +00:00
case SET_AFTER_PROCESSING:
newState =
state.status !== AFTER_PROCESSING
? {
...state,
status: AFTER_PROCESSING,
}
: state;
break;
case SET_HAS_ERROR:
newState = state.hasError
? state
: {
...state,
hasError: true,
};
newState =
state.status === PROCESSING ||
Refactor checkout status and event emitters to support stripe intents and more complex payment methods. (https://github.com/woocommerce/woocommerce-blocks/pull/2189) * initial mapping out of stripe payment intents * rename checkout processing statuses to be clearer * Add new status and refactor checkout complete behaviour. * Make sure payment result data is included in checkout processing response * add payment intent handling Still testing * make sure promise is returned * include site url with endpoint * modify setComplete status to optionally receive redirectUrl for changing in state at the same time as setting status * fix typo in property retrieval * add error handling for after checkout processing event * add notices area for payment methods * implement error handling for stripe intents * hook into stripe error processing and include error in payment response * clear notices so they don’t show in block and merge payment details * add notice handling to payment context * modify error processing in checkout processor * handle errors with fallback in checkout state context * hook into after processing for stripe cc error handling * set checkout to idle status if before processing emitters result in error * Add emit response type-defs and normalize expectations for observer responses * improve doc block * switch checkoutIsComplete check to checkoutAfterProcessing for payment complete status change * remove unneeded event emitters and consolidate some logic * fix idle status set logic
2020-04-14 16:52:23 +00:00
state.status === BEFORE_PROCESSING
? {
...newState,
status: IDLE,
}
: newState;
break;
case SET_NO_ERROR:
newState = state.hasError
? {
...state,
hasError: false,
}
: state;
break;
case INCREMENT_CALCULATING:
newState = {
...state,
calculatingCount: state.calculatingCount + 1,
};
break;
case DECREMENT_CALCULATING:
newState = {
...state,
calculatingCount: Math.max( 0, state.calculatingCount - 1 ),
};
break;
case SET_CUSTOMER_ID:
newState = {
...state,
customerId,
};
break;
case SET_ORDER_ID:
newState = {
...state,
orderId,
};
break;
Support "create account" option in checkout block (https://github.com/woocommerce/woocommerce-blocks/pull/2851) * prototype 'create account' checkbox in checkout block * expose store config for generating password/username to blocks: + use FILTER_VALIDATE_BOOLEAN instead of hard-coded `yes` * stub out signup form in checkout block * context / provider to store checkout signup form data * revert signup form - checkout block will always generate username etc * persist signup checkbox in checkout state & pass to checkout API * add `create_account` param to order API, fix name in client POST * handle creating user account as part of order (first cut) * ensure the order is associated with the new customer * only show 'create account' checkbox when appropriate (guest checkout) * remove unnecessary username/password variables * refactor account-creation logic into functions: - clarify inputs and outputs - use RouteException for error handling - use woo options directly, avoid dependency on WC_Checkout * update "email exists" error message to use existing error message text * handle all known errors from wc_create_new_customer + use core message * only show "create account" checkbox to shopper when necessary: - if guest checkout is disabled, user must create account - not optional * only show "create account" if account creation is optional: - fixes incorrect logic in previous commit - add some comments to clarify * fix create account logic in API when checkout requires account: - use correct woo setting option name - reverse logic to match option = allow guest false means registration required * strip html tags from create account error messages * temporarily force enable autogenerate user/pass in new account API * fix rebase errors * add new allowCreateAccount attribute in checkout block * show/hide `Create account` checkbox dependent on block attribute: - previously was dependent on store setting * new create user API, with set initial password email (first cut): - use core register_new_user for creating the user - this triggers core "set new password" email - generate username using logic lifted from WC core - rough cut, lots to tidy/polish here * remove alternative/unused create account function * set `Customer` role for signups during checkout * eslint fix - switch case break * remove comments that mirror code & might go stale * tidy func comment * remove unused function * use store setting `allow signup` for default value of new block option * refactor order signup logic to service class first cut: - new CreateAccount service - hook up via custom action (for now at least) - paste over existing create account logic (temporary - will be replaced) * adapt wc_create_new_customer logic in CreateAccount service (WIP) * set default_password_nag on new account + throw instead of WP_Error * rename `createAccount` => `shouldCreateAccount` to clarify meaning * fix checkout block - renamed `shouldCreateAccount` (missed in prev commit) * prototype sending alternative email template for checkout signup * add magic link to set password to blocks new account html email * tidy up new account email templates - set password link, subject/heading * use same id so merchant setting tweaks apply to our new improved email * remove logging * code tidies in CreateAccount service: - remove unnecessary constructor - type-hint in should_create_customer_account - streamline logic in should_create_customer_account - remove unnecessary `empty` check - add comments to illuminate different use-cases handled by should_create_customer_account * don't provide password to new account email templates (no longer used) * declare dependencies in root namespace * code tidies on new account email class: - correct namespace and camelcase name - declare class in file, don't instantiate; instantiate in client code (CreateAccount service) when used - no require/file import, use `use` * move CustomerNewEmail to folder matching namespace * use Package->get_path for email template paths: - CreateAccount service now depends on Package - CreateAccount passes Package to email class so it can use `get_path` - note: CustomerNewAccount is not registered with DI container as it needs to be instantiated after Woo init (for `WC_Email`) - shift email templates to {plugin}/templates, consistent with WP convention * call CreateAccount::from_order_request directly, no custom hook: - custom hook is not appropriate as we may not want to allow extensibility in this way - TBD * add appropriate margin above create account checkbox * remove unnecessary direct-access protection * generalise name of error-handling method * simplify CustomerNewAccount - instantiate directly, when needed * remove unused new_account_email member - now instantiated on demand * numerous fixes and updates due to rebase changes * fix typo in name of CustomerNewAccount php file (missing `n`) * experiment - link to lost-password form in my-account (prototype branded screen) * Revert "experiment - link to lost-password form in my-account (prototype branded screen)" This reverts commit e1dc6dd5e9f0218ede81da92188d813c2d0856d9. * feature gate CreateAccount service init to dev build only + + remove stale comment * feature gate front end "Create account" checkbox to feature plugin only * feature gate editor "allow signup" option to dev build only * feature gate checkout api create account - dev build only * tweak feature gating PHP logic so it's robust: - all PHP feature gating is in the service class - all publicly-available methods return early if feature gate off - Checkout rest API transparently calls service - no explicit feature gate at API level * ensure frontend/editor features are feature gated (isExperimentalBuild is a function) * feature gate value of checkoutAllowsSignup - can only be true in feature plugin * fix a / an typo in comment Co-authored-by: Albert Juhé Lluveras <contact@albertjuhe.com> * remove commented code * hello world unit test (doesn't test anything yet) * add a command for running unit tests when container already up: - this should probably move to another PR/branch * basic tests of core logic in CreateAccount service * import isExperimentalBuild direct: - import from alias package was causing an issue, likely a dependency cycle * refactor from_order_request to return new user ID so it's easier to test * test creating a customer from an order + rest request: - i.e. a full end-to-end integration test * delete redundant test and tidy comments * generalise test to provider format * refactor create-dup-user err test to use same approach as success test * add test for when user should not be created * don't hard-code options in "create" test, remove redundant provider in no-account-requested test * de-generalise "user already signed up" test * add test for malformed email * flesh out & comment successful signup tests * flesh out "invalid email" tests * clarify no account requested test comment * remove phpunit:quick - I don't think it's needed * add comment explaining this is an integration test * experiment – disable feature flag, is this why the tests are failing? * revert test commit - restore feature gate (experimental flag) * skip all tests if CreateAccount is disabled due to feature flag * d'oh - expose CreateAccount:is_feature_enabled so can be used in tests * add jsdoc for checkout-state shouldCreateAccount field * remove unnecessary comment + fix whitespace/indentation * simulate logged-out user for createaccount signup tests * use a single, compound if statement for early return (review nitpick) * don't hide `checkoutAllowsSignup` store setting behind feature flag: - the feature flag should be used to enable/disable behaviour - it's dangerous to adjust store settings/options based on feature flag * rejig tests so they require woocommerce_blocks_phase==3: - make feature gate method private to avoid exposing - remove feature flag check & test skip for other builds - set blocks phase in travis config * remove redundant user-logout in test setup - cleaner to just require this * use WP function bracket style (same line) Co-authored-by: Darren Ethier <darren@roughsmootheng.in> Co-authored-by: Albert Juhé Lluveras <contact@albertjuhe.com>
2020-10-01 02:07:16 +00:00
case SET_SHOULD_CREATE_ACCOUNT:
if ( shouldCreateAccount !== state.shouldCreateAccount ) {
newState = {
...state,
shouldCreateAccount,
};
}
break;
case SET_ORDER_NOTES:
if ( state.orderNotes !== orderNotes ) {
newState = {
...state,
orderNotes,
};
}
break;
}
// automatically update state to idle from pristine as soon as it
// initially changes.
if (
newState !== state &&
type !== SET_PRISTINE &&
newState.status === PRISTINE
) {
newState.status = IDLE;
}
return newState;
};