overleaf/services/web/public/src/main/account-settings.js
Hugh O'Brien d4eb71b525 Merge pull request #1788 from overleaf/ta-ensure-can-delete-account
Prevent Subscription Owner from Deleting their Account

GitOrigin-RevId: bd60484bdfb6381216cfc0799e45b28300014ca0
2019-05-28 15:51:27 +00:00

142 lines
4.1 KiB
JavaScript

/* eslint-disable
camelcase,
max-len,
no-return-assign,
no-undef,
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
* DS207: Consider shorter variations of null checks
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
define(['base'], function(App) {
App.controller('AccountSettingsController', [
'$scope',
'$http',
'$modal',
'event_tracking',
'UserAffiliationsDataService',
'UserOauthDataService',
function(
$scope,
$http,
$modal,
event_tracking,
UserAffiliationsDataService,
UserOauthDataService
) {
$scope.subscribed = true
$scope.unsubscribe = function() {
$scope.unsubscribing = true
return $http({
method: 'DELETE',
url: '/user/newsletter/unsubscribe',
headers: {
'X-CSRF-Token': window.csrfToken
}
})
.then(function() {
$scope.unsubscribing = false
return ($scope.subscribed = false)
})
.catch(() => ($scope.unsubscribing = true))
}
$scope.deleteAccount = function() {
let modalInstance
return (modalInstance = $modal.open({
templateUrl: 'deleteAccountModalTemplate',
controller: 'DeleteAccountModalController',
resolve: {
userDefaultEmail() {
return UserAffiliationsDataService.getUserDefaultEmail()
.then(
defaultEmailDetails =>
(defaultEmailDetails != null
? defaultEmailDetails.email
: undefined) || null
)
.catch(() => null)
}
}
}))
}
return ($scope.upgradeIntegration = service =>
event_tracking.send('subscription-funnel', 'settings-page', service))
}
])
return App.controller('DeleteAccountModalController', [
'$scope',
'$modalInstance',
'$timeout',
'$http',
'userDefaultEmail',
function($scope, $modalInstance, $timeout, $http, userDefaultEmail) {
$scope.state = {
isValid: false,
deleteText: '',
password: '',
confirmV1Purge: false,
confirmSharelatexDelete: false,
inflight: false,
error: null
}
$scope.userDefaultEmail = userDefaultEmail
$modalInstance.opened.then(() =>
$timeout(() => $scope.$broadcast('open'), 700)
)
$scope.checkValidation = () =>
($scope.state.isValid =
userDefaultEmail != null &&
$scope.state.deleteText.toLowerCase() ===
userDefaultEmail.toLowerCase() &&
$scope.state.password.length > 0 &&
$scope.state.confirmV1Purge &&
$scope.state.confirmSharelatexDelete)
$scope.delete = function() {
$scope.state.inflight = true
$scope.state.error = null
return $http({
method: 'POST',
url: '/user/delete',
headers: {
'X-CSRF-Token': window.csrfToken,
'Content-Type': 'application/json'
},
data: {
password: $scope.state.password
},
disableAutoLoginRedirect: true // we want to handle errors ourselves
})
.then(function() {
$modalInstance.close()
$scope.state.inflight = false
$scope.state.error = null
return setTimeout(() => (window.location = '/login'), 1000)
})
.catch(function(response) {
const { data, status } = response
$scope.state.inflight = false
if (status === 403) {
$scope.state.error = { code: 'InvalidCredentialsError' }
} else {
$scope.state.error = { code: data.error }
}
})
}
return ($scope.cancel = () => $modalInstance.dismiss('cancel'))
}
])
})