139 lines
3.4 KiB
JavaScript
139 lines
3.4 KiB
JavaScript
|
module.exports = {
|
||
|
/**
|
||
|
* The mixin's data.
|
||
|
*/
|
||
|
data() {
|
||
|
return {
|
||
|
plans: [],
|
||
|
selectedPlan: null,
|
||
|
|
||
|
invitation: null,
|
||
|
invalidInvitation: false
|
||
|
};
|
||
|
},
|
||
|
|
||
|
|
||
|
methods: {
|
||
|
/**
|
||
|
* Get the active plans for the application.
|
||
|
*/
|
||
|
getPlans() {
|
||
|
if ( ! Spark.cardUpFront) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
axios.get('/spark/plans')
|
||
|
.then(response => {
|
||
|
var plans = response.data;
|
||
|
|
||
|
this.plans = _.where(plans, {type: "user"}).length > 0
|
||
|
? _.where(plans, {type: "user"})
|
||
|
: _.where(plans, {type: "team"});
|
||
|
|
||
|
this.selectAppropriateDefaultPlan();
|
||
|
});
|
||
|
},
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Get the invitation specified in the query string.
|
||
|
*/
|
||
|
getInvitation() {
|
||
|
axios.get(`/invitations/${this.query.invitation}`)
|
||
|
.then(response => {
|
||
|
this.invitation = response.data;
|
||
|
})
|
||
|
.catch(response => {
|
||
|
this.invalidInvitation = true;
|
||
|
});
|
||
|
},
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Select the appropriate default plan for registration.
|
||
|
*/
|
||
|
selectAppropriateDefaultPlan() {
|
||
|
if (this.query.plan) {
|
||
|
this.selectPlanById(this.query.plan) || this.selectPlanByName(this.query.plan);
|
||
|
} else if (this.query.invitation) {
|
||
|
this.selectFreePlan();
|
||
|
} else if (this.paidPlansForActiveInterval.length > 0) {
|
||
|
this.selectPlan(this.paidPlansForActiveInterval[0]);
|
||
|
} else {
|
||
|
this.selectFreePlan();
|
||
|
}
|
||
|
|
||
|
if (this.shouldShowYearlyPlans()) {
|
||
|
this.showYearlyPlans();
|
||
|
}
|
||
|
},
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Select the free plan.
|
||
|
*/
|
||
|
selectFreePlan() {
|
||
|
const plan = _.find(this.plans, plan => plan.price === 0);
|
||
|
|
||
|
if (typeof plan !== 'undefined') {
|
||
|
this.selectPlan(plan);
|
||
|
}
|
||
|
},
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Select the plan with the given id.
|
||
|
*/
|
||
|
selectPlanById(id) {
|
||
|
_.each(this.plans, plan => {
|
||
|
if (plan.id == id) {
|
||
|
this.selectPlan(plan);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
return this.selectedPlan;
|
||
|
},
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Select the plan with the given name.
|
||
|
*/
|
||
|
selectPlanByName(name) {
|
||
|
_.each(this.plans, plan => {
|
||
|
if (plan.name == name) {
|
||
|
this.selectPlan(plan);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
return this.selectedPlan;
|
||
|
},
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Determine if the given plan is selected.
|
||
|
*/
|
||
|
isSelected(plan) {
|
||
|
return this.selectedPlan && plan.id == this.selectedPlan.id;
|
||
|
},
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Select the given plan.
|
||
|
*/
|
||
|
selectPlan(plan) {
|
||
|
this.selectedPlan = plan;
|
||
|
|
||
|
this.registerForm.plan = plan.id;
|
||
|
},
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Determine if we should show the yearly plans.
|
||
|
*/
|
||
|
shouldShowYearlyPlans(){
|
||
|
return (this.monthlyPlans.length == 0 && this.yearlyPlans.length > 0) ||
|
||
|
this.selectedPlan.interval == 'yearly'
|
||
|
}
|
||
|
}
|
||
|
};
|