Onboarding: Add reminder to complete profiler (https://github.com/woocommerce/woocommerce-admin/pull/3524)

* Add note to complete profiler

* Add note actions

* Update note to actioned when profiler is marked complete

* Update note to actioned client-side when completing profiler
This commit is contained in:
Joshua T Flowers 2020-01-10 09:36:30 +08:00 committed by GitHub
parent d15a66d3bd
commit d29d674768
3 changed files with 130 additions and 9 deletions

View File

@ -22,6 +22,7 @@ import Industry from './steps/industry';
import Plugins from './steps/plugins';
import ProductTypes from './steps/product-types';
import ProfileWizardHeader from './header';
import { QUERY_DEFAULTS } from 'wc-api/constants';
import Start from './steps/start';
import StoreDetails from './steps/store-details';
import Theme from './steps/theme';
@ -144,15 +145,15 @@ class ProfileWizard extends Component {
const nextStep = this.getSteps()[ currentStepIndex + 1 ];
if ( 'undefined' === typeof nextStep ) {
this.finishWizard();
this.possiblyShowCart();
return;
}
return updateQueryString( { step: nextStep.key } );
}
finishWizard() {
const { profileItems, updateProfileItems } = this.props;
possiblyShowCart() {
const { profileItems } = this.props;
// @todo This should also send profile information to woocommerce.com.
@ -160,14 +161,25 @@ class ProfileWizard extends Component {
if ( productIds.length ) {
this.setState( { showCartModal: true } );
} else {
updateProfileItems( { completed: true } );
this.completeProfiler();
}
}
completeProfiler() {
const { notes, updateNote, updateProfileItems } = this.props;
updateProfileItems( { completed: true } );
const profilerNote = notes.find(
note => 'wc-admin-onboarding-profiler-reminder' === note.name
);
if ( profilerNote ) {
updateNote( profilerNote.id, { status: 'actioned' } );
}
}
markCompleteAndPurchase( cartRedirectUrl ) {
const { updateProfileItems } = this.props;
this.setState( { cartRedirectUrl } );
updateProfileItems( { completed: true } );
this.completeProfiler();
}
render() {
@ -190,7 +202,7 @@ class ProfileWizard extends Component {
onClickPurchaseNow={ cartRedirectUrl =>
this.markCompleteAndPurchase( cartRedirectUrl )
}
onClickPurchaseLater={ () => this.props.updateProfileItems( { completed: true } ) }
onClickPurchaseLater={ () => this.completeProfiler() }
/>
) }
<ProfileWizardHeader currentStep={ step.key } steps={ steps } />
@ -202,19 +214,29 @@ class ProfileWizard extends Component {
export default compose(
withSelect( select => {
const { getProfileItems, getProfileItemsError } = select( 'wc-api' );
const { getNotes, getProfileItems, getProfileItemsError } = select( 'wc-api' );
const notesQuery = {
page: 1,
per_page: QUERY_DEFAULTS.pageSize,
type: 'update',
status: 'unactioned',
};
const notes = getNotes( notesQuery );
return {
isError: Boolean( getProfileItemsError() ),
notes,
profileItems: getProfileItems(),
};
} ),
withDispatch( dispatch => {
const { updateProfileItems } = dispatch( 'wc-api' );
const { updateNote, updateProfileItems } = dispatch( 'wc-api' );
const { createNotice } = dispatch( 'core/notices' );
return {
createNotice,
updateNote,
updateProfileItems,
};
} )

View File

@ -9,6 +9,7 @@
namespace Automattic\WooCommerce\Admin\Features;
use \Automattic\WooCommerce\Admin\Loader;
use \Automattic\WooCommerce\Admin\Notes\WC_Admin_Notes_Onboarding_Profiler;
/**
* Contains backend logic for the onboarding profile and checklist feature.
@ -66,6 +67,9 @@ class Onboarding {
// Rest API hooks need to run before is_admin() checks.
add_filter( 'woocommerce_rest_prepare_themes', array( $this, 'add_uploaded_theme_data' ) );
// Add onboarding notes.
new WC_Admin_Notes_Onboarding_Profiler();
if ( ! is_admin() ) {
return;
}

View File

@ -0,0 +1,95 @@
<?php
/**
* WooCommerce Admin: Profile reminder note.
*
* Adds a notes to complete or skip the profiler.
*
* @package WooCommerce Admin
*/
namespace Automattic\WooCommerce\Admin\Notes;
defined( 'ABSPATH' ) || exit;
use \Automattic\WooCommerce\Admin\Features\Onboarding;
/**
* WC_Admin_Notes_Onboarding_Profiler.
*/
class WC_Admin_Notes_Onboarding_Profiler {
const NOTE_NAME = 'wc-admin-onboarding-profiler-reminder';
/**
* Attach hooks.
*/
public function __construct() {
add_action( 'admin_init', array( $this, 'add_reminder' ) );
add_action( 'update_option_wc_onboarding_profile', array( $this, 'update_status_on_complete' ), 10, 2 );
}
/**
* Creates a note to remind store owners to complete the profiler.
*/
public static function add_reminder() {
if ( ! Onboarding::should_show_profiler() ) {
return;
}
$data_store = \WC_Data_Store::load( 'admin-note' );
$note_ids = $data_store->get_notes_with_name( self::NOTE_NAME );
if ( ! empty( $note_ids ) ) {
return;
}
$note = new WC_Admin_Note();
$note->set_title( __( 'Welcome to WooCommerce! Set up your store and start selling', 'woocommerce-admin' ) );
$note->set_content( __( "We're here to help you going through the most important steps to get your store up and running.", 'woocommerce-admin' ) );
$note->set_type( WC_Admin_Note::E_WC_ADMIN_NOTE_UPDATE );
$note->set_icon( 'info' );
$note->set_name( self::NOTE_NAME );
$note->set_content_data( (object) array() );
$note->set_source( 'woocommerce-admin' );
$note->add_action(
'continue-profiler',
__( 'Continue Store Setup', 'woocommerce-admin' ),
wc_admin_url(),
'unactioned',
true
);
$note->add_action(
'skip-profiler',
__( 'Skip Setup', 'woocommerce-admin' ),
wc_admin_url( '&reset_profiler=0' ),
'actioned',
false
);
$note->save();
}
/**
* Updates the note status when the profiler is completed.
*
* @param mixed $old_value Old value.
* @param mixed $new_value New value.
*/
public static function update_status_on_complete( $old_value, $new_value ) {
if (
( isset( $old_value['complete'] ) && $old_value['completed'] ) ||
! isset( $new_value['completed'] ) ||
! $new_value['completed']
) {
return;
}
$data_store = \WC_Data_Store::load( 'admin-note' );
$note_ids = $data_store->get_notes_with_name( self::NOTE_NAME );
if ( empty( $note_ids ) ) {
return;
}
$note = new WC_Admin_Note( $note_ids[0] );
$note->set_status( 'actioned' );
$note->save();
}
}