2022-04-15 10:38:11 +00:00
|
|
|
/**
|
|
|
|
* Internal dependencies
|
|
|
|
*/
|
|
|
|
import { getPluginSlug } from '~/utils';
|
|
|
|
|
|
|
|
export const comparePaymentGatewaysByPriority = ( a, b ) =>
|
|
|
|
a.recommendation_priority - b.recommendation_priority;
|
|
|
|
|
|
|
|
export const getIsGatewayWCPay = ( gateway ) =>
|
|
|
|
gateway.plugins?.length === 1 &&
|
|
|
|
gateway.plugins[ 0 ] === 'woocommerce-payments';
|
|
|
|
|
|
|
|
export const getIsGatewayOtherCategory = ( gateway, countryCode ) =>
|
|
|
|
gateway.category_other &&
|
|
|
|
gateway.category_other.indexOf( countryCode ) !== -1;
|
|
|
|
|
|
|
|
export const getIsGatewayAdditionalCategory = ( gateway, countryCode ) =>
|
|
|
|
gateway.category_additional &&
|
|
|
|
gateway.category_additional.indexOf( countryCode ) !== -1;
|
|
|
|
|
|
|
|
export const getEnrichedPaymentGateways = (
|
|
|
|
installedPaymentGateways,
|
|
|
|
paymentGatewaySuggestions
|
|
|
|
) => {
|
|
|
|
const mappedPaymentGateways = installedPaymentGateways.reduce(
|
|
|
|
( map, gateway ) => {
|
|
|
|
map[ gateway.id ] = gateway;
|
|
|
|
return map;
|
|
|
|
},
|
|
|
|
{}
|
|
|
|
);
|
|
|
|
|
|
|
|
return paymentGatewaySuggestions.reduce( ( map, suggestion ) => {
|
|
|
|
// A colon ':' is used sometimes to have multiple configs for the same gateway ex: woocommerce_payments:us.
|
|
|
|
const id = getPluginSlug( suggestion.id );
|
|
|
|
const installedGateway = mappedPaymentGateways[ id ]
|
|
|
|
? mappedPaymentGateways[ id ]
|
|
|
|
: {};
|
|
|
|
|
|
|
|
const enrichedSuggestion = {
|
|
|
|
installed: !! mappedPaymentGateways[ id ],
|
|
|
|
postInstallScripts: installedGateway.post_install_scripts,
|
|
|
|
hasPlugins: !! ( suggestion.plugins && suggestion.plugins.length ),
|
|
|
|
enabled: installedGateway.enabled || false,
|
|
|
|
needsSetup: installedGateway.needs_setup,
|
|
|
|
settingsUrl: installedGateway.settings_url,
|
|
|
|
connectionUrl: installedGateway.connection_url,
|
|
|
|
setupHelpText: installedGateway.setup_help_text,
|
|
|
|
title: installedGateway.title,
|
|
|
|
requiredSettings: installedGateway.required_settings_keys
|
|
|
|
? installedGateway.required_settings_keys
|
|
|
|
.map(
|
|
|
|
( settingKey ) =>
|
|
|
|
installedGateway.settings[ settingKey ]
|
|
|
|
)
|
|
|
|
.filter( Boolean )
|
|
|
|
: [],
|
|
|
|
...suggestion,
|
|
|
|
};
|
|
|
|
|
|
|
|
map.set( suggestion.id, enrichedSuggestion );
|
|
|
|
return map;
|
|
|
|
}, new Map() );
|
|
|
|
};
|
|
|
|
|
|
|
|
export const getIsWCPayOrOtherCategoryDoneSetup = (
|
|
|
|
paymentGateways,
|
|
|
|
countryCode
|
|
|
|
) => {
|
|
|
|
for ( const [ , gateway ] of paymentGateways.entries() ) {
|
|
|
|
if ( ! gateway.installed || gateway.needsSetup ) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( getIsGatewayWCPay( gateway ) ) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( getIsGatewayOtherCategory( gateway, countryCode ) ) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
};
|
|
|
|
|
2023-06-16 15:46:37 +00:00
|
|
|
/**
|
|
|
|
* Splits up gateways to WCPay, offline and main list.
|
|
|
|
*
|
|
|
|
* @param {Array} paymentGateways Payment gateway list.
|
|
|
|
* @param {string} countryCode Store country code.
|
|
|
|
* @param {boolean} isWCPaySupported Whether WCPay is supported in the store.
|
|
|
|
* @param {boolean} isWCPayOrOtherCategoryDoneSetup Whether WCPay or "other" category gateway is done setup.
|
2024-07-12 09:40:24 +00:00
|
|
|
* @return {Array} Array of [ WCPay, offline, main list, WCPayBNPL ].
|
2023-06-16 15:46:37 +00:00
|
|
|
*/
|
2022-04-15 10:38:11 +00:00
|
|
|
export const getSplitGateways = (
|
|
|
|
paymentGateways,
|
|
|
|
countryCode,
|
|
|
|
isWCPaySupported,
|
|
|
|
isWCPayOrOtherCategoryDoneSetup
|
|
|
|
) =>
|
|
|
|
Array.from( paymentGateways.values() )
|
2023-02-20 01:02:57 +00:00
|
|
|
.sort( comparePaymentGatewaysByPriority )
|
2022-04-15 10:38:11 +00:00
|
|
|
.reduce(
|
|
|
|
( all, gateway ) => {
|
2023-06-16 15:46:37 +00:00
|
|
|
// mainList is the list of gateways that is shown in the payments task.
|
2024-07-12 09:40:24 +00:00
|
|
|
const [ wcPay, offline, mainList, wcPayBnpl ] = all;
|
2022-04-15 10:38:11 +00:00
|
|
|
|
2024-07-12 09:40:24 +00:00
|
|
|
// Handle WCPay-related gateways.
|
2023-06-16 15:46:37 +00:00
|
|
|
if ( getIsGatewayWCPay( gateway ) ) {
|
2024-07-12 09:40:24 +00:00
|
|
|
if ( isWCPaySupported ) {
|
|
|
|
// If we encounter the special WCPay BNPL gateway, we handle it separately and
|
|
|
|
// not let it be added to the regular WCPay list.
|
|
|
|
if ( gateway.id === 'woocommerce_payments:bnpl' ) {
|
|
|
|
// WCPay BNPL is only shown when WCPay is installed and setup.
|
|
|
|
// It should be mutually exclusive with WCPay.
|
|
|
|
if ( gateway.installed && ! gateway.needsSetup ) {
|
|
|
|
wcPayBnpl.push( gateway );
|
|
|
|
}
|
|
|
|
} else if (
|
|
|
|
! ( gateway.installed && ! gateway.needsSetup )
|
|
|
|
) {
|
|
|
|
// WCPay is always shown when it's not installed, or it's installed but needs setup.
|
|
|
|
wcPay.push( gateway );
|
|
|
|
}
|
2023-06-16 15:46:37 +00:00
|
|
|
}
|
2024-07-12 09:40:24 +00:00
|
|
|
|
|
|
|
// The WCPay-related gateway is ignored if it reaches here.
|
2022-04-15 10:38:11 +00:00
|
|
|
} else if ( gateway.is_offline ) {
|
2023-06-16 15:46:37 +00:00
|
|
|
// Offline gateways are always shown.
|
2022-04-15 10:38:11 +00:00
|
|
|
offline.push( gateway );
|
|
|
|
} else if ( gateway.enabled ) {
|
|
|
|
// Enabled gateways should be ignored.
|
|
|
|
} else if ( isWCPayOrOtherCategoryDoneSetup ) {
|
|
|
|
if (
|
|
|
|
getIsGatewayAdditionalCategory( gateway, countryCode )
|
|
|
|
) {
|
2023-06-16 15:46:37 +00:00
|
|
|
// If WCPay or "other" gateway is enabled, only
|
|
|
|
// allow to list "additional" gateways.
|
|
|
|
mainList.push( gateway );
|
2022-04-15 10:38:11 +00:00
|
|
|
}
|
2023-06-16 15:46:37 +00:00
|
|
|
// "other" gateways would be ignored here since we shouldn't promote competing gateways.
|
2022-04-15 10:38:11 +00:00
|
|
|
} else if (
|
|
|
|
getIsGatewayOtherCategory( gateway, countryCode )
|
|
|
|
) {
|
2023-06-16 15:46:37 +00:00
|
|
|
// When no WCPay or "other" gateway is enabled.
|
|
|
|
mainList.push( gateway );
|
2022-04-15 10:38:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return all;
|
|
|
|
},
|
2024-07-12 09:40:24 +00:00
|
|
|
[ [], [], [], [] ]
|
2022-04-15 10:38:11 +00:00
|
|
|
);
|