/**
* External dependencies
*/
import { __ } from '@wordpress/i18n';
import { useDispatch, useSelect } from '@wordpress/data';
import {
OPTIONS_STORE_NAME,
ONBOARDING_STORE_NAME,
PAYMENT_GATEWAYS_STORE_NAME,
SETTINGS_STORE_NAME,
} from '@woocommerce/data';
import { recordEvent } from '@woocommerce/tracks';
import { useMemo, useCallback, useEffect } from '@wordpress/element';
import { registerPlugin } from '@wordpress/plugins';
import { WooOnboardingTask } from '@woocommerce/onboarding';
import { getNewPath } from '@woocommerce/navigation';
import { Button } from '@wordpress/components';
import ExternalIcon from 'gridicons/dist/external';
/**
* Internal dependencies
*/
import { List, Placeholder as ListPlaceholder } from './components/List';
import { Setup, Placeholder as SetupPlaceholder } from './components/Setup';
import { WCPaySuggestion } from './components/WCPay';
import { WCPayBNPLSuggestion } from './components/WCPayBNPL';
import { getCountryCode } from '~/dashboard/utils';
import {
getEnrichedPaymentGateways,
getSplitGateways,
getIsWCPayOrOtherCategoryDoneSetup,
getIsGatewayWCPay,
comparePaymentGatewaysByPriority,
} from './utils';
import './plugins/Bacs';
import './payment-gateway-suggestions.scss';
export const PaymentGatewaySuggestions = ( { onComplete, query } ) => {
const { updatePaymentGateway } = useDispatch( PAYMENT_GATEWAYS_STORE_NAME );
const {
getPaymentGateway,
paymentGatewaySuggestions,
installedPaymentGateways,
isResolving,
countryCode,
} = useSelect( ( select ) => {
const { getSettings } = select( SETTINGS_STORE_NAME );
const { general: settings = {} } = getSettings( 'general' );
return {
getPaymentGateway: select( PAYMENT_GATEWAYS_STORE_NAME )
.getPaymentGateway,
getOption: select( OPTIONS_STORE_NAME ).getOption,
installedPaymentGateways: select(
PAYMENT_GATEWAYS_STORE_NAME
).getPaymentGateways(),
isResolving: select( ONBOARDING_STORE_NAME ).isResolving(
'getPaymentGatewaySuggestions'
),
paymentGatewaySuggestions: select(
ONBOARDING_STORE_NAME
).getPaymentGatewaySuggestions( true ),
countryCode: getCountryCode( settings.woocommerce_default_country ),
};
}, [] );
const paymentGateways = useMemo(
() =>
getEnrichedPaymentGateways(
installedPaymentGateways,
paymentGatewaySuggestions
),
[ installedPaymentGateways, paymentGatewaySuggestions ]
);
const enablePaymentGateway = ( id ) => {
if ( ! id ) {
return;
}
const gateway = getPaymentGateway( id );
if ( ! gateway ) {
return;
}
updatePaymentGateway( id, {
enabled: true,
} ).then( () => {
onComplete(
// use the paymentGateways variable.
// gateway variable doesn't have hasPlugins property.
! paymentGateways.get( id )?.hasPlugins
? {
redirectPath: getNewPath(
{ task: 'payments' },
{},
'/'
),
}
: {}
);
} );
};
const markConfigured = useCallback(
async ( id ) => {
if ( ! paymentGateways.get( id ) ) {
throw `Payment gateway ${ id } not found in available gateways list`;
}
recordEvent( 'tasklist_payment_connect_method', {
payment_method: id,
} );
enablePaymentGateway( id );
},
[ paymentGateways ]
);
const recommendation = useMemo(
() =>
Array.from( paymentGateways.values() )
.filter( ( gateway ) => gateway.recommendation_priority )
.sort( comparePaymentGatewaysByPriority )
.map( ( gateway ) => gateway.id )
.shift(),
[ paymentGateways ]
);
const currentGateway = useMemo( () => {
if ( ! query.id || isResolving || ! paymentGateways.size ) {
return null;
}
const gateway = paymentGateways.get( query.id );
if ( ! gateway ) {
throw `Current gateway ${ query.id } not found in available gateways list`;
}
return gateway;
}, [ isResolving, query, paymentGateways ] );
const isWCPayOrOtherCategoryDoneSetup = useMemo(
() =>
getIsWCPayOrOtherCategoryDoneSetup( paymentGateways, countryCode ),
[ countryCode, paymentGateways ]
);
const isWCPaySupported =
Array.from( paymentGateways.values() ).findIndex(
getIsGatewayWCPay
) !== -1;
const [
wcPayGateway,
offlineGateways,
additionalGateways,
wcPayBnplGateway,
] = useMemo(
() =>
getSplitGateways(
paymentGateways,
countryCode,
isWCPaySupported,
isWCPayOrOtherCategoryDoneSetup
),
[
paymentGateways,
countryCode,
isWCPaySupported,
isWCPayOrOtherCategoryDoneSetup,
]
);
useEffect( () => {
let shownGateways = [];
if ( ! currentGateway ) {
if ( wcPayGateway.length ) {
shownGateways.push( wcPayGateway[ 0 ].id );
}
if ( wcPayBnplGateway.length ) {
shownGateways.push( wcPayBnplGateway[ 0 ].id );
}
if ( additionalGateways.length ) {
shownGateways = shownGateways.concat(
additionalGateways.map( ( g ) => g.id )
);
}
if ( shownGateways.length ) {
recordEvent( 'tasklist_payments_options', {
options: shownGateways,
} );
}
}
}, [ additionalGateways, currentGateway, wcPayGateway, wcPayBnplGateway ] );
const trackSeeMore = () => {
recordEvent( 'tasklist_payment_see_more', {} );
};
if ( query.id && ! currentGateway ) {
return
{ __( 'See more', 'woocommerce' ) }
);
const offlineSection = !! offlineGateways.length && (
);
return (