diff --git a/lib/shared/thread-utils.js b/lib/shared/thread-utils.js --- a/lib/shared/thread-utils.js +++ b/lib/shared/thread-utils.js @@ -53,7 +53,11 @@ type RobotextMessageInfo, type ComposableMessageInfo, } from '../types/message-types.js'; -import type { MinimallyEncodedRawThreadInfo } from '../types/minimally-encoded-thread-permissions-types.js'; +import type { + MinimallyEncodedMemberInfo, + MinimallyEncodedRawThreadInfo, + MinimallyEncodedRoleInfo, +} from '../types/minimally-encoded-thread-permissions-types.js'; import { userRelationshipStatus } from '../types/relationship-types.js'; import { threadPermissionPropagationPrefixes, @@ -129,7 +133,9 @@ return threadInfo.currentUser.permissions[permission].value; } -function viewerIsMember(threadInfo: ?(ThreadInfo | RawThreadInfo)): boolean { +function viewerIsMember( + threadInfo: ?(ThreadInfo | RawThreadInfo | MinimallyEncodedRawThreadInfo), +): boolean { return !!( threadInfo && threadInfo.currentUser.role !== null && @@ -137,38 +143,48 @@ ); } -function threadIsInHome(threadInfo: ?(ThreadInfo | RawThreadInfo)): boolean { +function threadIsInHome( + threadInfo: ?(ThreadInfo | RawThreadInfo | MinimallyEncodedRawThreadInfo), +): boolean { return !!(threadInfo && threadInfo.currentUser.subscription.home); } // Can have messages -function threadInChatList(threadInfo: ?(ThreadInfo | RawThreadInfo)): boolean { +function threadInChatList( + threadInfo: ?(ThreadInfo | RawThreadInfo | MinimallyEncodedRawThreadInfo), +): boolean { return ( viewerIsMember(threadInfo) && threadHasPermission(threadInfo, threadPermissions.VISIBLE) ); } -function threadIsTopLevel(threadInfo: ?(ThreadInfo | RawThreadInfo)): boolean { +function threadIsTopLevel( + threadInfo: ?(ThreadInfo | RawThreadInfo | MinimallyEncodedRawThreadInfo), +): boolean { return threadInChatList(threadInfo) && threadIsChannel(threadInfo); } -function threadIsChannel(threadInfo: ?(ThreadInfo | RawThreadInfo)): boolean { +function threadIsChannel( + threadInfo: ?(ThreadInfo | RawThreadInfo | MinimallyEncodedRawThreadInfo), +): boolean { return !!(threadInfo && threadInfo.type !== threadTypes.SIDEBAR); } -function threadIsSidebar(threadInfo: ?(ThreadInfo | RawThreadInfo)): boolean { +function threadIsSidebar( + threadInfo: ?(ThreadInfo | RawThreadInfo | MinimallyEncodedRawThreadInfo), +): boolean { return threadInfo?.type === threadTypes.SIDEBAR; } function threadInBackgroundChatList( - threadInfo: ?(ThreadInfo | RawThreadInfo), + threadInfo: ?(ThreadInfo | RawThreadInfo | MinimallyEncodedRawThreadInfo), ): boolean { return threadInChatList(threadInfo) && !threadIsInHome(threadInfo); } function threadInHomeChatList( - threadInfo: ?(ThreadInfo | RawThreadInfo), + threadInfo: ?(ThreadInfo | RawThreadInfo | MinimallyEncodedRawThreadInfo), ): boolean { return threadInChatList(threadInfo) && threadIsInHome(threadInfo); } @@ -176,7 +192,7 @@ // Can have Calendar entries, // does appear as a top-level entity in the thread list function threadInFilterList( - threadInfo: ?(ThreadInfo | RawThreadInfo), + threadInfo: ?(ThreadInfo | RawThreadInfo | MinimallyEncodedRawThreadInfo), ): boolean { return ( threadInChatList(threadInfo) && @@ -186,7 +202,7 @@ } function userIsMember( - threadInfo: ?(ThreadInfo | RawThreadInfo), + threadInfo: ?(ThreadInfo | RawThreadInfo | MinimallyEncodedRawThreadInfo), userID: string, ): boolean { if (!threadInfo) { @@ -199,25 +215,26 @@ } function threadActualMembers( - memberInfos: $ReadOnlyArray, + memberInfos: $ReadOnlyArray< + MemberInfo | RelativeMemberInfo | MinimallyEncodedMemberInfo, + >, ): $ReadOnlyArray { return memberInfos .filter(memberInfo => memberInfo.role) .map(memberInfo => memberInfo.id); } -function threadOtherMembers( - memberInfos: $ReadOnlyArray, - viewerID: ?string, -): $ReadOnlyArray { +function threadOtherMembers< + T: MemberInfo | RelativeMemberInfo | MinimallyEncodedMemberInfo, +>(memberInfos: $ReadOnlyArray, viewerID: ?string): $ReadOnlyArray { return memberInfos.filter( memberInfo => memberInfo.role && memberInfo.id !== viewerID, ); } -function threadMembersWithoutAddedAshoat( - threadInfo: T, -): $PropertyType { +function threadMembersWithoutAddedAshoat< + T: ThreadInfo | RawThreadInfo | MinimallyEncodedRawThreadInfo, +>(threadInfo: T): $PropertyType { if (threadInfo.community !== genesis.id) { return threadInfo.members; } @@ -231,7 +248,7 @@ } function threadOrParentThreadIsGroupChat( - threadInfo: RawThreadInfo | ThreadInfo, + threadInfo: RawThreadInfo | ThreadInfo | MinimallyEncodedRawThreadInfo, ) { return threadMembersWithoutAddedAshoat(threadInfo).length > 2; } @@ -245,7 +262,7 @@ } function getSingleOtherUser( - threadInfo: ThreadInfo | RawThreadInfo, + threadInfo: ThreadInfo | RawThreadInfo | MinimallyEncodedRawThreadInfo, viewerID: ?string, ): ?string { if (!viewerID) { @@ -981,8 +998,8 @@ }; function memberIsAdmin( - memberInfo: RelativeMemberInfo | MemberInfo, - threadInfo: ThreadInfo | RawThreadInfo, + memberInfo: RelativeMemberInfo | MemberInfo | MinimallyEncodedMemberInfo, + threadInfo: ThreadInfo | RawThreadInfo | MinimallyEncodedRawThreadInfo, ): boolean { return !!( memberInfo.role && roleIsAdminRole(threadInfo.roles[memberInfo.role]) @@ -997,12 +1014,19 @@ return !!memberInfo.permissions[threadPermissions.CHANGE_ROLE]?.value; } -function roleIsAdminRole(roleInfo: ?RoleInfo): boolean { +function roleIsAdminRole( + roleInfo: ?RoleInfo | ?MinimallyEncodedRoleInfo, +): boolean { return !!(roleInfo && !roleInfo.isDefault && roleInfo.name === 'Admins'); } function threadHasAdminRole( - threadInfo: ?(RawThreadInfo | ThreadInfo | ServerThreadInfo), + threadInfo: ?( + | RawThreadInfo + | ThreadInfo + | ServerThreadInfo + | MinimallyEncodedRawThreadInfo + ), ): boolean { if (!threadInfo) { return false; @@ -1318,7 +1342,11 @@ } function getContainingThreadID( - parentThreadInfo: ?ServerThreadInfo | RawThreadInfo | ThreadInfo, + parentThreadInfo: + | ?ServerThreadInfo + | RawThreadInfo + | ThreadInfo + | MinimallyEncodedRawThreadInfo, threadType: ThreadType, ): ?string { if (!parentThreadInfo) { @@ -1334,7 +1362,11 @@ } function getCommunity( - parentThreadInfo: ?ServerThreadInfo | RawThreadInfo | ThreadInfo, + parentThreadInfo: + | ?ServerThreadInfo + | RawThreadInfo + | ThreadInfo + | MinimallyEncodedRawThreadInfo, ): ?string { if (!parentThreadInfo) { return null; @@ -1549,7 +1581,7 @@ } function threadInfoInsideCommunity( - threadInfo: RawThreadInfo | ThreadInfo, + threadInfo: RawThreadInfo | ThreadInfo | MinimallyEncodedRawThreadInfo, communityID: string, ): boolean { return threadInfo.community === communityID || threadInfo.id === communityID; @@ -1625,14 +1657,16 @@ }, [threadInfo]); } -function communityOrThreadNoun(threadInfo: RawThreadInfo | ThreadInfo): string { +function communityOrThreadNoun( + threadInfo: RawThreadInfo | ThreadInfo | MinimallyEncodedRawThreadInfo, +): string { return threadTypeIsCommunityRoot(threadInfo.type) ? 'community' : threadNoun(threadInfo.type, threadInfo.parentThreadID); } function getThreadsToDeleteText( - threadInfo: RawThreadInfo | ThreadInfo, + threadInfo: RawThreadInfo | ThreadInfo | MinimallyEncodedRawThreadInfo, ): string { return `${ threadTypeIsCommunityRoot(threadInfo.type)