Onboarding: Install free themes during profiler (https://github.com/woocommerce/woocommerce-admin/pull/3484)
* Add theme name to theme activation response * Install and activate theme on choose in profiler * Only auto install free themes and not currently active themes * Move getPriceValue to dashboard utils * Don't add free themes to the cart
This commit is contained in:
parent
3da148156e
commit
52c81230c3
|
@ -3,6 +3,7 @@
|
||||||
* External dependencies
|
* External dependencies
|
||||||
*/
|
*/
|
||||||
import { __, sprintf } from '@wordpress/i18n';
|
import { __, sprintf } from '@wordpress/i18n';
|
||||||
|
import apiFetch from '@wordpress/api-fetch';
|
||||||
import { Component, Fragment } from '@wordpress/element';
|
import { Component, Fragment } from '@wordpress/element';
|
||||||
import { compose } from '@wordpress/compose';
|
import { compose } from '@wordpress/compose';
|
||||||
import { decodeEntities } from '@wordpress/html-entities';
|
import { decodeEntities } from '@wordpress/html-entities';
|
||||||
|
@ -14,7 +15,7 @@ import { withDispatch } from '@wordpress/data';
|
||||||
* WooCommerce dependencies
|
* WooCommerce dependencies
|
||||||
*/
|
*/
|
||||||
import { Card, H } from '@woocommerce/components';
|
import { Card, H } from '@woocommerce/components';
|
||||||
import { getSetting } from '@woocommerce/wc-admin-settings';
|
import { getSetting, setSetting } from '@woocommerce/wc-admin-settings';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Internal dependencies
|
* Internal dependencies
|
||||||
|
@ -24,6 +25,7 @@ import './style.scss';
|
||||||
import { recordEvent } from 'lib/tracks';
|
import { recordEvent } from 'lib/tracks';
|
||||||
import ThemeUploader from './uploader';
|
import ThemeUploader from './uploader';
|
||||||
import ThemePreview from './preview';
|
import ThemePreview from './preview';
|
||||||
|
import { getPriceValue } from 'dashboard/utils';
|
||||||
|
|
||||||
class Theme extends Component {
|
class Theme extends Component {
|
||||||
constructor() {
|
constructor() {
|
||||||
|
@ -68,12 +70,56 @@ class Theme extends Component {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async onChoose( theme, location = '' ) {
|
onChoose( theme, location = '' ) {
|
||||||
const { updateProfileItems } = this.props;
|
const { updateProfileItems } = this.props;
|
||||||
|
const { price, slug } = theme;
|
||||||
|
const { activeTheme = '' } = getSetting( 'onboarding', {} );
|
||||||
|
|
||||||
this.setState( { chosen: theme } );
|
this.setState( { chosen: slug } );
|
||||||
recordEvent( 'storeprofiler_store_theme_choose', { theme, location } );
|
recordEvent( 'storeprofiler_store_theme_choose', { theme: slug, location } );
|
||||||
updateProfileItems( { theme } );
|
|
||||||
|
if ( theme !== activeTheme && getPriceValue( price ) <= 0 ) {
|
||||||
|
this.installTheme( slug );
|
||||||
|
} else {
|
||||||
|
updateProfileItems( { theme: slug } );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
installTheme( slug ) {
|
||||||
|
const { createNotice } = this.props;
|
||||||
|
|
||||||
|
apiFetch( { path: '/wc-admin/onboarding/themes/install?theme=' + slug, method: 'POST' } )
|
||||||
|
.then( () => {
|
||||||
|
this.activateTheme( slug );
|
||||||
|
} )
|
||||||
|
.catch( response => {
|
||||||
|
this.setState( { chosen: null } );
|
||||||
|
createNotice( 'error', response.message );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
activateTheme( slug ) {
|
||||||
|
const { createNotice, updateProfileItems } = this.props;
|
||||||
|
|
||||||
|
apiFetch( { path: '/wc-admin/onboarding/themes/activate?theme=' + slug, method: 'POST' } )
|
||||||
|
.then( response => {
|
||||||
|
createNotice(
|
||||||
|
'success',
|
||||||
|
sprintf(
|
||||||
|
__( '%s was installed and activated on your site.', 'woocommerce-admin' ),
|
||||||
|
response.name
|
||||||
|
)
|
||||||
|
);
|
||||||
|
setSetting( 'onboarding', {
|
||||||
|
...getSetting( 'onboarding', {} ),
|
||||||
|
activeTheme: response.slug,
|
||||||
|
} );
|
||||||
|
updateProfileItems( { theme: slug } );
|
||||||
|
} )
|
||||||
|
.catch( response => {
|
||||||
|
this.setState( { chosen: null } );
|
||||||
|
createNotice( 'error', response.message );
|
||||||
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
onClosePreview() {
|
onClosePreview() {
|
||||||
|
@ -123,7 +169,7 @@ class Theme extends Component {
|
||||||
<Button
|
<Button
|
||||||
isPrimary={ Boolean( demo_url ) }
|
isPrimary={ Boolean( demo_url ) }
|
||||||
isDefault={ ! Boolean( demo_url ) }
|
isDefault={ ! Boolean( demo_url ) }
|
||||||
onClick={ () => this.onChoose( slug, 'card' ) }
|
onClick={ () => this.onChoose( theme, 'card' ) }
|
||||||
isBusy={ chosen === slug }
|
isBusy={ chosen === slug }
|
||||||
>
|
>
|
||||||
{ __( 'Choose', 'woocommerce-admin' ) }
|
{ __( 'Choose', 'woocommerce-admin' ) }
|
||||||
|
@ -148,7 +194,7 @@ class Theme extends Component {
|
||||||
}
|
}
|
||||||
if ( is_installed ) {
|
if ( is_installed ) {
|
||||||
return __( 'Installed', 'woocommerce-admin' );
|
return __( 'Installed', 'woocommerce-admin' );
|
||||||
} else if ( this.getPriceValue( price ) <= 0 ) {
|
} else if ( getPriceValue( price ) <= 0 ) {
|
||||||
return __( 'Free', 'woocommerce-admin' );
|
return __( 'Free', 'woocommerce-admin' );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,9 +218,9 @@ class Theme extends Component {
|
||||||
|
|
||||||
switch ( activeTab ) {
|
switch ( activeTab ) {
|
||||||
case 'paid':
|
case 'paid':
|
||||||
return allThemes.filter( theme => this.getPriceValue( theme.price ) > 0 );
|
return allThemes.filter( theme => getPriceValue( theme.price ) > 0 );
|
||||||
case 'free':
|
case 'free':
|
||||||
return allThemes.filter( theme => this.getPriceValue( theme.price ) <= 0 );
|
return allThemes.filter( theme => getPriceValue( theme.price ) <= 0 );
|
||||||
case 'all':
|
case 'all':
|
||||||
default:
|
default:
|
||||||
return allThemes;
|
return allThemes;
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
/**
|
/**
|
||||||
* External dependencies
|
* External dependencies
|
||||||
*/
|
*/
|
||||||
|
import { decodeEntities } from '@wordpress/html-entities';
|
||||||
import { without } from 'lodash';
|
import { without } from 'lodash';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -58,14 +59,23 @@ export function getProductIdsForCart( profileItems ) {
|
||||||
|
|
||||||
const theme = onboarding.themes.find( themeData => themeData.slug === profileItems.theme );
|
const theme = onboarding.themes.find( themeData => themeData.slug === profileItems.theme );
|
||||||
|
|
||||||
// @todo -- Split out free themes so that they are not considered for purchase, and install those from WordPress.org on the theme step.
|
if ( theme && theme.id && ! theme.is_installed && getPriceValue( theme.price ) > 0 ) {
|
||||||
if ( theme && theme.id && ! theme.is_installed ) {
|
|
||||||
productIds.push( theme.id );
|
productIds.push( theme.id );
|
||||||
}
|
}
|
||||||
|
|
||||||
return productIds;
|
return productIds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the value of a price from a string, removing any non-numeric characters.
|
||||||
|
*
|
||||||
|
* @param {string} string Price string.
|
||||||
|
* @return {number} Number value.
|
||||||
|
*/
|
||||||
|
export function getPriceValue( string ) {
|
||||||
|
return Number( decodeEntities( string ).replace( /[^0-9.-]+/g, '' ) );
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns if the onboarding feature of WooCommerce Admin should be enabled.
|
* Returns if the onboarding feature of WooCommerce Admin should be enabled.
|
||||||
*
|
*
|
||||||
|
|
|
@ -182,6 +182,7 @@ class OnboardingThemes extends \WC_REST_Data_Controller {
|
||||||
|
|
||||||
return( array(
|
return( array(
|
||||||
'slug' => $theme,
|
'slug' => $theme,
|
||||||
|
'name' => $installed_themes[ $theme ]->get( 'Name' ),
|
||||||
'status' => 'success',
|
'status' => 'success',
|
||||||
) );
|
) );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue