Ghost/core/frontend/helpers/cancel_link.js
Hannah Wolfe fd20f90cca
Divided f/e proxy into true proxy + rendering service
- The original intention of the proxy was to collect up all the requires in our helpers into one place
- This has since been expanded and used in more places, in more ways
- In hindsight there are now multiple different types of requires in the proxy:
   - One: true frontend rendering framework requires (stuff from deep inside theme-engine)
   - Two: data manipulation/sdk stuff, belongs to the frontend, ways to process API data
   - Three: actual core stuff from Ghost, that we wish wasn't here / needs to be passed in a controlled way
- This commit pulls out One into a new rendering service, so at least that stuff is managed independently
- This draws the lines clearly between what's internal to the frontend and what isn't
- It also highlights that the theme-engine needs to be divided up / refactored so that we don't have these deep requires
2021-09-29 13:10:14 +01:00

50 lines
2.0 KiB
JavaScript

// # {{cancel_link}} Helper
// Usage: `{{cancel_link}}`, `{{cancel_link class="custom-cancel-class"}}`, `{{cancel_link cancelLabel="Cancel please!"}}`
//
// Should be used inside of a subscription context, e.g.: `{{#foreach @member.subscriptions}} {{cancel_link}} {{/foreach}}`
// Outputs cancel/renew links to manage subscription renewal after the subscription period ends.
//
// Defaults to class="cancel-subscription-link" errorClass="cancel-subscription-error" cancelLabel="Cancel subscription" continueLabel="Continue subscription"
const {labs} = require('../services/proxy');
const {templates} = require('../services/rendering');
const errors = require('@tryghost/errors');
const tpl = require('@tryghost/tpl');
const messages = {
invalidData: 'The {{cancel_link}} helper was used outside of a subscription context. See https://ghost.org/docs/themes/members/#cancel-links.'
};
function cancel_link(options) { // eslint-disable-line camelcase
let truncateOptions = (options || {}).hash || {};
if (this.id === undefined || this.cancel_at_period_end === undefined) {
throw new errors.IncorrectUsageError({message: tpl(messages.invalidData)});
}
const data = {
id: this.id,
cancel_at_period_end: this.cancel_at_period_end,
class: truncateOptions.class || 'gh-subscription-cancel',
errorClass: truncateOptions.errorClass || 'gh-error gh-error-subscription-cancel',
cancelLabel: truncateOptions.cancelLabel || 'Cancel subscription',
continueLabel: truncateOptions.continueLabel || 'Continue subscription'
};
return templates.execute('cancel_link', data);
}
module.exports = function cancelLabsWrapper() {
let self = this;
let args = arguments;
return labs.enabledHelper({
flagKey: 'members',
flagName: 'Members',
helperName: 'cancel_link',
helpUrl: 'https://ghost.org/docs/themes/members/'
}, () => {
return cancel_link.apply(self, args);
});
};