From 0b430a2e3370a15bb2410702e2716f2066627c86 Mon Sep 17 00:00:00 2001 From: Darren Ethier Date: Sun, 15 Dec 2019 17:08:12 -0500 Subject: [PATCH] add payment method wrapper components These implement whatever payment methods are registered. --- .../payment-methods/express-checkout.js | 40 ++++++++ .../express-payment-methods.js | 39 ++++++++ .../base/components/payment-methods/index.js | 3 + .../payment-methods/payment-methods.js | 94 +++++++++++++++++++ .../components/payment-methods/style.scss | 38 ++++++++ 5 files changed, 214 insertions(+) create mode 100644 assets/js/base/components/payment-methods/express-checkout.js create mode 100644 assets/js/base/components/payment-methods/express-payment-methods.js create mode 100644 assets/js/base/components/payment-methods/index.js create mode 100644 assets/js/base/components/payment-methods/payment-methods.js create mode 100644 assets/js/base/components/payment-methods/style.scss diff --git a/assets/js/base/components/payment-methods/express-checkout.js b/assets/js/base/components/payment-methods/express-checkout.js new file mode 100644 index 00000000000..59b6e428538 --- /dev/null +++ b/assets/js/base/components/payment-methods/express-checkout.js @@ -0,0 +1,40 @@ +/** + * External dependencies + */ +import { __ } from '@wordpress/i18n'; + +/** + * Internal dependencies + */ +import ExpressPaymentMethods from './express-payment-methods'; + +import './style.scss'; + +const ExpressCheckoutContainer = ( { children } ) => { + return ( +
+
+ + { __( 'Express checkout', 'woo-gutenberg-products-block' ) } + +
+
{ children }
+
+ ); +}; + +const ExpressCheckoutFormControl = () => { + return ( + +

+ { __( + 'In a hurry? Use one of our express checkout options below:', + 'woo-gutenberg-products-block' + ) } +

+ +
+ ); +}; + +export default ExpressCheckoutFormControl; diff --git a/assets/js/base/components/payment-methods/express-payment-methods.js b/assets/js/base/components/payment-methods/express-payment-methods.js new file mode 100644 index 00000000000..596cddcb692 --- /dev/null +++ b/assets/js/base/components/payment-methods/express-payment-methods.js @@ -0,0 +1,39 @@ +/** + * External dependencies + */ +import { getExpressPaymentMethods } from '@woocommerce/blocks-registry'; +import { useCheckoutData, usePaymentEvents } from '@woocommerce/base-hooks'; + +const ExpressPaymentMethods = () => { + const [ checkoutData ] = useCheckoutData(); + const { dispatch, select } = usePaymentEvents(); + const paymentMethods = getExpressPaymentMethods(); + const paymentMethodSlugs = Object.keys( paymentMethods ); + const content = + paymentMethodSlugs.length > 0 ? ( + paymentMethodSlugs.map( ( slug ) => { + const ExpressPaymentMethod = paymentMethods[ slug ]; + const paymentEvents = { dispatch, select }; + return ( +
  • + +
  • + ); + } ) + ) : ( +
  • No registered Payment Methods
  • + ); + return ( + + ); +}; + +export default ExpressPaymentMethods; diff --git a/assets/js/base/components/payment-methods/index.js b/assets/js/base/components/payment-methods/index.js new file mode 100644 index 00000000000..fe3e5a27dad --- /dev/null +++ b/assets/js/base/components/payment-methods/index.js @@ -0,0 +1,3 @@ +export { default as PaymentMethods } from './payment-methods'; +export { default as ExpressPaymentMethods } from './express-payment-methods'; +export { default as ExpressCheckoutFormControl } from './express-checkout'; diff --git a/assets/js/base/components/payment-methods/payment-methods.js b/assets/js/base/components/payment-methods/payment-methods.js new file mode 100644 index 00000000000..42db31b160b --- /dev/null +++ b/assets/js/base/components/payment-methods/payment-methods.js @@ -0,0 +1,94 @@ +/** + * External dependencies + */ +import { + useCheckoutData, + usePaymentEvents, + useActivePaymentMethod, +} from '@woocommerce/base-hooks'; +import { getPaymentMethods } from '@woocommerce/blocks-registry'; +import { useCallback } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +/** + * Internal dependencies + */ +import Tabs from '../tabs'; + +const noPaymentMethodTab = () => { + const label = __( 'Not Existing', 'woo-gutenberg-products-block' ); + return { + name: label, + label, + title: label, + }; +}; + +const createTabs = ( paymentMethods ) => { + const paymentMethodsKeys = Object.keys( paymentMethods ); + return paymentMethodsKeys.length > 0 + ? paymentMethodsKeys.map( ( key ) => { + const { tab, ariaLabel } = paymentMethods[ key ]; + return { + name: key, + title: tab, + ariaLabel, + }; + } ) + : [ noPaymentMethodTab() ]; +}; + +const paymentMethods = getPaymentMethods(); + +const PaymentMethods = () => { + const [ checkoutData ] = useCheckoutData(); + const { dispatch, select } = usePaymentEvents(); + const { + activePaymentMethod, + setActivePaymentMethod, + } = useActivePaymentMethod(); + const getRenderedTab = useCallback( + () => ( selectedTab ) => { + const PaymentMethod = + ( paymentMethods[ selectedTab ] && + paymentMethods[ selectedTab ].content ) || + null; + // @todo if undefined return placeholder for no registered payment methods + if ( ! PaymentMethod ) { + return ( +

    + { __( + 'No payment methods setup', + 'woo-gutenberg-products-block' + ) } +

    + ); + } + const paymentEvents = { dispatch, select }; + return ( + + ); + }, + [ checkoutData, dispatch, select ] + ); + return ( + setActivePaymentMethod( tabName ) } + tabs={ createTabs( paymentMethods ) } + initialTabName={ activePaymentMethod } + ariaLabel={ __( + 'Payment Methods', + 'woo-gutenberg-products-block' + ) } + > + { getRenderedTab() } + + ); +}; + +export default PaymentMethods; diff --git a/assets/js/base/components/payment-methods/style.scss b/assets/js/base/components/payment-methods/style.scss new file mode 100644 index 00000000000..26ca14681af --- /dev/null +++ b/assets/js/base/components/payment-methods/style.scss @@ -0,0 +1,38 @@ +.wc-component__container-with-border { + margin: auto; + border: 2px solid $black; + border-radius: 5px; + padding: 10px; + margin-bottom: $gap-large; + + .wc-component__text-overlay-on-border { + position: relative; + top: -24px; + background-color: $white; + padding-left: $gap-small; + padding-right: $gap-small; + width: fit-content; + color: $black; + } + + .wc-component__container-content { + margin-top: -15px; + padding-left: $gap-large; + padding-right: $gap-large; + padding-bottom: $gap; + } + + .wc-component__express-payment-event-buttons { + list-style: none; + display: flex; + flex-direction: row; + flex-wrap: wrap; + width: 100%; + padding: 0; + margin: 0; + > li { + display: inline-block; + width: calc(100% / 2); + } + } +}