/**
* WordPress dependencies
*/
import { useSelect } from '@safe-wordpress/data';
import { createInterpolateElement } from '@safe-wordpress/element';
import { sprintf, _x } from '@safe-wordpress/i18n';
/**
* External dependencies
*/
import { map, trim } from 'lodash';
import { store as NAB_DATA } from '@nab/data';
import { listify } from '@nab/utils';
import type {
CAViewProps,
SureCartProductId,
SelectedSureCartProductIds,
SomeSureCartProducts,
} from '@nab/types';
/**
* Internal dependencies
*/
import type { Attributes } from './types';
export const View = ( {
attributes,
}: CAViewProps< Attributes > ): JSX.Element => {
const { value: selection } = attributes;
switch ( selection.type ) {
case 'all-surecart-products':
return ;
case 'some-surecart-products':
return ;
}
};
// ============
// HELPER VIEWS
// ============
type HelperViewProps< T = unknown > = {
readonly selection: T;
};
const AllProductsView = (): JSX.Element => {
return <>{ _x( 'An order is paid.', 'text', 'nelio-ab-testing' ) }>;
};
const SomeProductsView = ( {
selection,
}: HelperViewProps< SomeSureCartProducts[ 'value' ] > ): JSX.Element => (
);
const ProductList = ( {
selection,
}: HelperViewProps< SelectedSureCartProductIds > ): JSX.Element => {
const { productIds, mode, excluded = false } = selection;
const productNames = map( useProductNames( productIds ), strong );
switch ( productNames.length ) {
case 0:
return beautify( ORDER_STATUS );
case 1:
return beautify(
// eslint-disable-next-line @wordpress/valid-sprintf
sprintf(
excluded
? PRODUCT_LABELS.singleExcluded
: PRODUCT_LABELS.singleIncluded,
productNames[ 0 ]
)
);
default:
return beautify(
// eslint-disable-next-line @wordpress/valid-sprintf
sprintf(
excluded
? PRODUCT_LABELS.multipleExcluded
: PRODUCT_LABELS.multipleIncluded,
listify( mode, productNames )
)
);
}
};
// =======
// HELPERS
// =======
const beautify = ( text: string ): JSX.Element =>
createInterpolateElement( text, { strong: } );
const strong = ( t: string ): string => `${ t }`;
// =====
// HOOKS
// =====
const useProductNames = ( productIds: ReadonlyArray< SureCartProductId > ) =>
useSelect(
( select ) =>
productIds.map(
( productId ) =>
trim(
select( NAB_DATA ).getEntityRecord(
'sc_product',
productId
)?.title
) ||
sprintf(
/* translators: %s: Product id. */
_x( 'Product #%s', 'text', 'nelio-ab-testing' ),
productId
)
),
[ productIds ]
);
// =========
// CONSTANTS
// =========
type Labels = {
readonly singleExcluded: string;
readonly singleIncluded: string;
readonly multipleExcluded: string;
readonly multipleIncluded: string;
};
/* translators: %s: Woocommerce order status. */
const ORDER_STATUS = _x(
'The status of an order is set to paid.',
'text',
'nelio-ab-testing'
);
const PRODUCT_LABELS: Labels = {
/* translators: %s: Product name. */
singleExcluded: _x(
'The status of an order not containing product %s is set to paid.',
'text',
'nelio-ab-testing'
),
/* translators: %s: Product name. */
singleIncluded: _x(
'The status of an order containing the product %s is set to paid.',
'text',
'nelio-ab-testing'
),
/* translators: %s: List of product names. */
multipleExcluded: _x(
'The status of an order not containing any of the products %s is set to paid.',
'text',
'nelio-ab-testing'
),
/* translators: %s: List of product names. */
multipleIncluded: _x(
'The status of an order containing products %s is set to paid.',
'text',
'nelio-ab-testing'
),
};