Files
discourse-subscriptions/assets/javascripts/discourse/controllers/s-show.js.es6
T

123 lines
3.3 KiB
JavaScript
Raw Normal View History

2019-12-12 12:59:26 +11:00
import Customer from "discourse/plugins/discourse-subscriptions/discourse/models/customer";
import Payment from "discourse/plugins/discourse-subscriptions/discourse/models/payment";
2019-12-12 12:59:26 +11:00
import Subscription from "discourse/plugins/discourse-subscriptions/discourse/models/subscription";
import computed from "discourse-common/utils/decorators";
2019-10-10 13:52:55 +11:00
export default Ember.Controller.extend({
planTypeIsSelected: true,
@computed("planTypeIsSelected")
type(planTypeIsSelected) {
return planTypeIsSelected ? "plans" : "payment";
},
@computed("type")
buttonText(type) {
2019-12-13 12:29:34 +11:00
return I18n.t(`discourse_subscriptions.${type}.payment_button`);
},
init() {
this._super(...arguments);
2019-12-17 21:14:13 +11:00
this.set(
"paymentsAllowed",
Discourse.SiteSettings.discourse_subscriptions_allow_payments
);
this.set(
"stripe",
2019-12-04 11:53:05 +11:00
Stripe(Discourse.SiteSettings.discourse_subscriptions_public_key)
);
const elements = this.get("stripe").elements();
2019-11-29 15:08:51 +11:00
2019-12-10 10:15:30 +11:00
this.set("cardElement", elements.create("card", { hidePostalCode: true }));
},
alert(path) {
bootbox.alert(I18n.t(`discourse_subscriptions.${path}`));
},
createPayment(plan) {
return this.stripe
.createPaymentMethod("card", this.get("cardElement"))
.then(result => {
const payment = Payment.create({
payment_method: result.paymentMethod.id,
amount: plan.get("amount"),
currency: plan.get("currency")
});
return payment.save();
});
},
2020-01-14 18:46:48 +11:00
createSubscription(plan) {
return this.stripe.createToken(this.get("cardElement")).then(result => {
if (result.error) {
return result;
} else {
const customer = Customer.create({ source: result.token.id });
return customer.save().then(c => {
const subscription = Subscription.create({
customer: c.id,
plan: plan.get("id")
});
return subscription.save();
});
}
});
},
actions: {
stripePaymentHandler() {
2019-11-14 13:43:18 +11:00
this.set("loading", true);
const type = this.get("type");
2019-12-10 10:55:24 +11:00
const plan = this.get("model.plans")
.filterBy("selected")
.get("firstObject");
if (!plan) {
this.alert(`${type}.validate.payment_options.required`);
2019-12-10 10:55:24 +11:00
this.set("loading", false);
return;
}
2019-11-14 13:43:18 +11:00
let transaction;
if (this.planTypeIsSelected) {
2020-01-14 18:46:48 +11:00
transaction = this.createSubscription(plan);
} else {
transaction = this.createPayment(plan);
}
transaction
.then(result => {
if (result.error) {
bootbox.alert(result.error.message || result.error);
} else {
2020-01-14 20:15:54 +11:00
if (result.status === "incomplete") {
2020-01-14 18:46:48 +11:00
this.alert(`${type}.incomplete`);
2020-01-14 20:15:54 +11:00
} else {
2020-01-14 18:46:48 +11:00
this.alert(`${type}.success`);
}
2019-12-13 13:44:25 +11:00
const success_route = this.planTypeIsSelected
2019-12-16 10:47:59 +11:00
? "user.billing.subscriptions"
: "user.billing.payments";
2019-12-13 13:44:25 +11:00
this.transitionToRoute(
2019-12-13 13:44:25 +11:00
success_route,
Discourse.User.current().username.toLowerCase()
);
}
})
.catch(result => {
bootbox.alert(result.errorThrown);
})
.finally(() => {
2019-11-14 13:43:18 +11:00
this.set("loading", false);
});
2019-10-10 13:52:55 +11:00
}
}
});