2019-08-29 16:41:04 +00:00
|
|
|
|
/**
|
|
|
|
|
* External dependencies
|
|
|
|
|
*/
|
2020-03-15 21:45:19 +00:00
|
|
|
|
import { __, sprintf } from '@wordpress/i18n';
|
2020-03-27 23:24:32 +00:00
|
|
|
|
import classnames from 'classnames';
|
2020-03-16 11:09:29 +00:00
|
|
|
|
import { cloneElement, Component } from '@wordpress/element';
|
2019-08-29 16:41:04 +00:00
|
|
|
|
import { compose } from '@wordpress/compose';
|
2020-03-15 21:45:19 +00:00
|
|
|
|
import { Button, FormToggle } from '@wordpress/components';
|
2019-10-03 16:03:29 +00:00
|
|
|
|
import { withDispatch } from '@wordpress/data';
|
2019-08-29 16:41:04 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* WooCommerce dependencies
|
|
|
|
|
*/
|
2020-04-16 23:58:36 +00:00
|
|
|
|
import { Card, H, Plugins } from '@woocommerce/components';
|
2020-02-14 02:23:21 +00:00
|
|
|
|
import {
|
2020-03-15 21:45:19 +00:00
|
|
|
|
getHistory,
|
|
|
|
|
getNewPath,
|
|
|
|
|
updateQueryString,
|
|
|
|
|
} from '@woocommerce/navigation';
|
2020-04-16 23:58:36 +00:00
|
|
|
|
import { PLUGINS_STORE_NAME } from '@woocommerce/data';
|
2019-08-29 16:41:04 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Internal dependencies
|
|
|
|
|
*/
|
2019-10-07 20:27:34 +00:00
|
|
|
|
import { recordEvent } from 'lib/tracks';
|
|
|
|
|
import { getCountryCode } from 'dashboard/utils';
|
2019-08-29 16:41:04 +00:00
|
|
|
|
import withSelect from 'wc-api/with-select';
|
2020-03-15 21:45:19 +00:00
|
|
|
|
import { pluginNames } from 'wc-api/onboarding/constants';
|
2020-03-16 11:09:29 +00:00
|
|
|
|
import { getPaymentMethods } from './methods';
|
2019-08-29 16:41:04 +00:00
|
|
|
|
|
|
|
|
|
class Payments extends Component {
|
2020-03-16 11:09:29 +00:00
|
|
|
|
constructor( props ) {
|
2019-08-29 16:41:04 +00:00
|
|
|
|
super( ...arguments );
|
2020-03-16 11:09:29 +00:00
|
|
|
|
const { methods } = props;
|
|
|
|
|
|
|
|
|
|
const enabledMethods = {};
|
|
|
|
|
methods.forEach(
|
|
|
|
|
( method ) => ( enabledMethods[ method.key ] = method.isEnabled )
|
|
|
|
|
);
|
|
|
|
|
this.state = {
|
|
|
|
|
enabledMethods,
|
|
|
|
|
};
|
2019-10-03 16:03:29 +00:00
|
|
|
|
|
2020-03-15 21:45:19 +00:00
|
|
|
|
this.recommendedMethod = 'stripe';
|
2020-03-27 23:24:32 +00:00
|
|
|
|
methods.forEach( ( method ) => {
|
|
|
|
|
if ( method.key === 'wcpay' && method.visible ) {
|
|
|
|
|
this.recommendedMethod = 'wcpay';
|
|
|
|
|
}
|
|
|
|
|
} );
|
|
|
|
|
|
2020-03-15 21:45:19 +00:00
|
|
|
|
this.completeTask = this.completeTask.bind( this );
|
2019-10-03 16:03:29 +00:00
|
|
|
|
this.markConfigured = this.markConfigured.bind( this );
|
2020-03-15 21:45:19 +00:00
|
|
|
|
this.skipTask = this.skipTask.bind( this );
|
2019-10-03 16:03:29 +00:00
|
|
|
|
}
|
|
|
|
|
|
2020-03-16 11:09:29 +00:00
|
|
|
|
componentDidUpdate( prevProps ) {
|
|
|
|
|
const { createNotice, errors, methods, requesting } = this.props;
|
|
|
|
|
|
|
|
|
|
methods.forEach( ( method ) => {
|
|
|
|
|
const { key, title } = method;
|
|
|
|
|
if (
|
|
|
|
|
prevProps.requesting[ key ] &&
|
|
|
|
|
! requesting[ key ] &&
|
|
|
|
|
errors[ key ]
|
|
|
|
|
) {
|
|
|
|
|
createNotice(
|
|
|
|
|
'error',
|
|
|
|
|
sprintf(
|
|
|
|
|
__(
|
|
|
|
|
'There was a problem updating settings for %s',
|
|
|
|
|
'woocommerce-admin'
|
|
|
|
|
),
|
|
|
|
|
title
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
} );
|
|
|
|
|
}
|
|
|
|
|
|
2019-10-03 16:03:29 +00:00
|
|
|
|
completeTask() {
|
2020-03-16 11:09:29 +00:00
|
|
|
|
const { createNotice, methods, updateOptions } = this.props;
|
2020-03-15 21:45:19 +00:00
|
|
|
|
|
|
|
|
|
updateOptions( {
|
|
|
|
|
woocommerce_task_list_payments: {
|
|
|
|
|
completed: 1,
|
2020-05-04 11:33:11 +00:00
|
|
|
|
timestamp: Math.floor( Date.now() / 1000 ),
|
2020-03-15 21:45:19 +00:00
|
|
|
|
},
|
|
|
|
|
} );
|
|
|
|
|
|
|
|
|
|
recordEvent( 'tasklist_payment_done', {
|
2020-03-16 11:09:29 +00:00
|
|
|
|
configured: methods
|
|
|
|
|
.filter( ( method ) => method.isConfigured )
|
|
|
|
|
.map( ( method ) => method.key ),
|
2020-03-15 21:45:19 +00:00
|
|
|
|
} );
|
2020-01-06 15:27:09 +00:00
|
|
|
|
|
|
|
|
|
createNotice(
|
|
|
|
|
'success',
|
2020-02-14 02:23:21 +00:00
|
|
|
|
__(
|
|
|
|
|
'💰 Ka-ching! Your store can now accept payments 💳',
|
|
|
|
|
'woocommerce-admin'
|
|
|
|
|
)
|
2020-01-06 15:27:09 +00:00
|
|
|
|
);
|
|
|
|
|
|
2019-10-03 16:03:29 +00:00
|
|
|
|
getHistory().push( getNewPath( {}, '/', {} ) );
|
2019-08-29 16:41:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
2020-03-15 21:45:19 +00:00
|
|
|
|
skipTask() {
|
2020-03-16 11:09:29 +00:00
|
|
|
|
const { methods, updateOptions } = this.props;
|
2020-03-15 21:45:19 +00:00
|
|
|
|
|
|
|
|
|
updateOptions( {
|
|
|
|
|
woocommerce_task_list_payments: {
|
2020-05-04 11:33:11 +00:00
|
|
|
|
skipped: 1,
|
|
|
|
|
timestamp: Math.floor( Date.now() / 1000 ),
|
2020-03-15 21:45:19 +00:00
|
|
|
|
},
|
|
|
|
|
} );
|
|
|
|
|
|
|
|
|
|
recordEvent( 'tasklist_payment_skip_task', {
|
2020-03-16 11:09:29 +00:00
|
|
|
|
options: methods.map( ( method ) => method.key ),
|
2020-03-15 21:45:19 +00:00
|
|
|
|
} );
|
|
|
|
|
|
|
|
|
|
getHistory().push( getNewPath( {}, '/', {} ) );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
markConfigured( method ) {
|
2020-03-16 11:57:23 +00:00
|
|
|
|
const { enabledMethods } = this.state;
|
|
|
|
|
|
|
|
|
|
this.setState( {
|
|
|
|
|
enabledMethods: {
|
|
|
|
|
...enabledMethods,
|
|
|
|
|
[ method ]: true,
|
|
|
|
|
},
|
|
|
|
|
} );
|
|
|
|
|
|
2020-03-15 21:45:19 +00:00
|
|
|
|
getHistory().push( getNewPath( { task: 'payments' }, '/', {} ) );
|
2019-08-29 16:41:04 +00:00
|
|
|
|
|
2020-03-15 21:45:19 +00:00
|
|
|
|
recordEvent( 'tasklist_payment_connect_method', {
|
|
|
|
|
payment_method: method,
|
2019-10-03 16:03:29 +00:00
|
|
|
|
} );
|
2019-08-29 16:41:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
2020-03-15 21:45:19 +00:00
|
|
|
|
getCurrentMethod() {
|
2020-03-16 11:09:29 +00:00
|
|
|
|
const { methods, query } = this.props;
|
2019-10-03 16:03:29 +00:00
|
|
|
|
|
2020-03-15 21:45:19 +00:00
|
|
|
|
if ( ! query.method ) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2019-10-03 16:03:29 +00:00
|
|
|
|
|
2020-03-15 21:45:19 +00:00
|
|
|
|
return methods.find( ( method ) => method.key === query.method );
|
2019-10-07 20:27:34 +00:00
|
|
|
|
}
|
|
|
|
|
|
2020-03-15 21:45:19 +00:00
|
|
|
|
getInstallStep() {
|
|
|
|
|
const currentMethod = this.getCurrentMethod();
|
2019-10-03 16:03:29 +00:00
|
|
|
|
|
2020-03-15 21:45:19 +00:00
|
|
|
|
if ( ! currentMethod.plugins || ! currentMethod.plugins.length ) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2019-10-03 16:03:29 +00:00
|
|
|
|
|
2020-03-15 21:45:19 +00:00
|
|
|
|
const { activePlugins } = this.props;
|
|
|
|
|
const pluginsToInstall = currentMethod.plugins.filter(
|
|
|
|
|
( method ) => ! activePlugins.includes( method )
|
|
|
|
|
);
|
|
|
|
|
const pluginNamesString = currentMethod.plugins
|
|
|
|
|
.map( ( pluginSlug ) => pluginNames[ pluginSlug ] )
|
|
|
|
|
.join( ' ' + __( 'and', 'woocommerce-admin' ) + ' ' );
|
2019-08-29 16:41:04 +00:00
|
|
|
|
|
2020-03-15 21:45:19 +00:00
|
|
|
|
return {
|
|
|
|
|
key: 'install',
|
|
|
|
|
label: sprintf(
|
|
|
|
|
__( 'Install %s', 'woocommerce-admin' ),
|
|
|
|
|
pluginNamesString
|
|
|
|
|
),
|
|
|
|
|
content: (
|
|
|
|
|
<Plugins
|
|
|
|
|
onComplete={ () => {
|
|
|
|
|
recordEvent( 'tasklist_payment_install_method', {
|
|
|
|
|
plugins: currentMethod.plugins,
|
|
|
|
|
} );
|
|
|
|
|
} }
|
|
|
|
|
autoInstall
|
|
|
|
|
pluginSlugs={ currentMethod.plugins }
|
|
|
|
|
/>
|
|
|
|
|
),
|
|
|
|
|
isComplete: ! pluginsToInstall.length,
|
|
|
|
|
};
|
2019-08-29 16:41:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
2020-03-16 11:09:29 +00:00
|
|
|
|
toggleMethod( key ) {
|
|
|
|
|
const { methods, options, updateOptions } = this.props;
|
|
|
|
|
const { enabledMethods } = this.state;
|
|
|
|
|
const method = methods.find( ( option ) => option.key === key );
|
|
|
|
|
|
|
|
|
|
enabledMethods[ key ] = ! enabledMethods[ key ];
|
|
|
|
|
this.setState( { enabledMethods } );
|
|
|
|
|
|
|
|
|
|
recordEvent( 'tasklist_payment_toggle', {
|
|
|
|
|
enabled: ! method.isEnabled,
|
|
|
|
|
payment_method: key,
|
|
|
|
|
} );
|
|
|
|
|
|
|
|
|
|
updateOptions( {
|
|
|
|
|
[ method.optionName ]: {
|
|
|
|
|
...options[ method.optionName ],
|
|
|
|
|
enabled: method.isEnabled ? 'no' : 'yes',
|
|
|
|
|
},
|
|
|
|
|
} );
|
|
|
|
|
}
|
|
|
|
|
|
2019-08-29 16:41:04 +00:00
|
|
|
|
render() {
|
2020-03-15 21:45:19 +00:00
|
|
|
|
const currentMethod = this.getCurrentMethod();
|
2020-03-16 11:09:29 +00:00
|
|
|
|
const { methods, query } = this.props;
|
|
|
|
|
const { enabledMethods } = this.state;
|
|
|
|
|
const configuredMethods = methods.filter(
|
|
|
|
|
( method ) => method.isConfigured
|
|
|
|
|
).length;
|
2020-03-15 21:45:19 +00:00
|
|
|
|
|
|
|
|
|
if ( currentMethod ) {
|
|
|
|
|
return (
|
|
|
|
|
<Card className="woocommerce-task-payment-method is-narrow">
|
|
|
|
|
{ cloneElement( currentMethod.container, {
|
|
|
|
|
query,
|
|
|
|
|
installStep: this.getInstallStep(),
|
2020-03-16 11:09:29 +00:00
|
|
|
|
markConfigured: this.markConfigured,
|
2020-04-08 23:17:32 +00:00
|
|
|
|
hasCbdIndustry: currentMethod.hasCbdIndustry,
|
2020-03-15 21:45:19 +00:00
|
|
|
|
} ) }
|
|
|
|
|
</Card>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2019-08-29 16:41:04 +00:00
|
|
|
|
return (
|
2020-03-15 21:45:19 +00:00
|
|
|
|
<div className="woocommerce-task-payments">
|
|
|
|
|
{ methods.map( ( method ) => {
|
|
|
|
|
const {
|
|
|
|
|
before,
|
|
|
|
|
container,
|
|
|
|
|
content,
|
2020-03-16 11:09:29 +00:00
|
|
|
|
isConfigured,
|
2020-03-15 21:45:19 +00:00
|
|
|
|
key,
|
|
|
|
|
title,
|
|
|
|
|
visible,
|
|
|
|
|
} = method;
|
|
|
|
|
|
|
|
|
|
if ( ! visible ) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-27 23:24:32 +00:00
|
|
|
|
const classes = classnames(
|
|
|
|
|
'woocommerce-task-payment',
|
|
|
|
|
'is-narrow',
|
|
|
|
|
! isConfigured &&
|
|
|
|
|
'woocommerce-task-payment-not-configured',
|
|
|
|
|
'woocommerce-task-payment-' + key
|
|
|
|
|
);
|
|
|
|
|
|
2020-03-31 12:58:11 +00:00
|
|
|
|
const isRecommended =
|
|
|
|
|
key === this.recommendedMethod && ! isConfigured;
|
|
|
|
|
const showRecommendedRibbon =
|
|
|
|
|
isRecommended && this.recommendedMethod !== 'wcpay';
|
|
|
|
|
const showRecommendedPill =
|
|
|
|
|
isRecommended && this.recommendedMethod === 'wcpay';
|
|
|
|
|
|
2019-08-29 16:41:04 +00:00
|
|
|
|
return (
|
2020-03-27 23:24:32 +00:00
|
|
|
|
<Card key={ key } className={ classes }>
|
2020-03-15 21:45:19 +00:00
|
|
|
|
<div className="woocommerce-task-payment__before">
|
2020-03-31 12:58:11 +00:00
|
|
|
|
{ showRecommendedRibbon && (
|
|
|
|
|
<div className="woocommerce-task-payment__recommended-ribbon">
|
|
|
|
|
<span>
|
|
|
|
|
{ __(
|
|
|
|
|
'Recommended',
|
|
|
|
|
'woocommerce-admin'
|
|
|
|
|
) }
|
|
|
|
|
</span>
|
|
|
|
|
</div>
|
|
|
|
|
) }
|
2020-03-15 21:45:19 +00:00
|
|
|
|
{ before }
|
|
|
|
|
</div>
|
|
|
|
|
<div className="woocommerce-task-payment__text">
|
|
|
|
|
<H className="woocommerce-task-payment__title">
|
|
|
|
|
{ title }
|
2020-03-31 12:58:11 +00:00
|
|
|
|
{ showRecommendedPill && (
|
|
|
|
|
<span className="woocommerce-task-payment__recommended-pill">
|
|
|
|
|
{ __(
|
|
|
|
|
'Recommended',
|
|
|
|
|
'woocommerce-admin'
|
|
|
|
|
) }
|
|
|
|
|
</span>
|
|
|
|
|
) }
|
2020-03-15 21:45:19 +00:00
|
|
|
|
</H>
|
2020-04-08 23:17:32 +00:00
|
|
|
|
<div className="woocommerce-task-payment__content">
|
2020-03-15 21:45:19 +00:00
|
|
|
|
{ content }
|
2020-04-08 23:17:32 +00:00
|
|
|
|
</div>
|
2020-03-15 21:45:19 +00:00
|
|
|
|
</div>
|
|
|
|
|
<div className="woocommerce-task-payment__after">
|
2020-03-16 11:09:29 +00:00
|
|
|
|
{ container && ! isConfigured ? (
|
2020-03-15 21:45:19 +00:00
|
|
|
|
<Button
|
|
|
|
|
isPrimary={
|
|
|
|
|
key === this.recommendedMethod
|
|
|
|
|
}
|
|
|
|
|
isDefault={
|
|
|
|
|
key !== this.recommendedMethod
|
|
|
|
|
}
|
|
|
|
|
onClick={ () => {
|
|
|
|
|
recordEvent(
|
|
|
|
|
'tasklist_payment_setup',
|
|
|
|
|
{
|
2020-03-16 11:09:29 +00:00
|
|
|
|
options: methods.map(
|
2020-03-15 21:45:19 +00:00
|
|
|
|
( option ) => option.key
|
|
|
|
|
),
|
|
|
|
|
selected: key,
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
updateQueryString( {
|
|
|
|
|
method: key,
|
|
|
|
|
} );
|
|
|
|
|
} }
|
|
|
|
|
>
|
|
|
|
|
{ __( 'Set up', 'woocommerce-admin' ) }
|
|
|
|
|
</Button>
|
|
|
|
|
) : (
|
2020-03-16 11:09:29 +00:00
|
|
|
|
<FormToggle
|
|
|
|
|
checked={ enabledMethods[ key ] }
|
|
|
|
|
onChange={ () =>
|
|
|
|
|
this.toggleMethod( key )
|
|
|
|
|
}
|
|
|
|
|
onClick={ ( e ) => e.stopPropagation() }
|
|
|
|
|
/>
|
2020-03-15 21:45:19 +00:00
|
|
|
|
) }
|
|
|
|
|
</div>
|
|
|
|
|
</Card>
|
2019-08-29 16:41:04 +00:00
|
|
|
|
);
|
2020-03-15 21:45:19 +00:00
|
|
|
|
} ) }
|
|
|
|
|
<div className="woocommerce-task-payments__actions">
|
2020-03-16 11:09:29 +00:00
|
|
|
|
{ configuredMethods.length === 0 ? (
|
2020-03-15 21:45:19 +00:00
|
|
|
|
<Button isLink onClick={ this.skipTask }>
|
|
|
|
|
{ __(
|
|
|
|
|
'My store doesn’t take payments',
|
|
|
|
|
'woocommerce-admin'
|
|
|
|
|
) }
|
|
|
|
|
</Button>
|
|
|
|
|
) : (
|
|
|
|
|
<Button isPrimary onClick={ this.completeTask }>
|
|
|
|
|
{ __( 'Done', 'woocommerce-admin' ) }
|
|
|
|
|
</Button>
|
|
|
|
|
) }
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2019-08-29 16:41:04 +00:00
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default compose(
|
2020-02-14 02:23:21 +00:00
|
|
|
|
withSelect( ( select ) => {
|
2020-03-16 11:09:29 +00:00
|
|
|
|
const {
|
|
|
|
|
getProfileItems,
|
|
|
|
|
getOptions,
|
|
|
|
|
getUpdateOptionsError,
|
|
|
|
|
isUpdateOptionsRequesting,
|
|
|
|
|
} = select( 'wc-api' );
|
|
|
|
|
|
2020-04-16 23:58:36 +00:00
|
|
|
|
const { getActivePlugins, isJetpackConnected } = select(
|
|
|
|
|
PLUGINS_STORE_NAME
|
|
|
|
|
);
|
2020-03-16 11:09:29 +00:00
|
|
|
|
const activePlugins = getActivePlugins();
|
|
|
|
|
const profileItems = getProfileItems();
|
2019-10-29 18:03:07 +00:00
|
|
|
|
const options = getOptions( [
|
|
|
|
|
'woocommerce_default_country',
|
2020-03-27 23:24:32 +00:00
|
|
|
|
'woocommerce_woocommerce_payments_settings',
|
2020-03-16 11:09:29 +00:00
|
|
|
|
'woocommerce_stripe_settings',
|
|
|
|
|
'woocommerce_ppec_paypal_settings',
|
|
|
|
|
'woocommerce_payfast_settings',
|
|
|
|
|
'woocommerce_square_credit_card_settings',
|
|
|
|
|
'woocommerce_klarna_payments_settings',
|
|
|
|
|
'woocommerce_kco_settings',
|
|
|
|
|
'wc_square_refresh_tokens',
|
2020-03-16 11:57:23 +00:00
|
|
|
|
'woocommerce_cod_settings',
|
|
|
|
|
'woocommerce_bacs_settings',
|
|
|
|
|
'woocommerce_bacs_accounts',
|
2019-10-29 18:03:07 +00:00
|
|
|
|
] );
|
2020-02-14 02:23:21 +00:00
|
|
|
|
const countryCode = getCountryCode(
|
|
|
|
|
options.woocommerce_default_country
|
|
|
|
|
);
|
2019-10-03 16:03:29 +00:00
|
|
|
|
|
2020-03-16 11:09:29 +00:00
|
|
|
|
const methods = getPaymentMethods( {
|
|
|
|
|
activePlugins,
|
|
|
|
|
countryCode,
|
2020-04-09 23:10:47 +00:00
|
|
|
|
isJetpackConnected: isJetpackConnected(),
|
2020-02-14 02:23:21 +00:00
|
|
|
|
options,
|
2020-03-16 11:09:29 +00:00
|
|
|
|
profileItems,
|
|
|
|
|
} );
|
|
|
|
|
|
|
|
|
|
const errors = {};
|
|
|
|
|
const requesting = {};
|
|
|
|
|
methods.forEach( ( method ) => {
|
|
|
|
|
errors[ method.key ] = Boolean(
|
|
|
|
|
getUpdateOptionsError( [ method.optionName ] )
|
|
|
|
|
);
|
|
|
|
|
requesting[ method.key ] = Boolean(
|
|
|
|
|
isUpdateOptionsRequesting( [ method.optionName ] )
|
|
|
|
|
);
|
|
|
|
|
} );
|
2019-10-03 16:03:29 +00:00
|
|
|
|
|
2019-08-29 16:41:04 +00:00
|
|
|
|
return {
|
|
|
|
|
countryCode,
|
2020-03-16 11:09:29 +00:00
|
|
|
|
errors,
|
|
|
|
|
profileItems,
|
|
|
|
|
activePlugins,
|
2019-10-03 16:03:29 +00:00
|
|
|
|
options,
|
2020-03-16 11:09:29 +00:00
|
|
|
|
methods,
|
|
|
|
|
requesting,
|
2019-10-03 16:03:29 +00:00
|
|
|
|
};
|
|
|
|
|
} ),
|
2020-02-14 02:23:21 +00:00
|
|
|
|
withDispatch( ( dispatch ) => {
|
2019-10-03 16:03:29 +00:00
|
|
|
|
const { createNotice } = dispatch( 'core/notices' );
|
|
|
|
|
const { updateOptions } = dispatch( 'wc-api' );
|
|
|
|
|
return {
|
|
|
|
|
createNotice,
|
|
|
|
|
updateOptions,
|
2019-08-29 16:41:04 +00:00
|
|
|
|
};
|
|
|
|
|
} )
|
|
|
|
|
)( Payments );
|