You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
4.3 KiB

// Packages
const chalk = require('chalk')
// Ours
const regexes = require('../../lib/utils/input/regexes')
const wait = require('../../lib/utils/output/wait')
const cfg = require('../../lib/cfg')
const fatalError = require('../../lib/utils/fatal-error')
const cmd = require('../../lib/utils/output/cmd')
const info = require('../../lib/utils/output/info')
const stamp = require('../../lib/utils/output/stamp')
const param = require('../../lib/utils/output/param')
const { tick } = require('../../lib/utils/output/chars')
const rightPad = require('../../lib/utils/output/right-pad')
const textInput = require('../../lib/utils/input/text')
const eraseLines = require('../../lib/utils/output/erase-lines')
const success = require('../../lib/utils/output/success')
const error = require('../../lib/utils/output/error')
function validateEmail(data) {
return regexes.email.test(data.trim()) || data.length === 0
}
const domains = Array.from(
new Set([
'aol.com',
'gmail.com',
'google.com',
'yahoo.com',
'ymail.com',
'hotmail.com',
'live.com',
'outlook.com',
'inbox.com',
'mail.com',
'gmx.com',
'icloud.com'
])
)
function emailAutoComplete(value, teamSlug) {
const parts = value.split('@')
if (parts.length === 2 && parts[1].length > 0) {
const [, host] = parts
let suggestion = false
domains.unshift(teamSlug)
for (const domain of domains) {
if (domain.startsWith(host)) {
suggestion = domain.substr(host.length)
break
}
}
domains.shift()
return suggestion
}
return false
}
module.exports = async function(
{ teams, args, token, introMsg, noopMsg = 'No changes made' } = {}
) {
const { user, currentTeam } = await cfg.read({ token })
domains.push(user.email.split('@')[1])
if (!currentTeam) {
let err = `You can't run this command under ${param(user.username || user.email)}.\n`
err += `${chalk.gray('>')} Run ${cmd('now switch')} to choose to a team.`
return fatalError(err)
}
info(introMsg || `Inviting team members to ${chalk.bold(currentTeam.name)}`)
if (args.length > 0) {
for (const email of args) {
if (regexes.email.test(email)) {
const stopSpinner = wait(email)
const elapsed = stamp()
// eslint-disable-next-line no-await-in-loop
await teams.inviteUser({ teamId: currentTeam.id, email })
stopSpinner()
console.log(`${chalk.cyan(tick)} ${email} ${elapsed()}`)
} else {
console.log(`${chalk.red(`${email}`)} ${chalk.gray('[invalid]')}`)
}
}
return
}
const inviteUserPrefix = rightPad('Invite User', 14)
const emails = []
let hasError = false
let email
do {
email = ''
try {
// eslint-disable-next-line no-await-in-loop
email = await textInput({
label: `- ${inviteUserPrefix}`,
validateValue: validateEmail,
autoComplete: value => emailAutoComplete(value, currentTeam.slug)
})
} catch (err) {
if (err.message !== 'USER_ABORT') {
throw err
}
}
let elapsed
let stopSpinner
if (email) {
elapsed = stamp()
stopSpinner = wait(inviteUserPrefix + email)
try {
// eslint-disable-next-line no-await-in-loop
await teams.inviteUser({ teamId: currentTeam.id, email })
stopSpinner()
email = `${email} ${elapsed()}`
emails.push(email)
console.log(`${chalk.cyan(tick)} ${inviteUserPrefix}${email}`)
if (hasError) {
hasError = false
eraseLines(emails.length + 2)
info(
introMsg ||
`Inviting team members to ${chalk.bold(currentTeam.name)}`
)
for (const email of emails) {
console.log(`${chalk.cyan(tick)} ${inviteUserPrefix}${email}`)
}
}
} catch (err) {
stopSpinner()
eraseLines(emails.length + 2)
error(err.message)
hasError = true
for (const email of emails) {
console.log(`${chalk.cyan(tick)} ${inviteUserPrefix}${email}`)
}
}
}
} while (email !== '')
eraseLines(emails.length + 2)
const n = emails.length
if (emails.length === 0) {
info(noopMsg)
} else {
success(`Invited ${n} team mate${n > 1 ? 's' : ''}`)
for (const email of emails) {
console.log(`${chalk.cyan(tick)} ${inviteUserPrefix}${email}`)
}
}
}