2021-09-21 19:33:44 +00:00
|
|
|
/**
|
|
|
|
* External dependencies
|
|
|
|
*/
|
|
|
|
import { __, sprintf } from '@wordpress/i18n';
|
|
|
|
import { Card, CardBody } from '@wordpress/components';
|
|
|
|
import {
|
|
|
|
OPTIONS_STORE_NAME,
|
|
|
|
PAYMENT_GATEWAYS_STORE_NAME,
|
|
|
|
PLUGINS_STORE_NAME,
|
|
|
|
} from '@woocommerce/data';
|
|
|
|
import { Plugins, Stepper } from '@woocommerce/components';
|
|
|
|
import { WooPaymentGatewaySetup } from '@woocommerce/onboarding';
|
|
|
|
import { recordEvent } from '@woocommerce/tracks';
|
|
|
|
import { useEffect, useState, useMemo } from '@wordpress/element';
|
|
|
|
import { useSelect, useDispatch } from '@wordpress/data';
|
|
|
|
import { useSlot } from '@woocommerce/experimental';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Internal dependencies
|
|
|
|
*/
|
|
|
|
import { createNoticesFromResponse } from '~/lib/notices';
|
2022-01-06 12:53:30 +00:00
|
|
|
import { enqueueScript } from '~/utils/enqueue-script';
|
2021-09-21 19:33:44 +00:00
|
|
|
import { Configure } from './Configure';
|
|
|
|
import './Setup.scss';
|
|
|
|
|
|
|
|
export const Setup = ( { markConfigured, paymentGateway } ) => {
|
|
|
|
const {
|
|
|
|
id,
|
|
|
|
plugins = [],
|
|
|
|
title,
|
|
|
|
postInstallScripts,
|
|
|
|
installed: gatewayInstalled,
|
|
|
|
} = paymentGateway;
|
|
|
|
const slot = useSlot( `woocommerce_payment_gateway_setup_${ id }` );
|
|
|
|
const hasFills = Boolean( slot?.fills?.length );
|
|
|
|
const [ isPluginLoaded, setIsPluginLoaded ] = useState( false );
|
|
|
|
|
|
|
|
useEffect( () => {
|
|
|
|
recordEvent( 'payments_task_stepper_view', {
|
|
|
|
payment_method: id,
|
|
|
|
} );
|
|
|
|
}, [] );
|
|
|
|
|
|
|
|
const { invalidateResolutionForStoreSelector } = useDispatch(
|
|
|
|
PAYMENT_GATEWAYS_STORE_NAME
|
|
|
|
);
|
|
|
|
|
2022-06-21 08:37:34 +00:00
|
|
|
const { isOptionUpdating, isPaymentGatewayResolving, needsPluginInstall } =
|
|
|
|
useSelect( ( select ) => {
|
|
|
|
const { isOptionsUpdating } = select( OPTIONS_STORE_NAME );
|
|
|
|
const { isResolving } = select( PAYMENT_GATEWAYS_STORE_NAME );
|
|
|
|
const activePlugins =
|
|
|
|
select( PLUGINS_STORE_NAME ).getActivePlugins();
|
|
|
|
const pluginsToInstall = plugins.filter(
|
|
|
|
( m ) => ! activePlugins.includes( m )
|
|
|
|
);
|
2021-09-21 19:33:44 +00:00
|
|
|
|
2022-06-21 08:37:34 +00:00
|
|
|
return {
|
|
|
|
isOptionUpdating: isOptionsUpdating(),
|
|
|
|
isPaymentGatewayResolving: isResolving( 'getPaymentGateways' ),
|
|
|
|
needsPluginInstall: !! pluginsToInstall.length,
|
|
|
|
};
|
|
|
|
} );
|
2021-09-21 19:33:44 +00:00
|
|
|
|
|
|
|
useEffect( () => {
|
|
|
|
if ( needsPluginInstall ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( postInstallScripts && postInstallScripts.length ) {
|
|
|
|
const scriptPromises = postInstallScripts.map( ( script ) =>
|
|
|
|
enqueueScript( script )
|
|
|
|
);
|
|
|
|
Promise.all( scriptPromises ).then( () => {
|
|
|
|
setIsPluginLoaded( true );
|
|
|
|
} );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
setIsPluginLoaded( true );
|
|
|
|
}, [ postInstallScripts, needsPluginInstall ] );
|
|
|
|
|
|
|
|
const installStep = useMemo( () => {
|
|
|
|
return plugins && plugins.length
|
|
|
|
? {
|
|
|
|
key: 'install',
|
|
|
|
label: sprintf(
|
|
|
|
/* translators: %s = title of the payment gateway to install */
|
2022-03-30 09:00:04 +00:00
|
|
|
__( 'Install %s', 'woocommerce' ),
|
2021-09-21 19:33:44 +00:00
|
|
|
title
|
|
|
|
),
|
|
|
|
content: (
|
|
|
|
<Plugins
|
|
|
|
onComplete={ ( installedPlugins, response ) => {
|
|
|
|
createNoticesFromResponse( response );
|
|
|
|
invalidateResolutionForStoreSelector(
|
|
|
|
'getPaymentGateways'
|
|
|
|
);
|
|
|
|
recordEvent(
|
|
|
|
'tasklist_payment_install_method',
|
|
|
|
{
|
|
|
|
plugins,
|
|
|
|
}
|
|
|
|
);
|
|
|
|
} }
|
|
|
|
onError={ ( errors, response ) =>
|
|
|
|
createNoticesFromResponse( response )
|
|
|
|
}
|
|
|
|
autoInstall
|
|
|
|
pluginSlugs={ plugins }
|
|
|
|
/>
|
|
|
|
),
|
|
|
|
}
|
|
|
|
: null;
|
|
|
|
}, [] );
|
|
|
|
|
|
|
|
const configureStep = useMemo(
|
|
|
|
() => ( {
|
|
|
|
key: 'configure',
|
|
|
|
label: sprintf(
|
2022-03-30 09:00:04 +00:00
|
|
|
__( 'Configure your %(title)s account', 'woocommerce' ),
|
2021-09-21 19:33:44 +00:00
|
|
|
{
|
|
|
|
title,
|
|
|
|
}
|
|
|
|
),
|
|
|
|
content: gatewayInstalled ? (
|
|
|
|
<Configure
|
|
|
|
markConfigured={ markConfigured }
|
|
|
|
paymentGateway={ paymentGateway }
|
|
|
|
/>
|
|
|
|
) : null,
|
|
|
|
} ),
|
|
|
|
[ gatewayInstalled ]
|
|
|
|
);
|
|
|
|
|
|
|
|
const stepperPending =
|
|
|
|
needsPluginInstall ||
|
|
|
|
isOptionUpdating ||
|
|
|
|
isPaymentGatewayResolving ||
|
|
|
|
! isPluginLoaded;
|
|
|
|
|
|
|
|
const defaultStepper = (
|
|
|
|
<Stepper
|
|
|
|
isVertical
|
|
|
|
isPending={ stepperPending }
|
|
|
|
currentStep={ needsPluginInstall ? 'install' : 'configure' }
|
|
|
|
steps={ [ installStep, configureStep ].filter( Boolean ) }
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
|
|
|
|
return (
|
|
|
|
<Card className="woocommerce-task-payment-method woocommerce-task-card">
|
|
|
|
<CardBody>
|
|
|
|
{ hasFills ? (
|
|
|
|
<WooPaymentGatewaySetup.Slot
|
|
|
|
fillProps={ {
|
|
|
|
defaultStepper,
|
|
|
|
defaultInstallStep: installStep,
|
|
|
|
defaultConfigureStep: configureStep,
|
|
|
|
markConfigured: () => markConfigured( id ),
|
|
|
|
paymentGateway,
|
|
|
|
} }
|
|
|
|
id={ id }
|
|
|
|
/>
|
|
|
|
) : (
|
|
|
|
defaultStepper
|
|
|
|
) }
|
|
|
|
</CardBody>
|
|
|
|
</Card>
|
|
|
|
);
|
|
|
|
};
|