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 @@ -151,20 +151,45 @@ ): $ReadOnlyArray { const loggedInUserInfo = useLoggedInUserInfo(); const userInfos = useSelector(state => state.userStore.userInfos); + const allThreadInfos = useSelector(state => state.threadStore.threadInfos); + const allThreadInfosArray = React.useMemo( + () => values(allThreadInfos), + [allThreadInfos], + ); + + const communityRootMembersToRole = + useCommunityRootMembersToRole(allThreadInfosArray); return React.useMemo(() => { return threadInfos.filter((threadInfo: ThreadInfo) => { - const permissions = threadFrozenDueToBlock( + const membersToRole = communityRootMembersToRole[threadInfo.id]; + const memberHasAdminRole = threadMembersWithoutAddedAdmin( threadInfo, - loggedInUserInfo?.id, + ).some(member => roleIsAdminRole(membersToRole?.[member.id])); + + if (memberHasAdminRole || !loggedInUserInfo) { + return hasPermission(threadInfo.currentUser.permissions, permission); + } + + const threadFrozen = threadFrozenDueToBlock( + threadInfo, + loggedInUserInfo.id, userInfos, - ) + ); + + const permissions = threadFrozen ? filterOutDisabledPermissions(threadInfo.currentUser.permissions) : threadInfo.currentUser.permissions; return hasPermission(permissions, permission); }); - }, [loggedInUserInfo?.id, permission, threadInfos, userInfos]); + }, [ + threadInfos, + communityRootMembersToRole, + loggedInUserInfo, + userInfos, + permission, + ]); } function useThreadHasPermission(