From 5d598d5e50c11070c89492912e145183c3f5ddc8 Mon Sep 17 00:00:00 2001 From: Rishabh Garg Date: Fri, 7 May 2021 22:46:35 +0530 Subject: [PATCH] Wired free membership settings to API (#1949) refs https://github.com/TryGhost/Team/issues/637 With custom products it's possible to change the name and description of any price. This assumes that people would want to change the same properties of a Free membership, and wires up the values for free membership price settings to API Co-authored-by: Peter Zimon --- .../modal-free-membership-settings.hbs | 25 +++++--- .../modal-free-membership-settings.js | 61 +++++++++++++++++++ .../app/controllers/settings/products.js | 1 + ghost/admin/app/models/setting.js | 2 + .../admin/app/templates/settings/products.hbs | 2 +- 5 files changed, 81 insertions(+), 10 deletions(-) diff --git a/ghost/admin/app/components/modal-free-membership-settings.hbs b/ghost/admin/app/components/modal-free-membership-settings.hbs index abed56159e..2f41a2d075 100644 --- a/ghost/admin/app/components/modal-free-membership-settings.hbs +++ b/ghost/admin/app/components/modal-free-membership-settings.hbs @@ -12,8 +12,8 @@ @@ -22,7 +22,8 @@ @@ -30,11 +31,17 @@ - + +

Redirect to this URL after signing up for a free membership

@@ -55,7 +62,7 @@ \ No newline at end of file diff --git a/ghost/admin/app/components/modal-free-membership-settings.js b/ghost/admin/app/components/modal-free-membership-settings.js index 3836215b32..66a0f2fd6e 100644 --- a/ghost/admin/app/components/modal-free-membership-settings.js +++ b/ghost/admin/app/components/modal-free-membership-settings.js @@ -1,12 +1,21 @@ import ModalBase from 'ghost-admin/components/modal-base'; import classic from 'ember-classic-decorator'; import {action} from '@ember/object'; +import {inject as service} from '@ember/service'; +import {task} from 'ember-concurrency-decorators'; +import {tracked} from '@glimmer/tracking'; // TODO: update modals to work fully with Glimmer components @classic export default class ModalFreeMembershipSettings extends ModalBase { + @service settings; + @service config; + + @tracked freeSignupRedirect; + @tracked siteUrl; init() { super.init(...arguments); + this.siteUrl = this.config.get('blogUrl'); } @action @@ -19,6 +28,58 @@ export default class ModalFreeMembershipSettings extends ModalBase { // needed because ModalBase uses .send() for keyboard events closeModal() { this.close(); + }, + updateName(value) { + this.settings.set('membersFreePriceName', value); + }, + updateDescription(value) { + this.settings.set('membersFreePriceDescription', value); + }, + setFreeSignupRedirect(url) { + this.freeSignupRedirect = url; + }, + validateFreeSignupRedirect() { + return this._validateSignupRedirect(this.freeSignupRedirect, 'membersFreeSignupRedirect'); + } + } + + @task({drop: true}) + *save() { + try { + this.send('validateFreeSignupRedirect'); + if (this.settings.get('errors').length !== 0) { + return; + } + yield this.settings.save(); + this.send('closeModal'); + } catch (error) { + this.notifications.showAPIError(error, {key: 'settings.save'}); + } finally { + this.send('closeModal'); + } + } + + _validateSignupRedirect(url, type) { + let errMessage = `Please enter a valid URL`; + this.settings.get('errors').remove(type); + this.settings.get('hasValidated').removeObject(type); + + if (url === null) { + this.settings.get('errors').add(type, errMessage); + this.settings.get('hasValidated').pushObject(type); + return false; + } + + if (url === undefined) { + // Not initialised + return; + } + + if (url.href.startsWith(this.siteUrl)) { + const path = url.href.replace(this.siteUrl, ''); + this.settings.set(type, path); + } else { + this.settings.set(type, url.href); } } } diff --git a/ghost/admin/app/controllers/settings/products.js b/ghost/admin/app/controllers/settings/products.js index 2fe54887cc..ad746c2028 100644 --- a/ghost/admin/app/controllers/settings/products.js +++ b/ghost/admin/app/controllers/settings/products.js @@ -5,6 +5,7 @@ import {inject as service} from '@ember/service'; import {tracked} from '@glimmer/tracking'; export default class ProductsController extends Controller { + @service settings; @service config; @tracked iconStyle = ''; diff --git a/ghost/admin/app/models/setting.js b/ghost/admin/app/models/setting.js index b84f0367d1..70763de394 100644 --- a/ghost/admin/app/models/setting.js +++ b/ghost/admin/app/models/setting.js @@ -59,6 +59,8 @@ export default Model.extend(ValidationEngine, { membersReplyAddress: attr('string'), membersPaidSignupRedirect: attr('string'), membersFreeSignupRedirect: attr('string'), + membersFreePriceName: attr('string'), + membersFreePriceDescription: attr('string'), stripeProductName: attr('string'), stripeSecretKey: attr('string'), stripePublishableKey: attr('string'), diff --git a/ghost/admin/app/templates/settings/products.hbs b/ghost/admin/app/templates/settings/products.hbs index befe459ac5..0359a9a04d 100644 --- a/ghost/admin/app/templates/settings/products.hbs +++ b/ghost/admin/app/templates/settings/products.hbs @@ -15,7 +15,7 @@ Free membership

- Product description + {{this.settings.membersFreePriceDescription}}

Customize