/** * External dependencies */ import { __ } from '@wordpress/i18n'; import { Component } from '@wordpress/element'; import { compose } from '@wordpress/compose'; import { withDispatch } from '@wordpress/data'; import { get } from 'lodash'; import interpolateComponents from 'interpolate-components'; import { Button, CheckboxControl, FormToggle, Modal, } from '@wordpress/components'; /** * Internal dependencies */ import { Link } from '@woocommerce/components'; import withSelect from 'wc-api/with-select'; class UsageModal extends Component { constructor( props ) { super( props ); this.state = { allowTracking: props.allowTracking, isLoadingScripts: false, }; this.onTrackingChange = this.onTrackingChange.bind( this ); } onTrackingChange() { this.setState( { allowTracking: ! this.state.allowTracking, } ); } async componentDidUpdate( prevProps, prevState ) { const { hasErrors, isRequesting, onClose, onContinue, createNotice, } = this.props; const { isLoadingScripts } = this.state; const isRequestSuccessful = ! isRequesting && ! isLoadingScripts && ( prevProps.isRequesting || prevState.isLoadingScripts ) && ! hasErrors; const isRequestError = ! isRequesting && prevProps.isRequesting && hasErrors; if ( isRequestSuccessful ) { onClose(); onContinue(); } if ( isRequestError ) { createNotice( 'error', __( 'There was a problem updating your preferences.', 'woocommerce-admin' ) ); onClose(); } } updateTracking() { const { allowTracking } = this.state; const { updateOptions } = this.props; if ( allowTracking && typeof window.wcTracks.enable === 'function' ) { this.setState( { isLoadingScripts: true } ); window.wcTracks.enable( () => { this.setState( { isLoadingScripts: false } ); } ); } else if ( ! allowTracking ) { window.wcTracks.isEnabled = false; } const trackingValue = allowTracking ? 'yes' : 'no'; updateOptions( { woocommerce_allow_tracking: trackingValue, } ); } render() { const { allowTracking } = this.state; const { isRequesting } = this.props; const trackingMessage = interpolateComponents( { mixedString: __( 'Get improved features and faster fixes by sharing non-sensitive data via {{link}}usage tracking{{/link}} ' + 'that shows us how WooCommerce is used. No personal data is tracked or stored.', 'woocommerce-admin' ), components: { link: ( ), }, } ); return ( this.props.onClose() } className="woocommerce-profile-wizard__usage-modal" > { trackingMessage } e.stopPropagation() } tabIndex="-1" /> this.updateTracking() } > { __( 'Continue', 'woocommerce-admin' ) } ); } } export default compose( withSelect( ( select ) => { const { getOptions, getOptionsError, isUpdateOptionsRequesting, } = select( 'wc-api' ); const options = getOptions( [ 'woocommerce_allow_tracking' ] ); const allowTracking = get( options, [ 'woocommerce_allow_tracking' ], false ) === 'yes'; const isRequesting = Boolean( isUpdateOptionsRequesting( [ 'woocommerce_allow_tracking' ] ) ); const hasErrors = Boolean( getOptionsError( [ 'woocommerce_allow_tracking' ] ) ); return { allowTracking, isRequesting, hasErrors, }; } ), withDispatch( ( dispatch ) => { const { createNotice } = dispatch( 'core/notices' ); const { updateOptions } = dispatch( 'wc-api' ); return { createNotice, updateOptions, }; } ) )( UsageModal );