DEV: Remove the old product / pricing table display routes
This commit is contained in:
@@ -1,10 +0,0 @@
|
||||
import Controller from "@ember/controller";
|
||||
import User from "discourse/models/user";
|
||||
import discourseComputed from "discourse-common/utils/decorators";
|
||||
|
||||
export default Controller.extend({
|
||||
@discourseComputed()
|
||||
isLoggedIn() {
|
||||
return User.current();
|
||||
},
|
||||
});
|
||||
@@ -1,195 +0,0 @@
|
||||
/* global Stripe */
|
||||
import Controller from "@ember/controller";
|
||||
import { not } from "@ember/object/computed";
|
||||
import { inject as service } from "@ember/service";
|
||||
import discourseComputed from "discourse-common/utils/decorators";
|
||||
import I18n from "I18n";
|
||||
import Subscription from "discourse/plugins/discourse-subscriptions/discourse/models/subscription";
|
||||
import Transaction from "discourse/plugins/discourse-subscriptions/discourse/models/transaction";
|
||||
|
||||
export default Controller.extend({
|
||||
dialog: service(),
|
||||
router: service(),
|
||||
selectedPlan: null,
|
||||
promoCode: null,
|
||||
cardholderName: null,
|
||||
cardholderAddress: {
|
||||
line1: null,
|
||||
city: null,
|
||||
state: null,
|
||||
country: null,
|
||||
postalCode: null,
|
||||
},
|
||||
isAnonymous: not("currentUser"),
|
||||
isCountryUS: false,
|
||||
isCountryCA: false,
|
||||
|
||||
init() {
|
||||
this._super(...arguments);
|
||||
this.set(
|
||||
"stripe",
|
||||
Stripe(this.siteSettings.discourse_subscriptions_public_key)
|
||||
);
|
||||
const elements = this.get("stripe").elements();
|
||||
|
||||
this.set("cardElement", elements.create("card", { hidePostalCode: true }));
|
||||
|
||||
this.set("isCountryUS", this.cardholderAddress.country === "US");
|
||||
this.set("isCountryCA", this.cardholderAddress.country === "CA");
|
||||
},
|
||||
|
||||
alert(path) {
|
||||
this.dialog.alert(I18n.t(`discourse_subscriptions.${path}`));
|
||||
},
|
||||
|
||||
@discourseComputed("model.product.repurchaseable", "model.product.subscribed")
|
||||
canPurchase(repurchaseable, subscribed) {
|
||||
if (!repurchaseable && subscribed) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
createSubscription(plan) {
|
||||
return this.stripe
|
||||
.createToken(this.get("cardElement"), {
|
||||
name: this.cardholderName, // Recommended by Stripe
|
||||
address_line1: this.cardholderAddress.line1 ?? "",
|
||||
address_city: this.cardholderAddress.city ?? "",
|
||||
address_state: this.cardholderAddress.state ?? "",
|
||||
address_zip: this.cardholderAddress.postalCode ?? "",
|
||||
address_country: this.cardholderAddress.country, // Recommended by Stripe
|
||||
})
|
||||
.then((result) => {
|
||||
if (result.error) {
|
||||
this.set("loading", false);
|
||||
return result;
|
||||
} else {
|
||||
const subscription = Subscription.create({
|
||||
source: result.token.id,
|
||||
plan: plan.get("id"),
|
||||
promo: this.promoCode,
|
||||
cardholderName: this.cardholderName,
|
||||
cardholderAddress: this.cardholderAddress,
|
||||
});
|
||||
|
||||
return subscription.save();
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
handleAuthentication(plan, transaction) {
|
||||
return this.stripe
|
||||
.confirmCardPayment(transaction.payment_intent.client_secret)
|
||||
.then((result) => {
|
||||
if (
|
||||
result.paymentIntent &&
|
||||
result.paymentIntent.status === "succeeded"
|
||||
) {
|
||||
return result;
|
||||
} else {
|
||||
this.set("loading", false);
|
||||
this.dialog.alert(result.error.message || result.error);
|
||||
return result;
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
_advanceSuccessfulTransaction(plan) {
|
||||
this.alert("plans.success");
|
||||
this.set("loading", false);
|
||||
|
||||
this.router.transitionTo(
|
||||
plan.type === "recurring"
|
||||
? "user.billing.subscriptions"
|
||||
: "user.billing.payments",
|
||||
this.currentUser.username.toLowerCase()
|
||||
);
|
||||
},
|
||||
|
||||
actions: {
|
||||
changeCountry(country) {
|
||||
this.set("cardholderAddress.country", country);
|
||||
this.set("isCountryUS", country === "US");
|
||||
this.set("isCountryCA", country === "CA");
|
||||
},
|
||||
|
||||
changeState(stateOrProvince) {
|
||||
this.set("cardholderAddress.state", stateOrProvince);
|
||||
},
|
||||
|
||||
stripePaymentHandler() {
|
||||
this.set("loading", true);
|
||||
const plan = this.get("model.plans")
|
||||
.filterBy("id", this.selectedPlan)
|
||||
.get("firstObject");
|
||||
const cardholderAddress = this.cardholderAddress;
|
||||
const cardholderName = this.cardholderName;
|
||||
|
||||
if (!plan) {
|
||||
this.alert("plans.validate.payment_options.required");
|
||||
this.set("loading", false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!cardholderName) {
|
||||
this.alert("subscribe.invalid_cardholder_name");
|
||||
this.set("loading", false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!cardholderAddress.country) {
|
||||
this.alert("subscribe.invalid_cardholder_country");
|
||||
this.set("loading", false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (cardholderAddress.country === "US" && !cardholderAddress.state) {
|
||||
this.alert("subscribe.invalid_cardholder_state");
|
||||
this.set("loading", false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (cardholderAddress.country === "CA" && !cardholderAddress.state) {
|
||||
this.alert("subscribe.invalid_cardholder_province");
|
||||
this.set("loading", false);
|
||||
return;
|
||||
}
|
||||
|
||||
let transaction = this.createSubscription(plan);
|
||||
|
||||
transaction
|
||||
.then((result) => {
|
||||
if (result.error) {
|
||||
this.dialog.alert(result.error.message || result.error);
|
||||
} else if (
|
||||
result.status === "incomplete" ||
|
||||
result.status === "open"
|
||||
) {
|
||||
const transactionId = result.id;
|
||||
const planId = this.selectedPlan;
|
||||
this.handleAuthentication(plan, result).then(
|
||||
(authenticationResult) => {
|
||||
if (authenticationResult && !authenticationResult.error) {
|
||||
return Transaction.finalize(transactionId, planId).then(
|
||||
() => {
|
||||
this._advanceSuccessfulTransaction(plan);
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
);
|
||||
} else {
|
||||
this._advanceSuccessfulTransaction(plan);
|
||||
}
|
||||
})
|
||||
.catch((result) => {
|
||||
this.dialog.alert(
|
||||
result.jqXHR.responseJSON.errors[0] || result.errorThrown
|
||||
);
|
||||
this.set("loading", false);
|
||||
});
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -1,3 +0,0 @@
|
||||
import Controller from "@ember/controller";
|
||||
|
||||
export default Controller.extend({});
|
||||
@@ -1,11 +0,0 @@
|
||||
<div class="container">
|
||||
<div class="title-wrapper">
|
||||
<h1>
|
||||
{{i18n "discourse_subscriptions.subscribe.title"}}
|
||||
</h1>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
{{outlet}}
|
||||
</div>
|
||||
@@ -1,5 +0,0 @@
|
||||
{{#unless isLoggedIn}}
|
||||
<LoginRequired />
|
||||
{{/unless}}
|
||||
|
||||
<ProductList @products={{model}} @isLoggedIn={{isLoggedIn}} />
|
||||
@@ -1,126 +0,0 @@
|
||||
<div class="discourse-subscriptions-section-columns">
|
||||
<div class="section-column discourse-subscriptions-confirmation-billing">
|
||||
<h2>
|
||||
{{model.product.name}}
|
||||
</h2>
|
||||
|
||||
<hr />
|
||||
|
||||
<p>
|
||||
{{html-safe model.product.description}}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="section-column">
|
||||
{{#if canPurchase}}
|
||||
<h2>
|
||||
{{i18n "discourse_subscriptions.subscribe.card.title"}}
|
||||
</h2>
|
||||
|
||||
<hr />
|
||||
|
||||
<PaymentOptions @plans={{model.plans}} @selectedPlan={{selectedPlan}} />
|
||||
|
||||
<hr />
|
||||
|
||||
<SubscribeCard @cardElement={{cardElement}} />
|
||||
|
||||
{{#if loading}}
|
||||
{{loading-spinner}}
|
||||
{{else if isAnonymous}}
|
||||
<LoginRequired />
|
||||
{{else}}
|
||||
<Input
|
||||
@type="text"
|
||||
name="cardholder_name"
|
||||
placeholder={{i18n
|
||||
"discourse_subscriptions.subscribe.cardholder_name"
|
||||
}}
|
||||
@value={{cardholderName}}
|
||||
class="subscribe-name"
|
||||
/>
|
||||
<div class="address-fields">
|
||||
<SubscribeCountrySelect
|
||||
@value={{cardholderAddress.country}}
|
||||
@onChange={{action "changeCountry"}}
|
||||
/>
|
||||
<Input
|
||||
@type="text"
|
||||
name="cardholder_postal_code"
|
||||
placeholder={{i18n
|
||||
"discourse_subscriptions.subscribe.cardholder_address.postal_code"
|
||||
}}
|
||||
@value={{cardholderAddress.postalCode}}
|
||||
class="subscribe-address-postal-code"
|
||||
/>
|
||||
</div>
|
||||
<Input
|
||||
@type="text"
|
||||
name="cardholder_line1"
|
||||
placeholder={{i18n
|
||||
"discourse_subscriptions.subscribe.cardholder_address.line1"
|
||||
}}
|
||||
@value={{cardholderAddress.line1}}
|
||||
class="subscribe-address-line1"
|
||||
/>
|
||||
<div class="address-fields">
|
||||
<Input
|
||||
@type="text"
|
||||
name="cardholder_city"
|
||||
placeholder={{i18n
|
||||
"discourse_subscriptions.subscribe.cardholder_address.city"
|
||||
}}
|
||||
@value={{cardholderAddress.city}}
|
||||
class="subscribe-address-city"
|
||||
/>
|
||||
{{#if isCountryUS}}
|
||||
<SubscribeUsStateSelect
|
||||
@value={{cardholderAddress.state}}
|
||||
@onChange={{action "changeState"}}
|
||||
/>
|
||||
{{else if isCountryCA}}
|
||||
<SubscribeCaProvinceSelect
|
||||
@value={{cardholderAddress.state}}
|
||||
@onChange={{action "changeState"}}
|
||||
/>
|
||||
{{else}}
|
||||
<Input
|
||||
@type="text"
|
||||
name="cardholder_state"
|
||||
placeholder={{i18n
|
||||
"discourse_subscriptions.subscribe.cardholder_address.state"
|
||||
}}
|
||||
@value={{cardholderAddress.state}}
|
||||
class="subscribe-address-state"
|
||||
/>
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
<Input
|
||||
@type="text"
|
||||
name="promo_code"
|
||||
placeholder={{i18n "discourse_subscriptions.subscribe.promo_code"}}
|
||||
@value={{promoCode}}
|
||||
class="subscribe-promo-code"
|
||||
/>
|
||||
|
||||
<DButton
|
||||
@disabled={{loading}}
|
||||
@action={{action "stripePaymentHandler"}}
|
||||
class="btn btn-primary btn-payment"
|
||||
@label="discourse_subscriptions.plans.payment_button"
|
||||
/>
|
||||
{{/if}}
|
||||
{{else}}
|
||||
<h2>{{i18n "discourse_subscriptions.subscribe.already_purchased"}}</h2>
|
||||
|
||||
<LinkTo
|
||||
@route="user.billing.subscriptions"
|
||||
@model={{currentUser.username}}
|
||||
class="btn btn-primary"
|
||||
>
|
||||
{{i18n "discourse_subscriptions.subscribe.go_to_billing"}}
|
||||
</LinkTo>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
Reference in New Issue
Block a user