diff --git a/ghost/admin/app/components/gh-members-payments-setting.hbs b/ghost/admin/app/components/gh-members-payments-setting.hbs
index 4391f1e4ce..9235779ffc 100644
--- a/ghost/admin/app/components/gh-members-payments-setting.hbs
+++ b/ghost/admin/app/components/gh-members-payments-setting.hbs
@@ -52,7 +52,7 @@
{{else}}
- {{#if this.stripeConnectAccountId}}
+ {{#if (and this.stripeConnectAccountId (not this.saveStripeSettings.isRunning))}}
{{svg-jar "check-circle-stroke" class="check-circle"}}
You are connected to Stripe
diff --git a/ghost/admin/app/components/gh-members-payments-setting.js b/ghost/admin/app/components/gh-members-payments-setting.js
index 3b54b5eb29..25841b8a3e 100644
--- a/ghost/admin/app/components/gh-members-payments-setting.js
+++ b/ghost/admin/app/components/gh-members-payments-setting.js
@@ -3,13 +3,14 @@ import {computed} from '@ember/object';
import {currencies} from 'ghost-admin/utils/currency';
import {reads} from '@ember/object/computed';
import {inject as service} from '@ember/service';
-import {task} from 'ember-concurrency';
+import {task, timeout} from 'ember-concurrency';
export default Component.extend({
config: service(),
ghostPaths: service(),
ajax: service(),
settings: service(),
+ store: service(),
topCurrencies: null,
currencies: null,
@@ -227,14 +228,77 @@ export default Component.extend({
yield this.settings.reload();
}),
+ calculateDiscount(monthly, yearly) {
+ if (isNaN(monthly) || isNaN(yearly)) {
+ return 0;
+ }
+
+ return monthly ? 100 - Math.floor((yearly / 12 * 100) / monthly) : 0;
+ },
+
+ getActivePrice(prices, interval, amount, currency) {
+ return prices.find((price) => {
+ return (
+ price.active && price.amount === amount && price.type === 'recurring' &&
+ price.interval === interval && price.currency.toLowerCase() === currency.toLowerCase()
+ );
+ });
+ },
+
+ updatePortalPlans(monthlyPriceId, yearlyPriceId) {
+ let portalPlans = ['free'];
+ if (monthlyPriceId) {
+ portalPlans.push(monthlyPriceId);
+ }
+ if (yearlyPriceId) {
+ portalPlans.push(yearlyPriceId);
+ }
+ this.settings.set('portalPlans', portalPlans);
+ },
+
saveStripeSettings: task(function* () {
this.set('stripeConnectError', null);
this.set('stripeConnectSuccess', null);
if (this.get('settings.stripeConnectIntegrationToken')) {
try {
- const response = yield this.settings.save();
- this.set('membersStripeOpen', false);
- this.set('stripeConnectSuccess', true);
+ let response = yield this.settings.save();
+ const products = yield this.store.query('product', {include: 'stripe_prices'});
+ this.product = products.firstObject;
+ if (this.product) {
+ const stripePrices = this.product.stripePrices || [];
+ const yearlyDiscount = this.calculateDiscount(5, 50);
+ stripePrices.push(
+ {
+ nickname: 'Monthly',
+ amount: 500,
+ active: 1,
+ description: 'Full access',
+ currency: 'usd',
+ interval: 'month',
+ type: 'recurring'
+ },
+ {
+ nickname: 'Yearly',
+ amount: 5000,
+ active: 1,
+ currency: 'usd',
+ description: yearlyDiscount > 0 ? `${yearlyDiscount}% discount` : 'Full access',
+ interval: 'year',
+ type: 'recurring'
+ }
+ );
+ this.product.set('stripePrices', stripePrices);
+ yield timeout(1000);
+ const updatedProduct = yield this.product.save();
+ const monthlyPrice = this.getActivePrice(updatedProduct.stripePrices, 'month', 500, 'usd');
+ const yearlyPrice = this.getActivePrice(updatedProduct.stripePrices, 'year', 5000, 'usd');
+ this.updatePortalPlans(monthlyPrice.id, yearlyPrice.id);
+ this.settings.set('membersMonthlyPriceId', monthlyPrice.id);
+ this.settings.set('membersYearlyPriceId', yearlyPrice.id);
+ response = yield this.settings.save();
+ this.set('membersStripeOpen', false);
+ this.set('stripeConnectSuccess', true);
+ }
return response;
} catch (error) {
if (error.payload && error.payload.errors) {