From 77f3bb53dea34625a965eb2d6bd418ce76878c7b Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Mon, 4 Mar 2019 21:51:17 +0100 Subject: [PATCH] New payments buttons and new Amazon checkout flow (#10940) * start implementing separate amazon button component * wio * switch amazon to new flow --- .../group-plans/createGroupModalPages.vue | 13 +- .../client/components/groups/groupPlan.vue | 16 ++- .../components/payments/amazonButton.vue | 110 +++++++++++++++++ .../components/payments/amazonModal.vue | 114 ++++-------------- .../components/payments/buyGemsModal.vue | 14 +-- .../components/payments/sendGemsModal.vue | 7 +- .../components/settings/subscription.vue | 15 ++- website/client/mixins/payments.js | 24 +++- 8 files changed, 195 insertions(+), 118 deletions(-) create mode 100644 website/client/components/payments/amazonButton.vue diff --git a/website/client/components/group-plans/createGroupModalPages.vue b/website/client/components/group-plans/createGroupModalPages.vue index e0971792a8..38630835ad 100644 --- a/website/client/components/group-plans/createGroupModalPages.vue +++ b/website/client/components/group-plans/createGroupModalPages.vue @@ -25,7 +25,8 @@ .payment-providers .box.payment-button(@click='pay(PAYMENTS.STRIPE)') .svg-icon.credit-card-icon(v-html="icons.creditCard") - .box.payment-button.amazon(@click='pay(PAYMENTS.AMAZON)') + amazon-button(:amazon-data="pay(PAYMENTS.AMAZON)") + //.box.payment-button.amazon(@click='pay(PAYMENTS.AMAZON)') .svg-icon.amazon-pay-icon(v-html="icons.amazonpay") @@ -87,17 +88,21 @@ import * as Analytics from 'client/libs/analytics'; import { mapState } from 'client/libs/store'; import paymentsMixin from '../../mixins/payments'; +import amazonButton from 'client/components/payments/amazonButton'; -import amazonpay from 'assets/svg/amazonpay.svg'; +// import amazonpay from 'assets/svg/amazonpay.svg'; import creditCard from 'assets/svg/credit-card.svg'; export default { mixins: [paymentsMixin], + components: { + amazonButton, + }, data () { return { amazonPayments: {}, icons: Object.freeze({ - amazonpay, + // amazonpay, creditCard, }), PAGES: { @@ -159,7 +164,7 @@ export default { this.showStripe(paymentData); } else if (this.paymentMethod === this.PAYMENTS.AMAZON) { paymentData.type = 'subscription'; - this.amazonPaymentsInit(paymentData); + return paymentData; } }, }, diff --git a/website/client/components/groups/groupPlan.vue b/website/client/components/groups/groupPlan.vue index 9e92d0aa58..968b442703 100644 --- a/website/client/components/groups/groupPlan.vue +++ b/website/client/components/groups/groupPlan.vue @@ -53,7 +53,8 @@ div .svg-icon.credit-card-icon(v-html="icons.group") p.credit-card Credit Card p Powered by Stripe - .box.payment-button(@click='pay(PAYMENTS.AMAZON)') + amazon-button(:amazon-data="pay(PAYMENTS.AMAZON)") + //.box.payment-button(@click='pay(PAYMENTS.AMAZON)') .svg-icon.amazon-pay-icon(v-html="icons.amazonpay") .container.col-6.offset-3.create-option(v-if='!upgradingGroup._id') @@ -104,7 +105,8 @@ div .box.payment-button(@click='pay(PAYMENTS.STRIPE)') p Credit Card p Powered by Stripe - .box.payment-button(@click='pay(PAYMENTS.AMAZON)') + amazon-button(:amazon-data="pay(PAYMENTS.AMAZON)") + //.box.payment-button(@click='pay(PAYMENTS.AMAZON)') | Amazon Pay @@ -334,17 +336,21 @@ div import paymentsMixin from '../../mixins/payments'; import { mapState } from 'client/libs/store'; import group from 'assets/svg/group.svg'; -import amazonpay from 'assets/svg/amazonpay.svg'; +// import amazonpay from 'assets/svg/amazonpay.svg'; import positiveIcon from 'assets/svg/positive.svg'; +import amazonButton from 'client/components/payments/amazonButton'; export default { mixins: [paymentsMixin], + components: { + amazonButton, + }, data () { return { amazonPayments: {}, icons: Object.freeze({ group, - amazonpay, + // amazonpay, positiveIcon, }), PAGES: { @@ -413,7 +419,7 @@ export default { this.showStripe(paymentData); } else if (this.paymentMethod === this.PAYMENTS.AMAZON) { paymentData.type = 'subscription'; - this.amazonPaymentsInit(paymentData); + return paymentData; } }, }, diff --git a/website/client/components/payments/amazonButton.vue b/website/client/components/payments/amazonButton.vue new file mode 100644 index 0000000000..35e33c2af7 --- /dev/null +++ b/website/client/components/payments/amazonButton.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/website/client/components/payments/amazonModal.vue b/website/client/components/payments/amazonModal.vue index 13380db0b5..823aae5e85 100644 --- a/website/client/components/payments/amazonModal.vue +++ b/website/client/components/payments/amazonModal.vue @@ -1,7 +1,6 @@ @@ -86,12 +87,16 @@ import { mapState } from 'client/libs/store'; import planGemLimits from '../../../common/script/libs/planGemLimits'; import paymentsMixin from 'client/mixins/payments'; import notificationsMixin from 'client/mixins/notifications'; +import amazonButton from 'client/components/payments/amazonButton'; // @TODO: EMAILS.TECH_ASSISTANCE_EMAIL, load from config const TECH_ASSISTANCE_EMAIL = 'admin@habitica.com'; export default { mixins: [paymentsMixin, notificationsMixin], + components: { + amazonButton, + }, data () { return { planGemLimits, diff --git a/website/client/components/settings/subscription.vue b/website/client/components/settings/subscription.vue index b76747c523..14c7223c6c 100644 --- a/website/client/components/settings/subscription.vue +++ b/website/client/components/settings/subscription.vue @@ -80,7 +80,8 @@ a.purchase(@click="openPaypal(paypalPurchaseLink, 'subscription')", :disabled='!subscription.key') img(src='https://www.paypalobjects.com/webstatic/en_US/i/buttons/pp-acceptance-small.png', :alt="$t('paypal')") .col-md-4 - a.btn.btn-secondary.purchase(@click="payWithAmazon()") + amazon-button(:amazon-data="{type: 'subscription', subscription: this.subscription.key, coupon: this.subscription.coupon}") + // a.btn.btn-secondary.purchase(@click="payWithAmazon()") img(src='https://payments.amazon.com/gp/cba/button', :alt="$t('amazonPayments')") .row .col-6 @@ -115,8 +116,13 @@ import planGemLimits from '../../../common/script/libs/planGemLimits'; import paymentsMixin from '../../mixins/payments'; import notificationsMixin from '../../mixins/notifications'; +import amazonButton from 'client/components/payments/amazonButton'; + export default { mixins: [paymentsMixin, notificationsMixin], + components: { + amazonButton, + }, data () { return { loading: false, @@ -240,13 +246,6 @@ export default { }, }, methods: { - payWithAmazon () { - this.amazonPaymentsInit({ - type: 'subscription', - subscription: this.subscription.key, - coupon: this.subscription.coupon, - }); - }, async applyCoupon (coupon) { const response = await axios.post(`/api/v4/coupons/validate/${coupon}`); diff --git a/website/client/mixins/payments.js b/website/client/mixins/payments.js index 84c653a45f..9fc28dda27 100644 --- a/website/client/mixins/payments.js +++ b/website/client/mixins/payments.js @@ -251,8 +251,30 @@ export default { this.amazonPayments.gift = data.gift; this.amazonPayments.type = data.type; + }, + amazonOnError (error) { + alert(error.getErrorMessage()); + this.reset(); + }, + reset () { + // @TODO: Ensure we are using all of these + // some vars are set in the payments mixin. We should try to edit in one place + this.amazonPayments.modal = null; + this.amazonPayments.type = null; + this.amazonPayments.loggedIn = false; - this.$root.$emit('habitica::pay-with-amazon', this.amazonPayments); + // Gift + this.amazonPayments.gift = null; + this.amazonPayments.giftReceiver = null; + + this.amazonPayments.billingAgreementId = null; + this.amazonPayments.orderReferenceId = null; + this.amazonPayments.paymentSelected = false; + this.amazonPayments.recurringConsent = false; + this.amazonPayments.subscription = null; + this.amazonPayments.coupon = null; + this.amazonPayments.groupToCreate = null; + this.amazonPayments.group = null; }, async cancelSubscription (config) { if (config && config.group && !confirm(this.$t('confirmCancelGroupPlan'))) return;