overleaf/services/web/frontend/js/main/user-membership.js
Timothée Alby 5bfb1b8781 Merge pull request #8704 from overleaf/ta-multiple-invites-fix
Fix UX on Duplicate Group Invites

GitOrigin-RevId: e51c406d578b130972024065f9b8bdb2503944a9
2022-07-08 08:03:30 +00:00

126 lines
4 KiB
JavaScript

import _ from 'lodash'
/* eslint-disable
max-len,
no-return-assign,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
* decaffeinate suggestions:
* DS101: Remove unnecessary use of Array.from
* 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
*/
import App from '../base'
App.controller('UserMembershipController', function ($scope, queuedHttp) {
$scope.users = window.users
$scope.groupSize = window.groupSize
$scope.paths = window.paths
$scope.selectedUsers = []
$scope.inputs = {
addMembers: {
content: '',
error: false,
errorMessage: null,
inflightCount: 0,
},
removeMembers: {
error: false,
errorMessage: null,
},
}
const parseEmails = function (emailsString) {
const regexBySpaceOrComma = /[\s,]+/
let emails = emailsString.split(regexBySpaceOrComma)
emails = _.map(emails, email => (email = email.trim()))
emails = _.filter(emails, email => email.indexOf('@') !== -1)
return emails
}
$scope.addMembers = function () {
$scope.inputs.addMembers.error = false
$scope.inputs.addMembers.errorMessage = null
$scope.inputs.addMembers.inflightCount = 0
const emails = parseEmails($scope.inputs.addMembers.content)
return Array.from(emails).map(email => {
$scope.inputs.addMembers.inflightCount += 1
return queuedHttp
.post(window.paths.addMember, {
email,
_csrf: window.csrfToken,
})
.then(function (response) {
$scope.inputs.addMembers.inflightCount -= 1
const { data } = response
if (data.user != null) {
const alreadyListed = $scope.users.find(
scopeUser => scopeUser.email === data.user.email
)
if (!alreadyListed) {
$scope.users.push(data.user)
}
}
return ($scope.inputs.addMembers.content = '')
})
.catch(function (response) {
$scope.inputs.addMembers.inflightCount -= 1
const { data } = response
$scope.inputs.addMembers.error = true
return ($scope.inputs.addMembers.errorMessage =
data.error != null ? data.error.message : undefined)
})
})
}
$scope.removeMembers = function () {
$scope.inputs.removeMembers.error = false
$scope.inputs.removeMembers.errorMessage = null
for (const user of Array.from($scope.selectedUsers)) {
;(function (user) {
let url
if (window.paths.removeInvite && user.invite && user._id == null) {
url = `${window.paths.removeInvite}/${encodeURIComponent(user.email)}`
} else if (window.paths.removeMember && user._id != null) {
url = `${window.paths.removeMember}/${user._id}`
} else {
return
}
return queuedHttp({
method: 'DELETE',
url,
headers: {
'X-Csrf-Token': window.csrfToken,
},
})
.then(function () {
const index = $scope.users.indexOf(user)
if (index === -1) {
return
}
return $scope.users.splice(index, 1)
})
.catch(function (response) {
const { data } = response
$scope.inputs.removeMembers.error = true
return ($scope.inputs.removeMembers.errorMessage =
data.error != null ? data.error.message : undefined)
})
})(user)
}
return $scope.updateSelectedUsers
}
return ($scope.updateSelectedUsers = () =>
($scope.selectedUsers = $scope.users.filter(user => user.selected)))
})
export default App.controller('UserMembershipListItemController', $scope =>
$scope.$watch('user.selected', function (value) {
if (value != null) {
return $scope.updateSelectedUsers()
}
})
)