From 13d23dc3fad3ab07eb923aa9b38bb5d410e31098 Mon Sep 17 00:00:00 2001 From: spirobel Date: Sun, 9 Jul 2023 05:17:06 +0800 Subject: [PATCH] FEATURE: Add new stripe based pricing table This commit adds the new stripe based pricing table. If the user is logged in, the email field will be prepopulated with the users email. The pricing table can be configured in the stripe dashboard. Once the discourse_subscriptions_pricing_table setting is filled with the pricing table embed code from the stripe dashboard, the pricing table will be displayed on /subscriptions For more details see https://stripe.com/docs/payments/checkout/pricing-table --- .../pricingtable_controller.rb | 7 ++++ .../discourse/controllers/subscriptions.js | 35 +++++++++++++++++++ .../initializers/setup-subscriptions.js | 26 +++++++++++++- .../discourse/subscriptions-route-map.js | 4 +-- .../discourse/templates/subscriptions.hbs | 3 ++ config/locales/client.en.yml | 1 + config/settings.yml | 4 +++ plugin.rb | 16 +++++++++ 8 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 app/controllers/discourse_subscriptions/pricingtable_controller.rb create mode 100644 assets/javascripts/discourse/controllers/subscriptions.js create mode 100644 assets/javascripts/discourse/templates/subscriptions.hbs diff --git a/app/controllers/discourse_subscriptions/pricingtable_controller.rb b/app/controllers/discourse_subscriptions/pricingtable_controller.rb new file mode 100644 index 0000000..fd1e305 --- /dev/null +++ b/app/controllers/discourse_subscriptions/pricingtable_controller.rb @@ -0,0 +1,7 @@ +module StripeDiscourseSubscriptions + class PricingtableController < ::ApplicationController + def index + head 200 + end + end +end \ No newline at end of file diff --git a/assets/javascripts/discourse/controllers/subscriptions.js b/assets/javascripts/discourse/controllers/subscriptions.js new file mode 100644 index 0000000..b53451a --- /dev/null +++ b/assets/javascripts/discourse/controllers/subscriptions.js @@ -0,0 +1,35 @@ +import Controller from "@ember/controller"; +import Ember from 'ember'; +import I18n from "I18n"; + +export default Controller.extend({ + init() { + // Perform any initialization logic here + this._super(...arguments); + // Additional custom initialization code + if(this.currentUser){ + this.currentUser.checkEmail().then((r)=>this.set('email',this.currentUser.email)) + } + + }, + pricingTable: Ember.computed('email', function() { + try{ + const pricing_table_info = JSON.parse(this.siteSettings.discourse_subscriptions_pricing_table) + if(this.currentUser){ + return``; + } else { + return``; + } + + + } catch(error){ + return I18n.t("discourse_subscriptions.subscribe.no_products") + } + }), +}); diff --git a/assets/javascripts/discourse/initializers/setup-subscriptions.js b/assets/javascripts/discourse/initializers/setup-subscriptions.js index 42339a9..4ca5ada 100644 --- a/assets/javascripts/discourse/initializers/setup-subscriptions.js +++ b/assets/javascripts/discourse/initializers/setup-subscriptions.js @@ -12,7 +12,7 @@ export default { api.addNavigationBarItem({ name: "subscribe", displayName: I18n.t("discourse_subscriptions.navigation.subscribe"), - href: "/s", + href: "/subscriptions", }); } @@ -23,6 +23,30 @@ export default { href: `/u/${user.username}/billing/subscriptions`, content: "Billing", }); + + if(user.admin){ + api.modifyClassStatic('model:site-setting', { + pluginId: 'discourse-subscriptions', + update(key, value, opts = {}) { + if(key ==="discourse_subscriptions_pricing_table"){ + const inputString = value; + // Extract pricing-table-id + const pricingTableIdRegex = /pricing-table-id="([^"]+)"/; + const pricingTableIdMatch = inputString.match(pricingTableIdRegex); + const pricingTableId = pricingTableIdMatch ? pricingTableIdMatch[1] : null; + + // Extract publishable-key + const publishableKeyRegex = /publishable-key="([^"]+)"/; + const publishableKeyMatch = inputString.match(publishableKeyRegex); + const publishableKey = publishableKeyMatch ? publishableKeyMatch[1] : null; + if(pricingTableId && publishableKey){ + value = JSON.stringify({pricingTableId,publishableKey}) + } + } + this._super(key, value, opts); + } + }); + } } }); }, diff --git a/assets/javascripts/discourse/subscriptions-route-map.js b/assets/javascripts/discourse/subscriptions-route-map.js index 2d68b94..b4fb8ca 100644 --- a/assets/javascripts/discourse/subscriptions-route-map.js +++ b/assets/javascripts/discourse/subscriptions-route-map.js @@ -1,5 +1,3 @@ export default function () { - this.route("subscribe", { path: "/s" }, function () { - this.route("show", { path: "/:subscription-id" }); - }); + this.route("subscriptions") } diff --git a/assets/javascripts/discourse/templates/subscriptions.hbs b/assets/javascripts/discourse/templates/subscriptions.hbs new file mode 100644 index 0000000..9153f20 --- /dev/null +++ b/assets/javascripts/discourse/templates/subscriptions.hbs @@ -0,0 +1,3 @@ +
+{{{pricingTable}}} +
\ No newline at end of file diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 6d1f10f..edfca94 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -7,6 +7,7 @@ en: site_settings: discourse_subscriptions_enabled: Enable the Discourse Subscriptions plugin. discourse_subscriptions_extra_nav_subscribe: Show the subscribe button in the primary navigation + discourse_subscriptions_pricing_table: Copy and paste the stripe pricing table embed code here discourse_subscriptions_public_key: Stripe Publishable Key discourse_subscriptions_secret_key: Stripe Secret Key discourse_subscriptions_webhook_secret: Stripe Webhook Secret diff --git a/config/settings.yml b/config/settings.yml index 3dbd594..251c417 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -4,6 +4,10 @@ discourse_subscriptions: discourse_subscriptions_extra_nav_subscribe: default: false client: true + discourse_subscriptions_pricing_table: + default: '' + client: true + refresh: true discourse_subscriptions_public_key: default: '' client: true diff --git a/plugin.rb b/plugin.rb index 0b02690..03b9d91 100644 --- a/plugin.rb +++ b/plugin.rb @@ -21,6 +21,9 @@ register_svg_icon "far-credit-card" if respond_to?(:register_svg_icon) register_html_builder("server:before-head-close") do |controller| "" end +register_html_builder("server:before-head-close") do + '' +end extend_content_security_policy(script_src: %w[https://js.stripe.com/v3/ https://hooks.stripe.com]) @@ -65,6 +68,19 @@ require_relative "app/controllers/concerns/group" after_initialize do ::Stripe.api_version = "2024-04-10" + module ::StripeDiscourseSubscriptions + class Engine < ::Rails::Engine + engine_name 'stripe-discourse-subscriptions' + isolate_namespace StripeDiscourseSubscriptions + end + end + StripeDiscourseSubscriptions::Engine.routes.draw do + get "/" => "pricingtable#index" + end + require_relative "app/controllers/discourse_subscriptions/pricingtable_controller.rb" + + Discourse::Application.routes.append { mount ::StripeDiscourseSubscriptions::Engine, at: "subscriptions" } + ::Stripe.set_app_info( "Discourse Subscriptions", version: "2.8.2",