Page MenuHomePhabricator

D13068.id43397.diff
No OneTemporary

D13068.id43397.diff

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<ThreadPermission> =
+ [
+ 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<ThreadPermission> =
+ [
+ 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<number> = Object.freeze([
+ threadTypes.GENESIS,
threadTypes.COMMUNITY_ANNOUNCEMENT_ROOT,
threadTypes.COMMUNITY_OPEN_ANNOUNCEMENT_SUBTHREAD,
threadTypes.COMMUNITY_SECRET_ANNOUNCEMENT_SUBTHREAD,

File Metadata

Mime Type
text/plain
Expires
Mon, Sep 30, 1:16 PM (21 h, 57 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2204879
Default Alt Text
D13068.id43397.diff (6 KB)

Event Timeline