diff --git a/plugins/woocommerce-beta-tester/api/api.php b/plugins/woocommerce-beta-tester/api/api.php index 4c0071e99a2..62a4b4df2af 100644 --- a/plugins/woocommerce-beta-tester/api/api.php +++ b/plugins/woocommerce-beta-tester/api/api.php @@ -53,12 +53,13 @@ require 'tools/delete-all-products.php'; require 'tools/disable-wc-email.php'; require 'tools/trigger-update-callbacks.php'; require 'tools/reset-cys.php'; +require 'tools/set-block-template-logging-threshold.php'; +require 'tools/set-coming-soon-mode.php'; require 'tracks/class-tracks-debug-log.php'; require 'features/features.php'; require 'rest-api-filters/class-wca-test-helper-rest-api-filters.php'; require 'rest-api-filters/hook.php'; require 'live-branches/manifest.php'; require 'live-branches/install.php'; -require 'tools/set-block-template-logging-threshold.php'; require 'remote-spec-validator/class-wca-test-helper-remote-spec-validator.php'; require 'remote-inbox-notifications/class-wca-test-helper-remote-inbox-notifications.php'; diff --git a/plugins/woocommerce-beta-tester/api/tools/set-coming-soon-mode.php b/plugins/woocommerce-beta-tester/api/tools/set-coming-soon-mode.php new file mode 100644 index 00000000000..00dd6e2884f --- /dev/null +++ b/plugins/woocommerce-beta-tester/api/tools/set-coming-soon-mode.php @@ -0,0 +1,52 @@ + 'POST', + 'args' => array( + 'mode' => array( + 'description' => 'Coming soon mode', + 'type' => 'enum', + 'enum' => array( 'site', 'store', 'disabled' ), + ), + ), + ) +); + +register_woocommerce_admin_test_helper_rest_route( + '/tools/get-force-coming-soon-mode/v1', + 'tools_get_coming_soon_mode', + array( + 'methods' => 'GET', + ) +); + +/** + * A tool to set the coming soon mode. + * + * @param WP_REST_Request $request Request object. + */ +function tools_set_coming_soon_mode( $request ) { + $mode = $request->get_param( 'mode' ); + + update_option( 'wc_admin_test_helper_force_coming_soon_mode', $mode ); + + wc_get_container()->get( ComingSoonCacheInvalidator::class )->invalidate_caches(); + + return new WP_REST_Response( $mode, 200 ); +} + +/** + * A tool to get the coming soon mode. + */ +function tools_get_coming_soon_mode() { + $mode = get_option( 'wc_admin_test_helper_force_coming_soon_mode', 'disabled' ); + + return new WP_REST_Response( $mode, 200 ); +} diff --git a/plugins/woocommerce-beta-tester/api/tools/trigger-update-callbacks.php b/plugins/woocommerce-beta-tester/api/tools/trigger-update-callbacks.php index 0a06bbb237c..b13243da012 100644 --- a/plugins/woocommerce-beta-tester/api/tools/trigger-update-callbacks.php +++ b/plugins/woocommerce-beta-tester/api/tools/trigger-update-callbacks.php @@ -48,7 +48,7 @@ function trigger_selected_update_callbacks( $request ) { $update_callbacks = $db_updates[ $version ]; foreach ( $update_callbacks as $update_callback ) { - call_user_func( $update_callback ); + \WC_Install::run_update_callback( $update_callback ); } return false; diff --git a/plugins/woocommerce-beta-tester/changelog/add-beta-tester-coming-soon-tool b/plugins/woocommerce-beta-tester/changelog/add-beta-tester-coming-soon-tool new file mode 100644 index 00000000000..c60a03d3bbf --- /dev/null +++ b/plugins/woocommerce-beta-tester/changelog/add-beta-tester-coming-soon-tool @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add tool to force the coming soon landing pages to display on the front-end diff --git a/plugins/woocommerce-beta-tester/includes/class-wc-beta-tester-override-coming-soon-options.php b/plugins/woocommerce-beta-tester/includes/class-wc-beta-tester-override-coming-soon-options.php new file mode 100644 index 00000000000..ebb451da843 --- /dev/null +++ b/plugins/woocommerce-beta-tester/includes/class-wc-beta-tester-override-coming-soon-options.php @@ -0,0 +1,77 @@ +wc_beta_tester_override_coming_soon_options(); + } + + /** + * Override the coming soon options. + */ + public function wc_beta_tester_override_coming_soon_options() { + $mode = get_option( 'wc_admin_test_helper_force_coming_soon_mode', 'disabled' ); + + if ( 'disabled' === $mode ) { + return; + } + + $is_request_frontend = ( ! is_admin() || defined( 'DOING_AJAX' ) ) + && ! defined( 'DOING_CRON' ) && ! WC()->is_rest_api_request(); + if ( ! $is_request_frontend ) { + return; + } + + $this->override_woocommerce_coming_soon_option( $mode ); + $this->override_woocommerce_store_pages_only_option( $mode ); + } + + /** + * Override the woocommerce_coming_soon option. + * + * @param string $mode The coming soon mode. + */ + private function override_woocommerce_coming_soon_option( $mode ) { + add_filter( + 'option_woocommerce_coming_soon', + function ( $value ) use ( $mode ) { + if ( 'site' === $mode || 'store' === $mode ) { + return 'yes'; + } + return $value; + } + ); + } + + /** + * Override the woocommerce_store_pages_only option. + * + * @param string $mode The coming soon mode. + */ + private function override_woocommerce_store_pages_only_option( $mode ) { + add_filter( + 'option_woocommerce_store_pages_only', + function ( $value ) use ( $mode ) { + if ( 'store' === $mode ) { + return 'yes'; + } + return $value; + } + ); + } +} + +new WC_Beta_Tester_Override_Coming_Soon_Options(); diff --git a/plugins/woocommerce-beta-tester/plugin.php b/plugins/woocommerce-beta-tester/plugin.php index 60ffe6283f3..ec60a8e0856 100644 --- a/plugins/woocommerce-beta-tester/plugin.php +++ b/plugins/woocommerce-beta-tester/plugin.php @@ -26,3 +26,4 @@ add_filter( 'woocommerce_admin_get_feature_config', function( $feature_config ) } return $feature_config; } ); + diff --git a/plugins/woocommerce-beta-tester/src/tools/commands/index.js b/plugins/woocommerce-beta-tester/src/tools/commands/index.js index 7e131f0d8e4..e077ae389bf 100644 --- a/plugins/woocommerce-beta-tester/src/tools/commands/index.js +++ b/plugins/woocommerce-beta-tester/src/tools/commands/index.js @@ -11,6 +11,10 @@ import { TriggerUpdateCallbacks, TRIGGER_UPDATE_CALLBACKS_ACTION_NAME, } from './trigger-update-callbacks'; +import { + SetComingSoonMode, + UPDATE_COMING_SOON_MODE_ACTION_NAME, +} from './set-coming-soon-mode'; export default [ { @@ -78,4 +82,9 @@ export default [ description: , action: UPDATE_BLOCK_TEMPLATE_LOGGING_THRESHOLD_ACTION_NAME, }, + { + command: 'Force coming soon page to show', + description: , + action: UPDATE_COMING_SOON_MODE_ACTION_NAME, + }, ]; diff --git a/plugins/woocommerce-beta-tester/src/tools/commands/set-coming-soon-mode.js b/plugins/woocommerce-beta-tester/src/tools/commands/set-coming-soon-mode.js new file mode 100644 index 00000000000..69cfab16828 --- /dev/null +++ b/plugins/woocommerce-beta-tester/src/tools/commands/set-coming-soon-mode.js @@ -0,0 +1,48 @@ +/** + * External dependencies + */ +import { SelectControl } from '@wordpress/components'; +import { useDispatch, useSelect } from '@wordpress/data'; + +/** + * Internal dependencies + */ +import { STORE_KEY } from '../data/constants'; + +export const UPDATE_COMING_SOON_MODE_ACTION_NAME = 'updateComingSoonMode'; + +const OPTIONS = [ + { label: 'Whole Site', value: 'site' }, + { label: 'Store Only', value: 'store' }, + { label: 'Disabled', value: 'disabled' }, +]; + +export const SetComingSoonMode = () => { + const comingSoonMode = useSelect( + ( select ) => select( STORE_KEY ).getComingSoonMode(), + [] + ); + const { updateCommandParams } = useDispatch( STORE_KEY ); + + function onChange( mode ) { + updateCommandParams( UPDATE_COMING_SOON_MODE_ACTION_NAME, { + mode, + } ); + } + + return ( +
+ { ! comingSoonMode ? ( +

Loading ...

+ ) : ( + + ) } +
+ ); +}; diff --git a/plugins/woocommerce-beta-tester/src/tools/commands/trigger-update-callbacks.js b/plugins/woocommerce-beta-tester/src/tools/commands/trigger-update-callbacks.js index 1c6969fca3c..019a1441b32 100644 --- a/plugins/woocommerce-beta-tester/src/tools/commands/trigger-update-callbacks.js +++ b/plugins/woocommerce-beta-tester/src/tools/commands/trigger-update-callbacks.js @@ -3,6 +3,7 @@ */ import { SelectControl } from '@wordpress/components'; import { useDispatch, useSelect } from '@wordpress/data'; +import { useMemo } from '@wordpress/element'; /** * Internal dependencies @@ -13,26 +14,33 @@ export const TRIGGER_UPDATE_CALLBACKS_ACTION_NAME = 'runSelectedUpdateCallbacks'; export const TriggerUpdateCallbacks = () => { - const { dbUpdateVersions } = useSelect( ( select ) => { - const { getDBUpdateVersions } = select( STORE_KEY ); - return { - dbUpdateVersions: getDBUpdateVersions(), - }; - } ); - + const dbUpdateVersions = useSelect( + ( select ) => select( STORE_KEY ).getDBUpdateVersions(), + [] + ); + const selectedVersion = useSelect( + ( select ) => + select( STORE_KEY ).getCommandParams( + TRIGGER_UPDATE_CALLBACKS_ACTION_NAME + ).runSelectedUpdateCallbacks.version, + [] + ); const { updateCommandParams } = useDispatch( STORE_KEY ); - function onCronChange( version ) { + function onChange( version ) { updateCommandParams( TRIGGER_UPDATE_CALLBACKS_ACTION_NAME, { version, } ); } - function getOptions() { - return dbUpdateVersions.map( ( version ) => { - return { label: version, value: version }; - } ); - } + const options = useMemo( + () => + dbUpdateVersions.map( ( version ) => ( { + label: version, + value: version, + } ) ), + [ dbUpdateVersions ] + ); return (
@@ -41,9 +49,10 @@ export const TriggerUpdateCallbacks = () => { ) : ( ) }
diff --git a/plugins/woocommerce-beta-tester/src/tools/commands/update-block-template-logging-threshold.tsx b/plugins/woocommerce-beta-tester/src/tools/commands/update-block-template-logging-threshold.tsx index e17d601adb0..e266051f38c 100644 --- a/plugins/woocommerce-beta-tester/src/tools/commands/update-block-template-logging-threshold.tsx +++ b/plugins/woocommerce-beta-tester/src/tools/commands/update-block-template-logging-threshold.tsx @@ -3,7 +3,6 @@ */ import { SelectControl } from '@wordpress/components'; -import { useEffect, useState } from '@wordpress/element'; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore no types // eslint-disable-next-line @woocommerce/dependency-group @@ -35,7 +34,6 @@ export const UpdateBlockTemplateLoggingThreshold = () => { const retrievedLoggingLevels = getLoggingLevels(); const retrievedThreshold = getBlockTemplateLoggingThreshold(); - return { loggingLevels: retrievedLoggingLevels, threshold: retrievedThreshold, @@ -44,12 +42,9 @@ export const UpdateBlockTemplateLoggingThreshold = () => { } ); - const [ newThreshold, setNewThreshold ] = useState( threshold ); - const { updateCommandParams } = useDispatch( STORE_KEY ); function onThresholdChange( selectedThreshold: string ) { - setNewThreshold( selectedThreshold ); updateCommandParams( UPDATE_BLOCK_TEMPLATE_LOGGING_THRESHOLD_ACTION_NAME, { @@ -67,10 +62,6 @@ export const UpdateBlockTemplateLoggingThreshold = () => { } ); } - useEffect( () => { - setNewThreshold( threshold ); - }, [ threshold ] ); - return (
{ isLoading ? ( @@ -83,7 +74,7 @@ export const UpdateBlockTemplateLoggingThreshold = () => { // @ts-ignore labelPosition prop exists labelPosition="side" options={ getOptions() } - value={ newThreshold } + value={ threshold } /> ) }
diff --git a/plugins/woocommerce-beta-tester/src/tools/data/action-types.js b/plugins/woocommerce-beta-tester/src/tools/data/action-types.js index b481a90efa1..9cf871b08ba 100644 --- a/plugins/woocommerce-beta-tester/src/tools/data/action-types.js +++ b/plugins/woocommerce-beta-tester/src/tools/data/action-types.js @@ -9,10 +9,9 @@ const TYPES = { IS_EMAIL_DISABLED: 'IS_EMAIL_DISABLED', SET_DB_UPDATE_VERSIONS: 'SET_DB_UPDATE_VERSIONS', SET_LOGGING_LEVELS: 'SET_LOGGING_LEVELS', - SET_BLOCK_TEMPLATE_LOGGING_THRESHOLD: - 'SET_BLOCK_TEMPLATE_LOGGING_THRESHOLD', UPDATE_BLOCK_TEMPLATE_LOGGING_THRESHOLD: 'UPDATE_BLOCK_TEMPLATE_LOGGING_THRESHOLD', + UPDATE_COMING_SOON_MODE: 'UPDATE_COMING_SOON_MODE', }; export default TYPES; diff --git a/plugins/woocommerce-beta-tester/src/tools/data/actions.js b/plugins/woocommerce-beta-tester/src/tools/data/actions.js index 00d630e3fd6..9e34802dd2c 100644 --- a/plugins/woocommerce-beta-tester/src/tools/data/actions.js +++ b/plugins/woocommerce-beta-tester/src/tools/data/actions.js @@ -262,3 +262,13 @@ export function* updateBlockTemplateLoggingThreshold( params ) { } ); } ); } + +export function* updateComingSoonMode( params ) { + yield runCommand( 'Update coming soon mode', function* () { + yield apiFetch( { + path: API_NAMESPACE + '/tools/update-coming-soon-mode/v1', + method: 'POST', + data: params, + } ); + } ); +} diff --git a/plugins/woocommerce-beta-tester/src/tools/data/reducer.js b/plugins/woocommerce-beta-tester/src/tools/data/reducer.js index 7688a308ead..9a15d468c83 100644 --- a/plugins/woocommerce-beta-tester/src/tools/data/reducer.js +++ b/plugins/woocommerce-beta-tester/src/tools/data/reducer.js @@ -9,11 +9,14 @@ const DEFAULT_STATE = { cronJobs: false, isEmailDisabled: '', messages: {}, - params: [], + params: { + updateComingSoonMode: {}, + updateBlockTemplateLoggingThreshold: {}, + runSelectedUpdateCallbacks: {}, + }, status: '', dbUpdateVersions: [], loggingLevels: null, - blockTemplateLoggingThreshold: null, }; const reducer = ( state = DEFAULT_STATE, action ) => { @@ -48,7 +51,7 @@ const reducer = ( state = DEFAULT_STATE, action ) => { return { ...state, currentlyRunning: { - ...state, + ...state.currentlyRunning, [ action.command ]: true, }, }; @@ -56,7 +59,7 @@ const reducer = ( state = DEFAULT_STATE, action ) => { return { ...state, currentlyRunning: { - ...state, + ...state.currentlyRunning, [ action.command ]: false, }, }; @@ -74,6 +77,7 @@ const reducer = ( state = DEFAULT_STATE, action ) => { return { ...state, params: { + ...state.params, [ action.source ]: action.params, }, }; @@ -87,12 +91,6 @@ const reducer = ( state = DEFAULT_STATE, action ) => { ...state, loggingLevels: action.loggingLevels, }; - case TYPES.SET_BLOCK_TEMPLATE_LOGGING_THRESHOLD: - return { - ...state, - blockTemplateLoggingThreshold: - action.blockTemplateLoggingThreshold, - }; default: return state; } diff --git a/plugins/woocommerce-beta-tester/src/tools/data/resolvers.js b/plugins/woocommerce-beta-tester/src/tools/data/resolvers.js index 6409038783b..5f55565925d 100644 --- a/plugins/woocommerce-beta-tester/src/tools/data/resolvers.js +++ b/plugins/woocommerce-beta-tester/src/tools/data/resolvers.js @@ -8,12 +8,15 @@ import { apiFetch } from '@wordpress/data-controls'; */ import { API_NAMESPACE } from './constants'; import { - setBlockTemplateLoggingThreshold, setCronJobs, setDBUpdateVersions, setIsEmailDisabled, setLoggingLevels, + updateCommandParams, } from './actions'; +import { UPDATE_BLOCK_TEMPLATE_LOGGING_THRESHOLD_ACTION_NAME } from '../commands/update-block-template-logging-threshold'; +import { UPDATE_COMING_SOON_MODE_ACTION_NAME } from '../commands/set-coming-soon-mode'; +import { TRIGGER_UPDATE_CALLBACKS_ACTION_NAME } from '../commands/trigger-update-callbacks'; export function* getCronJobs() { const path = `${ API_NAMESPACE }/tools/get-cron-list/v1`; @@ -33,11 +36,19 @@ export function* getDBUpdateVersions() { const path = `${ API_NAMESPACE }/tools/get-update-versions/v1`; try { - const response = yield apiFetch( { + const dbUpdateVersions = yield apiFetch( { path, method: 'GET', } ); - yield setDBUpdateVersions( response ); + + dbUpdateVersions.reverse(); + yield setDBUpdateVersions( dbUpdateVersions ); + yield updateCommandParams( TRIGGER_UPDATE_CALLBACKS_ACTION_NAME, { + version: + Array.isArray( dbUpdateVersions ) && dbUpdateVersions.length > 0 + ? dbUpdateVersions[ 0 ] + : null, + } ); } catch ( error ) { throw new Error( error ); } @@ -76,11 +87,32 @@ export function* getBlockTemplateLoggingThreshold() { const path = `${ API_NAMESPACE }/tools/get-block-template-logging-threshold/v1`; try { - const response = yield apiFetch( { + const threshold = yield apiFetch( { path, method: 'GET', } ); - yield setBlockTemplateLoggingThreshold( response ); + yield updateCommandParams( + UPDATE_BLOCK_TEMPLATE_LOGGING_THRESHOLD_ACTION_NAME, + { + threshold, + } + ); + } catch ( error ) { + throw new Error( error ); + } +} + +export function* getComingSoonMode() { + const path = `${ API_NAMESPACE }/tools/get-force-coming-soon-mode/v1`; + + try { + const mode = yield apiFetch( { + path, + method: 'GET', + } ); + yield updateCommandParams( UPDATE_COMING_SOON_MODE_ACTION_NAME, { + mode: mode || 'disabled', + } ); } catch ( error ) { throw new Error( error ); } diff --git a/plugins/woocommerce-beta-tester/src/tools/data/selectors.js b/plugins/woocommerce-beta-tester/src/tools/data/selectors.js index f28fdae371f..1ac46fc713e 100644 --- a/plugins/woocommerce-beta-tester/src/tools/data/selectors.js +++ b/plugins/woocommerce-beta-tester/src/tools/data/selectors.js @@ -31,5 +31,9 @@ export function getLoggingLevels( state ) { } export function getBlockTemplateLoggingThreshold( state ) { - return state.blockTemplateLoggingThreshold; + return state.params.updateBlockTemplateLoggingThreshold.threshold; +} + +export function getComingSoonMode( state ) { + return state.params.updateComingSoonMode.mode; } diff --git a/plugins/woocommerce-beta-tester/src/tools/index.js b/plugins/woocommerce-beta-tester/src/tools/index.js index be33ab55fff..822d03d85b5 100644 --- a/plugins/woocommerce-beta-tester/src/tools/index.js +++ b/plugins/woocommerce-beta-tester/src/tools/index.js @@ -77,9 +77,8 @@ function Tools( { export default compose( withSelect( ( select ) => { - const { getCurrentlyRunning, getMessages, getCommandParams } = select( - STORE_KEY - ); + const { getCurrentlyRunning, getMessages, getCommandParams } = + select( STORE_KEY ); return { currentlyRunningCommands: getCurrentlyRunning(), messages: getMessages(), diff --git a/plugins/woocommerce-beta-tester/woocommerce-beta-tester.php b/plugins/woocommerce-beta-tester/woocommerce-beta-tester.php index fbcdcf84f8e..ca0e6b53604 100644 --- a/plugins/woocommerce-beta-tester/woocommerce-beta-tester.php +++ b/plugins/woocommerce-beta-tester/woocommerce-beta-tester.php @@ -63,6 +63,7 @@ function _wc_beta_tester_bootstrap() { new WC_Beta_Tester_Import_Export(); // Tools. include dirname( __FILE__ ) . '/includes/class-wc-beta-tester-version-picker.php'; + include dirname( __FILE__ ) . '/includes/class-wc-beta-tester-override-coming-soon-options.php'; register_activation_hook( __FILE__, array( 'WC_Beta_Tester', 'activate' ) );