mirror of
https://github.com/overleaf/overleaf.git
synced 2024-12-12 09:07:40 -05:00
682abe9ca5
Show error in plan change modal if plan change fails GitOrigin-RevId: 698aab43feacdb5ced41f239167c5d132f7ca8de
312 lines
9.2 KiB
JavaScript
312 lines
9.2 KiB
JavaScript
import _ from 'lodash'
|
|
/* global recurly */
|
|
|
|
/* eslint-disable
|
|
camelcase,
|
|
max-len,
|
|
no-return-assign,
|
|
no-unused-vars,
|
|
*/
|
|
// TODO: This file was created by bulk-decaffeinate.
|
|
// Fix any style issues and re-enable lint.
|
|
/*
|
|
* decaffeinate suggestions:
|
|
* DS102: Remove unnecessary code created because of implicit returns
|
|
* DS104: Avoid inline assignments
|
|
* DS204: Change includes calls to have a more natural evaluation order
|
|
* DS207: Consider shorter variations of null checks
|
|
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
|
*/
|
|
import App from '../base'
|
|
import getMeta from '../utils/meta'
|
|
const SUBSCRIPTION_URL = '/user/subscription/update'
|
|
|
|
const ensureRecurlyIsSetup = _.once(() => {
|
|
if (typeof recurly === 'undefined' || !recurly) {
|
|
return false
|
|
}
|
|
recurly.configure(getMeta('ol-recurlyApiKey'))
|
|
return true
|
|
})
|
|
|
|
App.controller('MetricsEmailController', function ($scope, $http) {
|
|
$scope.institutionEmailSubscription = function (institutionId) {
|
|
var inst = _.find(window.managedInstitutions, function (institution) {
|
|
return institution.v1Id === parseInt(institutionId)
|
|
})
|
|
if (inst.metricsEmail.optedOutUserIds.includes(window.user_id)) {
|
|
return 'Subscribe'
|
|
} else {
|
|
return 'Unsubscribe'
|
|
}
|
|
}
|
|
|
|
$scope.changeInstitutionalEmailSubscription = function (institutionId) {
|
|
$scope.subscriptionChanging = true
|
|
return $http({
|
|
method: 'POST',
|
|
url: `/institutions/${institutionId}/emailSubscription`,
|
|
headers: {
|
|
'X-CSRF-Token': window.csrfToken,
|
|
},
|
|
}).then(function successCallback(response) {
|
|
window.managedInstitutions = _.map(
|
|
window.managedInstitutions,
|
|
function (institution) {
|
|
if (institution.v1Id === parseInt(institutionId)) {
|
|
institution.metricsEmail.optedOutUserIds = response.data
|
|
}
|
|
return institution
|
|
}
|
|
)
|
|
$scope.subscriptionChanging = false
|
|
})
|
|
}
|
|
})
|
|
|
|
App.factory('RecurlyPricing', function ($q, MultiCurrencyPricing) {
|
|
return {
|
|
loadDisplayPriceWithTax: function (planCode, currency, taxRate) {
|
|
if (!ensureRecurlyIsSetup()) return
|
|
const currencySymbol = MultiCurrencyPricing.plans[currency].symbol
|
|
const pricing = recurly.Pricing()
|
|
return $q(function (resolve, reject) {
|
|
pricing
|
|
.plan(planCode, { quantity: 1 })
|
|
.currency(currency)
|
|
.done(function (price) {
|
|
const totalPriceExTax = parseFloat(price.next.total)
|
|
let taxAmmount = totalPriceExTax * taxRate
|
|
if (isNaN(taxAmmount)) {
|
|
taxAmmount = 0
|
|
}
|
|
let total = totalPriceExTax + taxAmmount
|
|
if (total % 1 !== 0) {
|
|
total = total.toFixed(2)
|
|
}
|
|
resolve(`${currencySymbol}${total}`)
|
|
})
|
|
})
|
|
},
|
|
}
|
|
})
|
|
|
|
App.controller(
|
|
'ChangePlanFormController',
|
|
function ($scope, $modal, RecurlyPricing) {
|
|
if (!ensureRecurlyIsSetup()) return
|
|
|
|
$scope.changePlan = () =>
|
|
$modal.open({
|
|
templateUrl: 'confirmChangePlanModalTemplate',
|
|
controller: 'ConfirmChangePlanController',
|
|
scope: $scope,
|
|
})
|
|
|
|
$scope.cancelPendingPlanChange = () =>
|
|
$modal.open({
|
|
templateUrl: 'cancelPendingPlanChangeModalTemplate',
|
|
controller: 'CancelPendingPlanChangeController',
|
|
scope: $scope,
|
|
})
|
|
|
|
$scope.$watch('plan', function (plan) {
|
|
if (!plan) return
|
|
const planCodesChangingAtTermEnd = getMeta(
|
|
'ol-planCodesChangingAtTermEnd'
|
|
)
|
|
$scope.planChangesAtTermEnd = false
|
|
if (
|
|
planCodesChangingAtTermEnd &&
|
|
planCodesChangingAtTermEnd.indexOf(plan.planCode) > -1
|
|
) {
|
|
$scope.planChangesAtTermEnd = true
|
|
}
|
|
const planCode = plan.planCode
|
|
const subscription = getMeta('ol-subscription')
|
|
const { currency, taxRate } = subscription.recurly
|
|
$scope.price = '...' // Placeholder while we talk to recurly
|
|
RecurlyPricing.loadDisplayPriceWithTax(planCode, currency, taxRate).then(
|
|
price => {
|
|
$scope.price = price
|
|
}
|
|
)
|
|
})
|
|
}
|
|
)
|
|
|
|
App.controller(
|
|
'ConfirmChangePlanController',
|
|
function ($scope, $modalInstance, $http) {
|
|
$scope.confirmChangePlan = function () {
|
|
const body = {
|
|
plan_code: $scope.plan.planCode,
|
|
_csrf: window.csrfToken,
|
|
}
|
|
|
|
$scope.genericError = false
|
|
$scope.inflight = true
|
|
|
|
return $http
|
|
.post(`${SUBSCRIPTION_URL}?origin=confirmChangePlan`, body)
|
|
.then(() => location.reload())
|
|
.catch(() => {
|
|
$scope.genericError = true
|
|
$scope.inflight = false
|
|
})
|
|
}
|
|
|
|
return ($scope.cancel = () => $modalInstance.dismiss('cancel'))
|
|
}
|
|
)
|
|
|
|
App.controller(
|
|
'CancelPendingPlanChangeController',
|
|
function ($scope, $modalInstance, $http) {
|
|
$scope.confirmCancelPendingPlanChange = function () {
|
|
const body = {
|
|
_csrf: window.csrfToken,
|
|
}
|
|
|
|
$scope.genericError = false
|
|
$scope.inflight = true
|
|
|
|
return $http
|
|
.post('/user/subscription/cancel-pending', body)
|
|
.then(() => location.reload())
|
|
.catch(() => {
|
|
$scope.genericError = true
|
|
$scope.inflight = false
|
|
})
|
|
}
|
|
|
|
return ($scope.cancel = () => $modalInstance.dismiss('cancel'))
|
|
}
|
|
)
|
|
|
|
App.controller(
|
|
'LeaveGroupModalController',
|
|
function ($scope, $modalInstance, $http) {
|
|
$scope.confirmLeaveGroup = function () {
|
|
$scope.inflight = true
|
|
return $http({
|
|
url: '/subscription/group/user',
|
|
method: 'DELETE',
|
|
params: {
|
|
subscriptionId: $scope.subscriptionId,
|
|
_csrf: window.csrfToken,
|
|
},
|
|
})
|
|
.then(() => location.reload())
|
|
.catch(() => console.log('something went wrong changing plan'))
|
|
}
|
|
|
|
return ($scope.cancel = () => $modalInstance.dismiss('cancel'))
|
|
}
|
|
)
|
|
|
|
App.controller('GroupMembershipController', function ($scope, $modal) {
|
|
$scope.removeSelfFromGroup = function (subscriptionId) {
|
|
$scope.subscriptionId = subscriptionId
|
|
return $modal.open({
|
|
templateUrl: 'LeaveGroupModalTemplate',
|
|
controller: 'LeaveGroupModalController',
|
|
scope: $scope,
|
|
})
|
|
}
|
|
})
|
|
|
|
App.controller('RecurlySubscriptionController', function ($scope) {
|
|
const recurlyIsSetup = ensureRecurlyIsSetup()
|
|
const subscription = getMeta('ol-subscription')
|
|
$scope.showChangePlanButton = recurlyIsSetup && !subscription.groupPlan
|
|
if (
|
|
window.subscription.recurly.account.has_past_due_invoice &&
|
|
window.subscription.recurly.account.has_past_due_invoice._ === 'true'
|
|
) {
|
|
$scope.showChangePlanButton = false
|
|
}
|
|
$scope.recurlyLoadError = !recurlyIsSetup
|
|
|
|
$scope.switchToDefaultView = () => {
|
|
$scope.showCancellation = false
|
|
$scope.showChangePlan = false
|
|
}
|
|
$scope.switchToDefaultView()
|
|
|
|
$scope.switchToCancellationView = () => {
|
|
$scope.showCancellation = true
|
|
$scope.showChangePlan = false
|
|
}
|
|
|
|
$scope.switchToChangePlanView = () => {
|
|
$scope.showCancellation = false
|
|
$scope.showChangePlan = true
|
|
}
|
|
})
|
|
|
|
App.controller(
|
|
'RecurlyCancellationController',
|
|
function ($scope, RecurlyPricing, $http) {
|
|
if (!ensureRecurlyIsSetup()) return
|
|
const subscription = getMeta('ol-subscription')
|
|
const sevenDaysTime = new Date()
|
|
sevenDaysTime.setDate(sevenDaysTime.getDate() + 7)
|
|
const freeTrialEndDate = new Date(subscription.recurly.trial_ends_at)
|
|
const freeTrialInFuture = freeTrialEndDate > new Date()
|
|
const freeTrialExpiresUnderSevenDays = freeTrialEndDate < sevenDaysTime
|
|
|
|
const isMonthlyCollab =
|
|
subscription.plan.planCode.indexOf('collaborator') !== -1 &&
|
|
subscription.plan.planCode.indexOf('ann') === -1 &&
|
|
!subscription.groupPlan
|
|
const stillInFreeTrial = freeTrialInFuture && freeTrialExpiresUnderSevenDays
|
|
|
|
if (isMonthlyCollab && stillInFreeTrial) {
|
|
$scope.showExtendFreeTrial = true
|
|
} else if (isMonthlyCollab && !stillInFreeTrial) {
|
|
$scope.showDowngradeToStudent = true
|
|
} else {
|
|
$scope.showBasicCancel = true
|
|
}
|
|
|
|
const { currency, taxRate } = subscription.recurly
|
|
$scope.studentPrice = '...' // Placeholder while we talk to recurly
|
|
RecurlyPricing.loadDisplayPriceWithTax('student', currency, taxRate).then(
|
|
price => {
|
|
$scope.studentPrice = price
|
|
}
|
|
)
|
|
|
|
$scope.downgradeToStudent = function () {
|
|
const body = {
|
|
plan_code: 'student',
|
|
_csrf: window.csrfToken,
|
|
}
|
|
$scope.inflight = true
|
|
return $http
|
|
.post(`${SUBSCRIPTION_URL}?origin=downgradeToStudent`, body)
|
|
.then(() => location.reload())
|
|
.catch(() => console.log('something went wrong changing plan'))
|
|
}
|
|
|
|
$scope.cancelSubscription = function () {
|
|
const body = { _csrf: window.csrfToken }
|
|
|
|
$scope.inflight = true
|
|
return $http
|
|
.post('/user/subscription/cancel', body)
|
|
.then(() => (location.href = '/user/subscription/canceled'))
|
|
.catch(() => console.log('something went wrong changing plan'))
|
|
}
|
|
|
|
$scope.extendTrial = function () {
|
|
const body = { _csrf: window.csrfToken }
|
|
$scope.inflight = true
|
|
return $http
|
|
.put('/user/subscription/extend', body)
|
|
.then(() => location.reload())
|
|
.catch(() => console.log('something went wrong changing plan'))
|
|
}
|
|
}
|
|
)
|