Changeset View
Changeset View
Standalone View
Standalone View
lib/shared/thread-utils.js
Show First 20 Lines • Show All 203 Lines • ▼ Show 20 Lines | |||||
function threadActualMembers( | function threadActualMembers( | ||||
memberInfos: $ReadOnlyArray<MemberInfo | RelativeMemberInfo>, | memberInfos: $ReadOnlyArray<MemberInfo | RelativeMemberInfo>, | ||||
): $ReadOnlyArray<string> { | ): $ReadOnlyArray<string> { | ||||
return memberInfos | return memberInfos | ||||
.filter(memberInfo => memberInfo.role) | .filter(memberInfo => memberInfo.role) | ||||
.map(memberInfo => memberInfo.id); | .map(memberInfo => memberInfo.id); | ||||
} | } | ||||
function threadOtherMembers<T: MemberInfo | RelativeMemberInfo>( | |||||
memberInfos: $ReadOnlyArray<T>, | |||||
viewerID: ?string, | |||||
): $ReadOnlyArray<T> { | |||||
return memberInfos.filter( | |||||
memberInfo => memberInfo.role && memberInfo.id !== viewerID, | |||||
); | |||||
} | |||||
function threadMembersWithoutAddedAshoat<T: ThreadInfo | RawThreadInfo>( | function threadMembersWithoutAddedAshoat<T: ThreadInfo | RawThreadInfo>( | ||||
threadInfo: T, | threadInfo: T, | ||||
): $PropertyType<T, 'members'> { | ): $PropertyType<T, 'members'> { | ||||
if (threadInfo.community !== genesis.id) { | if (threadInfo.community !== genesis.id) { | ||||
return threadInfo.members; | return threadInfo.members; | ||||
} | } | ||||
return threadInfo.members.filter( | return threadInfo.members.filter( | ||||
member => member.id !== ashoat.id || member.role, | member => member.id !== ashoat.id || member.role, | ||||
Show All 14 Lines | |||||
) { | ) { | ||||
return threadMembersWithoutAddedAshoat(threadInfo).length > 2; | return threadMembersWithoutAddedAshoat(threadInfo).length > 2; | ||||
} | } | ||||
function threadIsPending(threadID: ?string): boolean { | function threadIsPending(threadID: ?string): boolean { | ||||
return !!threadID?.startsWith('pending'); | return !!threadID?.startsWith('pending'); | ||||
} | } | ||||
function getThreadOtherUsers( | |||||
threadInfo: ThreadInfo | RawThreadInfo, | |||||
viewerID: ?string, | |||||
): string[] { | |||||
const otherUserIDs = []; | |||||
for (const member of threadInfo.members) { | |||||
if (!member.role || member.id === viewerID) { | |||||
continue; | |||||
} | |||||
otherUserIDs.push(member.id); | |||||
} | |||||
return otherUserIDs; | |||||
} | |||||
function getSingleOtherUser( | function getSingleOtherUser( | ||||
threadInfo: ThreadInfo | RawThreadInfo, | threadInfo: ThreadInfo | RawThreadInfo, | ||||
viewerID: ?string, | viewerID: ?string, | ||||
): ?string { | ): ?string { | ||||
if (!viewerID) { | if (!viewerID) { | ||||
return undefined; | return undefined; | ||||
} | } | ||||
const otherMemberIDs = getThreadOtherUsers(threadInfo, viewerID); | const otherMembers = threadOtherMembers(threadInfo.members, viewerID); | ||||
if (otherMemberIDs.length !== 1) { | if (otherMembers.length !== 1) { | ||||
return undefined; | return undefined; | ||||
} | } | ||||
return otherMemberIDs[0]; | return otherMembers[0].id; | ||||
} | } | ||||
function getPendingThreadID( | function getPendingThreadID( | ||||
threadType: ThreadType, | threadType: ThreadType, | ||||
memberIDs: $ReadOnlyArray<string>, | memberIDs: $ReadOnlyArray<string>, | ||||
sourceMessageID: ?string, | sourceMessageID: ?string, | ||||
): string { | ): string { | ||||
const pendingThreadKey = sourceMessageID | const pendingThreadKey = sourceMessageID | ||||
▲ Show 20 Lines • Show All 243 Lines • ▼ Show 20 Lines | async function createRealThreadFromPendingThread({ | ||||
sourceMessageID, | sourceMessageID, | ||||
viewerID, | viewerID, | ||||
calendarQuery, | calendarQuery, | ||||
}: CreateRealThreadParameters): Promise<string> { | }: CreateRealThreadParameters): Promise<string> { | ||||
if (!threadIsPending(threadInfo.id)) { | if (!threadIsPending(threadInfo.id)) { | ||||
return threadInfo.id; | return threadInfo.id; | ||||
} | } | ||||
const otherMemberIDs = getThreadOtherUsers(threadInfo, viewerID); | const otherMemberIDs = threadOtherMembers(threadInfo.members, viewerID).map( | ||||
member => member.id, | |||||
); | |||||
let resultPromise; | let resultPromise; | ||||
if (threadInfo.type !== threadTypes.SIDEBAR) { | if (threadInfo.type !== threadTypes.SIDEBAR) { | ||||
invariant( | invariant( | ||||
otherMemberIDs.length > 0, | otherMemberIDs.length > 0, | ||||
'otherMemberIDs should not be empty for threads', | 'otherMemberIDs should not be empty for threads', | ||||
); | ); | ||||
resultPromise = createNewThread({ | resultPromise = createNewThread({ | ||||
type: pendingThreadType(otherMemberIDs.length), | type: pendingThreadType(otherMemberIDs.length), | ||||
▲ Show 20 Lines • Show All 159 Lines • ▼ Show 20 Lines | ): ThreadPermissionsInfo { | ||||
return newPermissions; | return newPermissions; | ||||
} | } | ||||
function robotextName( | function robotextName( | ||||
threadInfo: RawThreadInfo | ThreadInfo, | threadInfo: RawThreadInfo | ThreadInfo, | ||||
viewerID: ?string, | viewerID: ?string, | ||||
userInfos: UserInfos, | userInfos: UserInfos, | ||||
): string { | ): string { | ||||
const threadUsernames = getThreadOtherUsers(threadInfo, viewerID) | const threadUsernames = threadOtherMembers(threadInfo.members, viewerID) | ||||
.map(memberID => userInfos[memberID] && userInfos[memberID].username) | .map(member => userInfos[member.id] && userInfos[member.id].username) | ||||
.filter(Boolean); | .filter(Boolean); | ||||
if (threadUsernames.length === 0) { | if (threadUsernames.length === 0) { | ||||
return 'just you'; | return 'just you'; | ||||
} | } | ||||
return pluralize(threadUsernames); | return pluralize(threadUsernames); | ||||
} | } | ||||
function threadUIName( | function threadUIName( | ||||
▲ Show 20 Lines • Show All 696 Lines • ▼ Show 20 Lines | export { | ||||
threadIsChannel, | threadIsChannel, | ||||
threadIsSidebar, | threadIsSidebar, | ||||
threadInBackgroundChatList, | threadInBackgroundChatList, | ||||
threadInHomeChatList, | threadInHomeChatList, | ||||
threadIsInHome, | threadIsInHome, | ||||
threadInFilterList, | threadInFilterList, | ||||
userIsMember, | userIsMember, | ||||
threadActualMembers, | threadActualMembers, | ||||
threadOtherMembers, | |||||
threadIsGroupChat, | threadIsGroupChat, | ||||
threadIsPending, | threadIsPending, | ||||
getSingleOtherUser, | getSingleOtherUser, | ||||
getPendingThreadID, | getPendingThreadID, | ||||
pendingThreadIDRegex, | pendingThreadIDRegex, | ||||
parsePendingThreadID, | parsePendingThreadID, | ||||
createPendingThread, | createPendingThread, | ||||
createPendingThreadItem, | createPendingThreadItem, | ||||
▲ Show 20 Lines • Show All 42 Lines • Show Last 20 Lines |