2019-05-28 14:05:55 +00:00
|
|
|
/**
|
|
|
|
* External dependencies
|
|
|
|
*/
|
2019-05-30 06:31:07 +00:00
|
|
|
import { __ } from '@wordpress/i18n';
|
2019-05-28 14:05:55 +00:00
|
|
|
import { Component, Fragment } from '@wordpress/element';
|
2019-12-02 17:39:22 +00:00
|
|
|
import { Button, CheckboxControl } from '@wordpress/components';
|
2019-05-30 06:31:07 +00:00
|
|
|
import { compose } from '@wordpress/compose';
|
2020-03-19 12:13:14 +00:00
|
|
|
import { filter, find, findIndex, get } from 'lodash';
|
2019-05-30 06:31:07 +00:00
|
|
|
import { withDispatch } from '@wordpress/data';
|
|
|
|
|
2019-09-23 21:47:08 +00:00
|
|
|
/**
|
|
|
|
* WooCommerce Dependencies
|
|
|
|
*/
|
|
|
|
import { getSetting } from '@woocommerce/wc-admin-settings';
|
2020-05-28 08:51:40 +00:00
|
|
|
import { ONBOARDING_STORE_NAME, SETTINGS_STORE_NAME } from '@woocommerce/data';
|
2019-09-23 21:47:08 +00:00
|
|
|
|
2019-05-30 06:31:07 +00:00
|
|
|
/**
|
|
|
|
* Internal dependencies
|
|
|
|
*/
|
2020-03-02 22:22:32 +00:00
|
|
|
import { H, Card, TextControl } from '@woocommerce/components';
|
2020-04-14 01:41:51 +00:00
|
|
|
import { getCurrencyRegion } from 'dashboard/utils';
|
2019-05-30 06:31:07 +00:00
|
|
|
import withSelect from 'wc-api/with-select';
|
2019-07-01 18:13:29 +00:00
|
|
|
import { recordEvent } from 'lib/tracks';
|
2019-05-28 14:05:55 +00:00
|
|
|
|
2019-09-23 21:47:08 +00:00
|
|
|
const onboarding = getSetting( 'onboarding', {} );
|
|
|
|
|
2019-05-28 14:05:55 +00:00
|
|
|
class Industry extends Component {
|
2019-11-05 00:05:20 +00:00
|
|
|
constructor( props ) {
|
|
|
|
const profileItems = get( props, 'profileItems', {} );
|
2020-04-14 01:41:51 +00:00
|
|
|
let selected = profileItems.industry || [];
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @todo Remove block on `updateProfileItems` refactor to wp.data dataStores.
|
|
|
|
*
|
|
|
|
* The following block is a side effect of wc-api not being truly async
|
|
|
|
* and is a temporary fix until a refactor to wp.data can take place.
|
|
|
|
*
|
|
|
|
* Calls to `updateProfileItems` in the previous screen happen async
|
|
|
|
* and won't be updated in wc-api's state when this component is initialized.
|
|
|
|
* As such, we need to make sure cbd is not initialized as selected when a
|
|
|
|
* user has changed location to non-US based.
|
|
|
|
*/
|
|
|
|
const { locationSettings } = props;
|
|
|
|
const region = getCurrencyRegion(
|
|
|
|
locationSettings.woocommerce_default_country
|
|
|
|
);
|
|
|
|
|
|
|
|
if ( region !== 'US' ) {
|
|
|
|
const cbdSlug = 'cbd-other-hemp-derived-products';
|
|
|
|
selected = selected.filter( ( industry ) => {
|
|
|
|
return cbdSlug !== industry && cbdSlug !== industry.slug;
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* End block to be removed after refactor.
|
|
|
|
*/
|
2019-11-05 00:05:20 +00:00
|
|
|
|
2019-05-28 14:05:55 +00:00
|
|
|
super();
|
|
|
|
this.state = {
|
2019-07-15 11:09:31 +00:00
|
|
|
error: null,
|
2020-04-14 01:41:51 +00:00
|
|
|
selected,
|
2020-03-02 22:22:32 +00:00
|
|
|
textInputListContent: {},
|
2019-05-28 14:05:55 +00:00
|
|
|
};
|
2019-05-30 06:31:07 +00:00
|
|
|
this.onContinue = this.onContinue.bind( this );
|
2020-03-02 22:22:32 +00:00
|
|
|
this.onIndustryChange = this.onIndustryChange.bind( this );
|
|
|
|
this.onDetailChange = this.onDetailChange.bind( this );
|
2019-05-30 06:31:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
async onContinue() {
|
2019-07-15 11:09:31 +00:00
|
|
|
await this.validateField();
|
|
|
|
if ( this.state.error ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-02-14 02:23:21 +00:00
|
|
|
const {
|
|
|
|
createNotice,
|
|
|
|
goToNextStep,
|
|
|
|
isError,
|
|
|
|
updateProfileItems,
|
|
|
|
} = this.props;
|
2020-03-02 22:22:32 +00:00
|
|
|
const selectedIndustriesList = this.state.selected.map(
|
|
|
|
( industry ) => industry.slug
|
|
|
|
);
|
2020-03-19 12:13:14 +00:00
|
|
|
|
|
|
|
// Here the selected industries are converted to a string that is a comma separated list
|
|
|
|
const industriesWithDetail = this.state.selected
|
|
|
|
.map( ( industry ) => industry.detail )
|
|
|
|
.filter( ( n ) => n )
|
|
|
|
.join( ',' );
|
2019-05-30 06:31:07 +00:00
|
|
|
|
2020-02-14 02:23:21 +00:00
|
|
|
recordEvent( 'storeprofiler_store_industry_continue', {
|
2020-03-02 22:22:32 +00:00
|
|
|
store_industry: selectedIndustriesList,
|
|
|
|
industries_with_detail: industriesWithDetail,
|
2020-02-14 02:23:21 +00:00
|
|
|
} );
|
2019-05-30 06:31:07 +00:00
|
|
|
await updateProfileItems( { industry: this.state.selected } );
|
|
|
|
|
|
|
|
if ( ! isError ) {
|
|
|
|
goToNextStep();
|
|
|
|
} else {
|
2019-07-23 03:26:46 +00:00
|
|
|
createNotice(
|
|
|
|
'error',
|
2020-02-14 02:23:21 +00:00
|
|
|
__(
|
|
|
|
'There was a problem updating your industries.',
|
|
|
|
'woocommerce-admin'
|
|
|
|
)
|
2019-07-23 03:26:46 +00:00
|
|
|
);
|
2019-05-30 06:31:07 +00:00
|
|
|
}
|
2019-05-28 14:05:55 +00:00
|
|
|
}
|
2019-05-30 06:31:07 +00:00
|
|
|
|
2019-07-15 11:09:31 +00:00
|
|
|
async validateField() {
|
|
|
|
const error = this.state.selected.length
|
|
|
|
? null
|
|
|
|
: __( 'Please select at least one industry', 'woocommerce-admin' );
|
|
|
|
this.setState( { error } );
|
|
|
|
}
|
|
|
|
|
2020-03-02 22:22:32 +00:00
|
|
|
onIndustryChange( slug ) {
|
2019-07-15 11:09:31 +00:00
|
|
|
this.setState(
|
2020-02-14 02:23:21 +00:00
|
|
|
( state ) => {
|
2020-03-02 22:22:32 +00:00
|
|
|
const newSelected = state.selected;
|
|
|
|
const selectedIndustry = find( newSelected, { slug } );
|
|
|
|
if ( selectedIndustry ) {
|
|
|
|
const newTextInputListContent = state.textInputListContent;
|
|
|
|
newTextInputListContent[ slug ] = selectedIndustry.detail;
|
2019-07-15 11:09:31 +00:00
|
|
|
return {
|
|
|
|
selected:
|
2020-02-14 02:23:21 +00:00
|
|
|
filter( state.selected, ( value ) => {
|
2020-03-02 22:22:32 +00:00
|
|
|
return value.slug !== slug;
|
2019-07-15 11:09:31 +00:00
|
|
|
} ) || [],
|
2020-03-02 22:22:32 +00:00
|
|
|
textInputListContent: newTextInputListContent,
|
2019-07-15 11:09:31 +00:00
|
|
|
};
|
|
|
|
}
|
2020-03-02 22:22:32 +00:00
|
|
|
newSelected.push( {
|
|
|
|
slug,
|
|
|
|
detail: state.textInputListContent[ slug ],
|
|
|
|
} );
|
2019-05-30 06:31:07 +00:00
|
|
|
return {
|
2019-07-15 11:09:31 +00:00
|
|
|
selected: newSelected,
|
2019-05-30 06:31:07 +00:00
|
|
|
};
|
2019-07-15 11:09:31 +00:00
|
|
|
},
|
|
|
|
() => this.validateField()
|
|
|
|
);
|
2019-05-30 06:31:07 +00:00
|
|
|
}
|
|
|
|
|
2020-03-02 22:22:32 +00:00
|
|
|
onDetailChange( value, slug ) {
|
|
|
|
this.setState( ( state ) => {
|
|
|
|
const newSelected = state.selected;
|
|
|
|
const newTextInputListContent = state.textInputListContent;
|
|
|
|
const industryIndex = findIndex( newSelected, { slug } );
|
|
|
|
newSelected[ industryIndex ].detail = value;
|
|
|
|
newTextInputListContent[ slug ] = value;
|
|
|
|
return {
|
|
|
|
selected: newSelected,
|
|
|
|
textInputListContent: newTextInputListContent,
|
|
|
|
};
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
|
2019-05-28 14:05:55 +00:00
|
|
|
render() {
|
2019-09-23 21:47:08 +00:00
|
|
|
const { industries } = onboarding;
|
2020-03-02 22:22:32 +00:00
|
|
|
const { error, selected, textInputListContent } = this.state;
|
2020-04-14 01:41:51 +00:00
|
|
|
const { locationSettings } = this.props;
|
|
|
|
const region = getCurrencyRegion(
|
|
|
|
locationSettings.woocommerce_default_country
|
|
|
|
);
|
|
|
|
const industryKeys = Object.keys( industries );
|
|
|
|
|
|
|
|
const filteredIndustryKeys =
|
|
|
|
region === 'US'
|
|
|
|
? industryKeys
|
|
|
|
: industryKeys.filter(
|
|
|
|
( slug ) => slug !== 'cbd-other-hemp-derived-products'
|
|
|
|
);
|
2019-11-05 00:05:20 +00:00
|
|
|
|
2019-05-28 14:05:55 +00:00
|
|
|
return (
|
|
|
|
<Fragment>
|
2019-05-30 06:31:07 +00:00
|
|
|
<H className="woocommerce-profile-wizard__header-title">
|
2020-02-14 02:23:21 +00:00
|
|
|
{ __(
|
|
|
|
'In which industry does the store operate?',
|
|
|
|
'woocommerce-admin'
|
|
|
|
) }
|
2019-05-30 06:31:07 +00:00
|
|
|
</H>
|
2020-07-30 17:58:10 +00:00
|
|
|
<H className="woocommerce-profile-wizard__header-subtitle">
|
2019-07-10 23:19:32 +00:00
|
|
|
{ __( 'Choose any that apply' ) }
|
2020-07-30 17:58:10 +00:00
|
|
|
</H>
|
2019-11-04 00:23:26 +00:00
|
|
|
<Card>
|
2019-05-30 06:31:07 +00:00
|
|
|
<div className="woocommerce-profile-wizard__checkbox-group">
|
2020-04-14 01:41:51 +00:00
|
|
|
{ filteredIndustryKeys.map( ( slug ) => {
|
2020-03-02 22:22:32 +00:00
|
|
|
const selectedIndustry = find( selected, { slug } );
|
|
|
|
|
2019-05-30 06:31:07 +00:00
|
|
|
return (
|
2020-03-02 22:22:32 +00:00
|
|
|
<div key={ `div-${ slug }` }>
|
|
|
|
<CheckboxControl
|
|
|
|
key={ `checkbox-control-${ slug }` }
|
|
|
|
label={ industries[ slug ].label }
|
|
|
|
onChange={ () =>
|
|
|
|
this.onIndustryChange( slug )
|
|
|
|
}
|
|
|
|
checked={ selectedIndustry || false }
|
|
|
|
className="woocommerce-profile-wizard__checkbox"
|
|
|
|
/>
|
|
|
|
{ industries[ slug ].use_description &&
|
|
|
|
selectedIndustry && (
|
|
|
|
<TextControl
|
|
|
|
key={ `text-control-${ selectedIndustry.slug }` }
|
|
|
|
label={
|
|
|
|
industries[
|
|
|
|
selectedIndustry.slug
|
|
|
|
].description_label
|
|
|
|
}
|
|
|
|
value={
|
|
|
|
selectedIndustry.detail ||
|
|
|
|
textInputListContent[
|
|
|
|
slug
|
|
|
|
] ||
|
|
|
|
''
|
|
|
|
}
|
|
|
|
onChange={ ( value ) =>
|
|
|
|
this.onDetailChange(
|
|
|
|
value,
|
|
|
|
selectedIndustry.slug
|
|
|
|
)
|
|
|
|
}
|
|
|
|
className="woocommerce-profile-wizard__text"
|
|
|
|
/>
|
|
|
|
) }
|
|
|
|
</div>
|
2019-05-30 06:31:07 +00:00
|
|
|
);
|
|
|
|
} ) }
|
2020-02-14 02:23:21 +00:00
|
|
|
{ error && (
|
|
|
|
<span className="woocommerce-profile-wizard__error">
|
|
|
|
{ error }
|
|
|
|
</span>
|
|
|
|
) }
|
2019-05-30 06:31:07 +00:00
|
|
|
</div>
|
|
|
|
|
2020-07-15 11:24:00 +00:00
|
|
|
<div className="woocommerce-profile-wizard__card-actions">
|
|
|
|
<Button
|
|
|
|
isPrimary
|
|
|
|
onClick={ this.onContinue }
|
|
|
|
disabled={ ! selected.length }
|
|
|
|
>
|
|
|
|
{ __( 'Continue', 'woocommerce-admin' ) }
|
|
|
|
</Button>
|
|
|
|
</div>
|
2019-05-30 06:31:07 +00:00
|
|
|
</Card>
|
2019-05-28 14:05:55 +00:00
|
|
|
</Fragment>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-05-30 06:31:07 +00:00
|
|
|
export default compose(
|
2020-02-14 02:23:21 +00:00
|
|
|
withSelect( ( select ) => {
|
2020-07-15 11:24:00 +00:00
|
|
|
const { getProfileItems, getOnboardingError } = select(
|
|
|
|
ONBOARDING_STORE_NAME
|
|
|
|
);
|
2020-04-14 01:41:51 +00:00
|
|
|
const { getSettings } = select( SETTINGS_STORE_NAME );
|
|
|
|
const { general: locationSettings = {} } = getSettings( 'general' );
|
2019-05-30 06:31:07 +00:00
|
|
|
|
2019-11-05 00:05:20 +00:00
|
|
|
return {
|
2020-05-28 08:51:40 +00:00
|
|
|
isError: Boolean( getOnboardingError( 'updateProfileItems' ) ),
|
2019-11-05 00:05:20 +00:00
|
|
|
profileItems: getProfileItems(),
|
2020-04-14 01:41:51 +00:00
|
|
|
locationSettings,
|
2019-11-05 00:05:20 +00:00
|
|
|
};
|
2019-05-30 06:31:07 +00:00
|
|
|
} ),
|
2020-02-14 02:23:21 +00:00
|
|
|
withDispatch( ( dispatch ) => {
|
2020-05-28 08:51:40 +00:00
|
|
|
const { updateProfileItems } = dispatch( ONBOARDING_STORE_NAME );
|
2019-07-23 03:26:46 +00:00
|
|
|
const { createNotice } = dispatch( 'core/notices' );
|
2019-05-30 06:31:07 +00:00
|
|
|
|
|
|
|
return {
|
2019-07-23 03:26:46 +00:00
|
|
|
createNotice,
|
2019-05-30 06:31:07 +00:00
|
|
|
updateProfileItems,
|
|
|
|
};
|
|
|
|
} )
|
|
|
|
)( Industry );
|