/** * External dependencies */ import { __, _n, sprintf } from '@wordpress/i18n'; import { Button, Card, CardBody, CardFooter } from '@wordpress/components'; import { useEffect, useState } from '@wordpress/element'; import { useDispatch, useSelect } from '@wordpress/data'; import interpolateComponents from 'interpolate-components'; import { Link } from '@woocommerce/components'; import { pluginNames, ONBOARDING_STORE_NAME, PLUGINS_STORE_NAME, OPTIONS_STORE_NAME, } from '@woocommerce/data'; import { recordEvent } from '@woocommerce/tracks'; import { Text } from '@woocommerce/experimental'; /** * Internal dependencies */ import { Benefits } from './benefits'; import { createNoticesFromResponse } from '../../../lib/notices'; import Logo from './logo'; export const BenefitsLayout = ( { goToNextStep } ) => { const { activePlugins, isJetpackConnected, isProfileItemsError, isUpdatingProfileItems, } = useSelect( ( select ) => { const { getOnboardingError, isOnboardingRequesting } = select( ONBOARDING_STORE_NAME ); const { getActivePlugins } = select( PLUGINS_STORE_NAME ); return { activePlugins: getActivePlugins(), isJetpackConnected: select( PLUGINS_STORE_NAME ).isJetpackConnected(), isProfileItemsError: Boolean( getOnboardingError( 'updateProfileItems' ) ), isUpdatingProfileItems: isOnboardingRequesting( 'updateProfileItems' ), }; } ); const { createNotice } = useDispatch( 'core/notices' ); const { updateOptions } = useDispatch( OPTIONS_STORE_NAME ); const { updateProfileItems } = useDispatch( ONBOARDING_STORE_NAME ); const { installAndActivatePlugins } = useDispatch( PLUGINS_STORE_NAME ); const pluginsRemaining = [ 'jetpack', 'woocommerce-services' ].filter( ( plugin ) => ! activePlugins.includes( plugin ) ); // Cache the initial plugin list so we don't change benefits midway through activation. const [ pluginsToInstall ] = useState( pluginsRemaining ); const [ isInstalling, setIsInstalling ] = useState( false ); const isJetpackActive = ! pluginsToInstall.includes( 'jetpack' ); const isWcsActive = ! pluginsToInstall.includes( 'woocommerce-services' ); const isComplete = isWcsActive && isJetpackActive && isJetpackConnected; useEffect( () => { // Skip this step if already complete. if ( isComplete ) { goToNextStep(); return; } recordEvent( 'storeprofiler_plugins_to_install', { plugins: pluginsToInstall, } ); }, [] ); if ( isComplete ) { return null; } const skipPluginInstall = async () => { const plugins = isJetpackActive ? 'skipped-wcs' : 'skipped'; await updateProfileItems( { plugins } ); if ( isProfileItemsError ) { createNotice( 'error', __( 'There was a problem updating your preferences', 'woocommerce-admin' ) ); } else { recordEvent( 'storeprofiler_install_plugins', { install: false, plugins, } ); } goToNextStep(); }; const startPluginInstall = () => { const plugins = isJetpackActive ? 'installed-wcs' : 'installed'; setIsInstalling( true ); recordEvent( 'storeprofiler_install_plugins', { install: true, plugins, } ); Promise.all( [ pluginsToInstall.length ? installAndActivatePlugins( pluginsToInstall ) : null, updateProfileItems( { plugins } ), updateOptions( { woocommerce_setup_jetpack_opted_in: true, } ), ] ) .then( () => { setIsInstalling( false ); goToNextStep(); } ) .catch( ( pluginError, profileError ) => { if ( pluginError ) { createNoticesFromResponse( pluginError ); } if ( profileError ) { createNotice( 'error', __( 'There was a problem updating your preferences', 'woocommerce-admin' ) ); } setIsInstalling( false ); goToNextStep(); } ); }; const pluginNamesString = pluginsToInstall .map( ( pluginSlug ) => pluginNames[ pluginSlug ] ) .join( ' ' + __( 'and', 'woocommerce-admin' ) + ' ' ); const isAcceptingTos = ! isWcsActive; const pluralizedPlugins = _n( 'plugin', 'plugins', pluginsToInstall.length, 'woocommerce-admin' ); return (
{ sprintf( /* translators: %s = names of plugins to install, e.g. Jetpack and Woocommerce Services */ __( 'Enhance your store with %s', 'woocommerce-admin' ), pluginNamesString ) }
{ !! pluginsToInstall.length && (

{ isAcceptingTos ? interpolateComponents( { mixedString: sprintf( /* translators: %1$s: names of plugins to install, e.g. Jetpack and Woocommerce Services, %2$s: singular or plural form of 'plugins' */ __( '%1$s %2$s will be installed & activated for free, and you agree to our {{link}}Terms of Service{{/link}}.', 'woocommerce-admin' ), pluginNamesString, pluralizedPlugins ), components: { link: ( ), }, } ) : sprintf( /* translators: %1$s: names of plugins to install, e.g. Jetpack and Woocommerce Services, %2$s: singular or plural form of 'plugins' */ __( '%1$s %2$s will be installed & activated for free.', 'woocommerce-admin' ), pluginNamesString, pluralizedPlugins ) }

) }
); };