diff --git a/README.md b/README.md index 317b10f..16a9ba8 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,33 @@ Card numbers in **bold** have beed tested. * **4000 0000 0000 0119** Charge is declined with a processing_error code. * 4242 4242 4242 4241 Charge is declined with an incorrect_number code as the card number fails the Luhn check. +## Markup + +Stripe checkout forms to be added to forum posts using markup: + +#### Example + + [stripe-checkout amount=999 image=/img/someImage.png] + Widget + [/stripe-checkout] + + +Which renders as: + +
+ +
+ + ## Warranty This software comes with no warranty of any kind. diff --git a/assets/javascripts/discourse/templates/connectors/extra-nav-item/donate.hbs b/assets/javascripts/discourse/templates/connectors/extra-nav-item/donate.hbs deleted file mode 100644 index 1d51c3c..0000000 --- a/assets/javascripts/discourse/templates/connectors/extra-nav-item/donate.hbs +++ /dev/null @@ -1,3 +0,0 @@ - - {{i18n 'discourse_donations.nav_item'}} - diff --git a/assets/javascripts/lib/discourse-markdown/stripe.js.es6 b/assets/javascripts/lib/discourse-markdown/stripe.js.es6 new file mode 100644 index 0000000..9d98a79 --- /dev/null +++ b/assets/javascripts/lib/discourse-markdown/stripe.js.es6 @@ -0,0 +1,87 @@ +import { registerOption } from 'pretty-text/pretty-text'; + +registerOption((siteSettings, opts) => { + opts.features['discourse_donations'] = !!siteSettings.discourse_donations_enabled; +}); + +function validationErrors(tagInfo, content) { + let errors = []; + if (!Discourse.SiteSettings['discourse_donations_public_key']) { errors.push("missing key (site setting)"); } + if (!Discourse.SiteSettings['discourse_donations_currency']) { errors.push("missing currency (site setting)"); } + if (!Discourse.SiteSettings['stripe_name']) { errors.push("missing name (site setting)"); } + if (!Discourse.SiteSettings['discourse_donations_hide_zip_code']) { errors.push("missing hide zip code (site setting)"); } + if (!tagInfo.attrs['amount']) { errors.push("missing amount"); } + if (!content) { errors.push("missing description"); } + return errors; +} + +function replaceWithStripeOrError(state, tagInfo, content) { + let errors = validationErrors(tagInfo, content); + if (errors.length) { + displayErrors(state, errors); + } else { + insertCheckout(state, tagInfo, content); + } + 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) { + let token = state.push('stripe-checkout-form-open', 'form', 1); + token.attrs = [['method', 'POST'], ['action', '/charges']]; + + token = state.push('stripe-checkout-script-open', 'script', 0); + token.attrs = [ + ['src', 'https://checkout.stripe.com/checkout.js'], + ['class', 'stripe-button'], + ['data-key', Discourse.SiteSettings['discourse_donations_public_key']], + ['data-amount', tagInfo.attrs['amount']], + ['data-name', Discourse.SiteSettings['discourse_donations_shop_name']], + ['data-description', content], + ['data-image', tagInfo.attrs['image'] || ''], + ['data-locale', 'auto'], + ['data-zip-code', !Discourse.SiteSettings['discourse_donations_hide_zip_code']], + ['data-currency', Discourse.SiteSettings['discourse_donations_currency']] + ]; + + state.push('stripe-checkout-script-close', 'script', -1); + + state.push('stripe-checkout-form-close', 'form', -1); +} + +function setupMarkdownIt(helper) { + helper.registerPlugin(md => { + md.inline.bbcode.ruler.push('stripe-checkout', { + tag: 'stripe', + replace: replaceWithStripeOrError + }); + }); +} + +export function setup(helper) { + helper.whiteList([ + 'div[class]', + 'form[method]', 'form[action]', + '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-currency]', + 'script[data-locale]' + ]); + if (helper.markdownIt) { + setupMarkdownIt(helper); + } else { + console.log("Please upgrade Discourse to a later version in order to use this plugin"); + } +} diff --git a/assets/stylesheets/discourse-donations.css b/assets/stylesheets/discourse-donations.css new file mode 100644 index 0000000..f121d33 --- /dev/null +++ b/assets/stylesheets/discourse-donations.css @@ -0,0 +1,7 @@ +div.stripe-errors { + border: 1px solid #c33; + border-radius: 5px; + color: #600; + background-color: #fdd; + padding: 5px 10px; +} diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 7ebea6a..089f22b 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -4,6 +4,7 @@ en: discourse_donations_enable_create_accounts: "EXPERIMENTAL: Enable anonymous users to create accounts after successful payment" discourse_donations_secret_key: Stripe Secret Key discourse_donations_public_key: Stripe Public Key + discourse_donations_shop_name: Stripe Shop Name discourse_donations_currency: Currency Code discourse_donations_hide_zip_code: Hide Zip Code discourse_donations_reward_badge_name: Grant this badge to user when a payment is successful diff --git a/config/settings.yml b/config/settings.yml index 0a3770d..9f7a02a 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -3,8 +3,10 @@ plugins: default: false client: true discourse_donations_secret_key: + default: 'YOUR STRIPE API SECRET' client: false discourse_donations_public_key: + default: 'YOUR STRIPE API KEY' client: true discourse_donations_enable_create_accounts: client: true @@ -12,6 +14,9 @@ plugins: discourse_donations_description: client: true default: 'Donation' + discourse_donations_shop_name: + client: true + default: 'Shop Name' discourse_donations_currency: client: true default: 'USD' diff --git a/plugin.rb b/plugin.rb index 50805b5..a5a38a4 100644 --- a/plugin.rb +++ b/plugin.rb @@ -8,6 +8,8 @@ gem 'stripe', '2.8.0' load File.expand_path('../lib/discourse_donations/engine.rb', __FILE__) +register_asset "stylesheets/discourse-donations.css" + enabled_site_setting :discourse_donations_enabled after_initialize do