import type { SuperagentInviteCollaboratorsResult } from '../../types'; export const NOT_WORKSPACE_MEMBER_CODE = 'not_workspace_member'; export function parseEmails(value: string) { return [...new Set(value.split(/[,\s]+/).map((email) => email.trim().toLowerCase()).filter(Boolean))]; } export function isValidEmail(email: string) { return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email); } export function applyInviteResult( result: SuperagentInviteCollaboratorsResult | void, invitedCount: number, setError: (error: string | null) => void, setSuccess: (success: string | null) => void, ignoredErrorCodes: string[] = [], ) { const results = result?.results ?? []; const ignoredErrorCodeSet = new Set(ignoredErrorCodes); const shouldIgnoreFailure = (item: { error?: string; error_code?: string; success: boolean }) => { if (item.success) { return false; } if (ignoredErrorCodeSet.has(item.error_code ?? '')) { return true; } return ignoredErrorCodeSet.has(NOT_WORKSPACE_MEMBER_CODE) && isNotWorkspaceMemberFailure(item); }; const notWorkspaceMembers = results.filter(isNotWorkspaceMemberFailure); const failed = results.filter((item) => !item.success && !shouldIgnoreFailure(item)); const successful = results.filter((item) => item.success); if (failed.length > 0) { setError(failed.map((item) => `${item.email}: ${item.error || 'Invite failed'}`).join('\n')); } if (successful.length > 0 || results.length === 0) { const count = successful.length || invitedCount; setSuccess(count === 1 ? 'Invitation sent.' : `${count} invitations sent.`); } return { failed, notWorkspaceMembers, successful }; } export function formatEmailList(emails: string[]) { if (emails.length <= 2) { return emails.join(' and '); } return `${emails.slice(0, 2).join(', ')} and ${emails.length - 2} more`; } export function isNotWorkspaceMemberFailure(item: { error?: string; error_code?: string; success: boolean }) { return !item.success && (item.error_code === NOT_WORKSPACE_MEMBER_CODE || isNotWorkspaceMemberMessage(item.error)); } export function isNotWorkspaceMemberMessage(message?: string) { return /not (?:a )?member of this workspace|not in this workspace/i.test(message ?? ''); }