diff --git a/lib/permissions/thread-permissions.js b/lib/permissions/thread-permissions.js --- a/lib/permissions/thread-permissions.js +++ b/lib/permissions/thread-permissions.js @@ -13,6 +13,8 @@ threadPermissionPropagationPrefixes, threadPermissions, userSurfacedPermissions, + threadPermissionsRequiringVoicedInAnnouncementChannels, + threadPermissionsRemovedForGenesisMembers, } from '../types/thread-permission-types.js'; import type { ThreadPermission, @@ -31,6 +33,7 @@ threadTypeIsThick, assertThickThreadType, assertThinThreadType, + threadTypeIsCommunityRoot, } from '../types/thread-types-enum.js'; function permissionLookup( @@ -130,16 +133,21 @@ (permissions: ThreadPermissionsBlob), threadPermissions.VOICED_IN_ANNOUNCEMENT_CHANNELS, ); - if ( threadIsAnnouncementThread && - hasVoicedInAnnouncementChannelsPermission && - isMember + !hasVoicedInAnnouncementChannelsPermission ) { - permissions[threadPermissions.VOICED] = { - value: true, - source: threadID, - }; + for (const permission of threadPermissionsRequiringVoicedInAnnouncementChannels) { + delete permissions[permission]; + } + } + if ( + threadType === threadTypes.GENESIS && + !hasVoicedInAnnouncementChannelsPermission + ) { + for (const permission of threadPermissionsRemovedForGenesisMembers) { + delete permissions[permission]; + } } if (Object.keys(permissions).length === 0) { @@ -227,12 +235,10 @@ const TOP_LEVEL_DESCENDANT = DESCENDANT + TOP_LEVEL; const OPEN_TOP_LEVEL_DESCENDANT = DESCENDANT + OPEN_TOP_LEVEL; -const baseMemberUserSurfacedPermissions = [ +const defaultUserSurfacedPermissions = [ userSurfacedPermissions.REACT_TO_MESSAGES, userSurfacedPermissions.EDIT_MESSAGES, userSurfacedPermissions.ADD_MEMBERS, -]; -const baseVoicedUserSurfacedPermissions = [ userSurfacedPermissions.EDIT_CALENDAR, userSurfacedPermissions.CREATE_AND_EDIT_CHANNELS, ]; @@ -240,20 +246,8 @@ function getRolePermissionBlobsForCommunityRoot( threadType: ThinThreadType, ): RolePermissionBlobs { - let memberUserSurfacedPermissions; - if (threadType === threadTypes.GENESIS) { - memberUserSurfacedPermissions = []; - } else if (threadType === threadTypes.COMMUNITY_ANNOUNCEMENT_ROOT) { - memberUserSurfacedPermissions = baseMemberUserSurfacedPermissions; - } else { - memberUserSurfacedPermissions = [ - ...baseMemberUserSurfacedPermissions, - ...baseVoicedUserSurfacedPermissions, - ]; - } - const memberPermissions = getThreadPermissionBlobFromUserSurfacedPermissions( - memberUserSurfacedPermissions, + defaultUserSurfacedPermissions, threadType, ); @@ -409,39 +403,23 @@ const openTopLevelDescendantJoinThread = OPEN_TOP_LEVEL_DESCENDANT + threadPermissions.JOIN_THREAD; - const subthreadBasePermissions = { - [threadPermissions.KNOW_OF]: true, - [threadPermissions.VISIBLE]: true, - [threadPermissions.CREATE_SIDEBARS]: true, - [threadPermissions.LEAVE_THREAD]: true, - [openDescendantKnowOf]: true, - [openDescendantVisible]: true, - [openTopLevelDescendantJoinThread]: true, - [openChildJoinThread]: true, - }; - - if ( - thinThreadType === threadTypes.COMMUNITY_OPEN_SUBTHREAD || - thinThreadType === threadTypes.COMMUNITY_SECRET_SUBTHREAD - ) { + if (!threadTypeIsCommunityRoot(thinThreadType)) { const memberPermissions = { - ...subthreadBasePermissions, [threadPermissions.VOICED]: true, + [threadPermissions.KNOW_OF]: true, + [threadPermissions.VISIBLE]: true, + [threadPermissions.CREATE_SIDEBARS]: true, + [threadPermissions.LEAVE_THREAD]: true, + [openDescendantKnowOf]: true, + [openDescendantVisible]: true, + [openTopLevelDescendantJoinThread]: true, + [openChildJoinThread]: true, }; return { Members: memberPermissions, }; } - if ( - thinThreadType === threadTypes.COMMUNITY_OPEN_ANNOUNCEMENT_SUBTHREAD || - thinThreadType === threadTypes.COMMUNITY_SECRET_ANNOUNCEMENT_SUBTHREAD - ) { - return { - Members: subthreadBasePermissions, - }; - } - return getRolePermissionBlobsForCommunityRoot(thinThreadType); } diff --git a/lib/types/thread-permission-types.js b/lib/types/thread-permission-types.js --- a/lib/types/thread-permission-types.js +++ b/lib/types/thread-permission-types.js @@ -141,6 +141,28 @@ return ourPrefix; } +export const threadPermissionsRequiringVoicedInAnnouncementChannels: $ReadOnlyArray = + [ + threadPermissions.VOICED, + threadPermissions.EDIT_ENTRIES, + threadPermissions.EDIT_THREAD_NAME, + threadPermissions.EDIT_THREAD_DESCRIPTION, + threadPermissions.EDIT_THREAD_COLOR, + threadPermissions.EDIT_THREAD_AVATAR, + threadPermissions.CREATE_SUBCHANNELS, + threadPermissions.EDIT_PERMISSIONS, + threadPermissions.DELETE_THREAD, + threadPermissions.CHANGE_ROLE, + threadPermissions.MANAGE_PINS, + ]; + +export const threadPermissionsRemovedForGenesisMembers: $ReadOnlyArray = + [ + threadPermissions.REACT_TO_MESSAGE, + threadPermissions.EDIT_MESSAGE, + threadPermissions.ADD_MEMBERS, + ]; + // These are the set of user-facing permissions that we display as configurable // to the user when they are creating a custom role for their given community. // They are per-community rather than per-thread, so when configured they are @@ -218,6 +240,7 @@ const descendantTopLevelVoicedInAnnouncementChannels = threadPermissionPropagationPrefixes.DESCENDANT + threadPermissionFilterPrefixes.TOP_LEVEL + + threadPermissionMembershipPrefixes.MEMBER + threadPermissions.VOICED_IN_ANNOUNCEMENT_CHANNELS; const voicedPermissions = new Set([ voicedInAnnouncementChannels, diff --git a/lib/types/thread-types-enum.js b/lib/types/thread-types-enum.js --- a/lib/types/thread-types-enum.js +++ b/lib/types/thread-types-enum.js @@ -141,6 +141,7 @@ ]); export const announcementThreadTypes: $ReadOnlyArray = Object.freeze([ + threadTypes.GENESIS, threadTypes.COMMUNITY_ANNOUNCEMENT_ROOT, threadTypes.COMMUNITY_OPEN_ANNOUNCEMENT_SUBTHREAD, threadTypes.COMMUNITY_SECRET_ANNOUNCEMENT_SUBTHREAD,