discourse-subscriptions/assets/javascripts/lib/discourse-markdown/stripe.js.es6

97 lines
3.7 KiB
JavaScript

function validationErrors(tagInfo, content, siteSettings) {
let errors = [];
if (!siteSettings.discourse_donations_public_key) { errors.push("missing key (site setting)"); }
if (!siteSettings.discourse_donations_currency) { errors.push("missing currency (site setting)"); }
if (!siteSettings.discourse_donations_shop_name) { errors.push("missing name (site setting)"); }
if (!siteSettings.discourse_donations_zip_code) { errors.push("missing zip code toggle (site setting)"); }
if (!siteSettings.discourse_donations_billing_address) { errors.push("missing billing address toggle (site setting)"); }
if (!tagInfo.attrs['amount']) { errors.push("missing amount"); }
if (!content) { errors.push("missing description"); }
return errors;
}
function replaceWithStripeOrError(siteSettings) {
return function (state, tagInfo, content) {
let errors = validationErrors(tagInfo, content, siteSettings);
if (errors.length) {
displayErrors(state, errors);
} else {
insertCheckout(state, tagInfo, content, siteSettings);
}
return true;
};
}
function displayErrors(state, errors) {
let token = state.push('div-open', 'div', 1);
token.attrs = [['class', 'stripe-errors']];
token = state.push('html_inline', '', 0);
token.content = "Stripe checkout can't be rendered: " + errors.join(", ");
state.push('div-close', 'div', -1);
}
function insertCheckout(state, tagInfo, content, siteSettings) {
let token = state.push('stripe-checkout-form-open', 'form', 1);
token.attrs = [['method', 'POST'], ['action', '/checkout']];
token = state.push('stripe-checkout-form-amount', 'input', 0);
token.attrs = [['type', 'hidden'], ['name', 'amount'], ['value', tagInfo.attrs['amount']]];
token = state.push('stripe-checkout-script-open', 'script', 0);
token.attrs = [
['src', 'https://checkout.stripe.com/checkout.js'],
['class', 'stripe-button'],
['data-key', siteSettings.discourse_donations_public_key],
['data-amount', tagInfo.attrs['amount']],
['data-name', siteSettings.discourse_donations_shop_name],
['data-description', content],
['data-image', tagInfo.attrs['image'] || ''],
['data-locale', 'auto'],
['data-zip-code', siteSettings.discourse_donations_zip_code],
['data-billing-address', siteSettings.discourse_donations_billing_address],
['data-currency', siteSettings.discourse_donations_currency]
];
state.push('stripe-checkout-script-close', 'script', -1);
state.push('stripe-checkout-form-close', 'form', -1);
}
function setupMarkdownIt(helper, siteSettings) {
helper.registerPlugin(md => {
md.inline.bbcode.ruler.push('stripe-checkout', {
tag: 'stripe',
replace: replaceWithStripeOrError(siteSettings)
});
});
}
export function setup(helper) {
helper.registerOptions((opts,siteSettings)=>{
helper.whiteList([
'div[class]',
'form[method]',
'form[action]',
'input[type]',
'input[name]',
'input[value]',
'script[class]',
'script[src]',
'script[data-key]',
'script[data-amount]',
'script[data-name]',
'script[data-description]',
'script[data-image]',
'script[data-zip-code]',
'script[data-billing-address]',
'script[data-currency]',
'script[data-locale]'
]);
if (helper.markdownIt) {
setupMarkdownIt(helper, siteSettings);
} else {
console.log("Please upgrade Discourse to a later version in order to use this plugin");
}
});
}