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

123 lines
3.3 KiB
Plaintext
Raw Normal View History

2019-12-11 20:59:26 -05:00
import Customer from "discourse/plugins/discourse-subscriptions/discourse/models/customer";
import Payment from "discourse/plugins/discourse-subscriptions/discourse/models/payment";
2019-12-11 20:59:26 -05:00
import Subscription from "discourse/plugins/discourse-subscriptions/discourse/models/subscription";
import computed from "discourse-common/utils/decorators";
2019-10-09 22:52:55 -04:00
export default Ember.Controller.extend({
planTypeIsSelected: true,
@computed("planTypeIsSelected")
type(planTypeIsSelected) {
return planTypeIsSelected ? "plans" : "payment";
},
@computed("type")
buttonText(type) {
2019-12-12 20:29:34 -05:00
return I18n.t(`discourse_subscriptions.${type}.payment_button`);
},
init() {
this._super(...arguments);
2019-12-17 05:14:13 -05:00
this.set(
"paymentsAllowed",
Discourse.SiteSettings.discourse_subscriptions_allow_payments
);
this.set(
"stripe",
2019-12-03 19:53:05 -05:00
Stripe(Discourse.SiteSettings.discourse_subscriptions_public_key)
);
const elements = this.get("stripe").elements();
2019-11-28 23:08:51 -05:00
2019-12-09 18:15:30 -05: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 02:46:48 -05: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();
});
}
});
},
2019-10-09 22:52:55 -04:00
actions: {
stripePaymentHandler() {
2019-11-13 21:43:18 -05:00
this.set("loading", true);
const type = this.get("type");
2019-12-09 18:55:24 -05:00
const plan = this.get("model.plans")
.filterBy("selected")
.get("firstObject");
if (!plan) {
this.alert(`${type}.validate.payment_options.required`);
2019-12-09 18:55:24 -05:00
this.set("loading", false);
return;
}
2019-11-13 21:43:18 -05:00
let transaction;
if (this.planTypeIsSelected) {
2020-01-14 02:46:48 -05: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 04:15:54 -05:00
if (result.status === "incomplete") {
2020-01-14 02:46:48 -05:00
this.alert(`${type}.incomplete`);
2020-01-14 04:15:54 -05:00
} else {
2020-01-14 02:46:48 -05:00
this.alert(`${type}.success`);
}
2019-12-12 21:44:25 -05:00
const success_route = this.planTypeIsSelected
2019-12-15 18:47:59 -05:00
? "user.billing.subscriptions"
: "user.billing.payments";
2019-12-12 21:44:25 -05:00
this.transitionToRoute(
2019-12-12 21:44:25 -05:00
success_route,
Discourse.User.current().username.toLowerCase()
);
}
})
.catch(result => {
bootbox.alert(result.errorThrown);
})
.finally(() => {
2019-11-13 21:43:18 -05:00
this.set("loading", false);
});
2019-10-09 22:52:55 -04:00
}
}
});