diff --git a/lib/permissions/minimally-encoded-thread-permissions-test-data.js b/lib/permissions/minimally-encoded-thread-permissions-test-data.js --- a/lib/permissions/minimally-encoded-thread-permissions-test-data.js +++ b/lib/permissions/minimally-encoded-thread-permissions-test-data.js @@ -101,6 +101,14 @@ value: false, source: null, }, + delete_own_messages: { + value: false, + source: null, + }, + delete_all_messages: { + value: false, + source: null, + }, }, isSender: false, }, @@ -192,6 +200,14 @@ value: false, source: null, }, + delete_own_messages: { + value: false, + source: null, + }, + delete_all_messages: { + value: false, + source: null, + }, }, isSender: true, }, @@ -305,6 +321,14 @@ value: false, source: null, }, + delete_own_messages: { + value: false, + source: null, + }, + delete_all_messages: { + value: false, + source: null, + }, }, subscription: { home: true, @@ -484,6 +508,14 @@ value: false, source: null, }, + delete_own_messages: { + value: false, + source: null, + }, + delete_all_messages: { + value: false, + source: null, + }, }, isSender: false, }, @@ -583,6 +615,14 @@ value: false, source: null, }, + delete_own_messages: { + value: false, + source: null, + }, + delete_all_messages: { + value: false, + source: null, + }, }, isSender: true, }, @@ -704,6 +744,14 @@ value: false, source: null, }, + delete_own_messages: { + value: false, + source: null, + }, + delete_all_messages: { + value: false, + source: null, + }, }, subscription: { home: true, diff --git a/lib/permissions/minimally-encoded-thread-permissions.js b/lib/permissions/minimally-encoded-thread-permissions.js --- a/lib/permissions/minimally-encoded-thread-permissions.js +++ b/lib/permissions/minimally-encoded-thread-permissions.js @@ -51,6 +51,8 @@ manage_invite_links: BigInt(20), voiced_in_announcement_channels: BigInt(21), manage_farcaster_channel_tags: BigInt(22), + delete_own_messages: BigInt(23), + delete_all_messages: BigInt(24), }); // `minimallyEncodedThreadPermissions` is used to map each permission diff --git a/lib/permissions/minimally-encoded-thread-permissions.test.js b/lib/permissions/minimally-encoded-thread-permissions.test.js --- a/lib/permissions/minimally-encoded-thread-permissions.test.js +++ b/lib/permissions/minimally-encoded-thread-permissions.test.js @@ -54,6 +54,8 @@ manage_invite_links: { value: false, source: null }, voiced_in_announcement_channels: { value: false, source: null }, manage_farcaster_channel_tags: { value: false, source: null }, + delete_own_messages: { value: false, source: null }, + delete_all_messages: { value: false, source: null }, }; describe('minimallyEncodedThreadPermissions', () => { @@ -131,6 +133,8 @@ manage_invite_links: { value: false, source: null }, voiced_in_announcement_channels: { value: false, source: null }, manage_farcaster_channel_tags: { value: false, source: null }, + delete_own_messages: { value: false, source: null }, + delete_all_messages: { value: false, source: null }, }; it('should decode ThreadPermissionsInfo from bitmask', () => { @@ -173,6 +177,8 @@ manage_invite_links: { value: false, source: null }, voiced_in_announcement_channels: { value: false, source: null }, manage_farcaster_channel_tags: { value: false, source: null }, + delete_own_messages: { value: false, source: null }, + delete_all_messages: { value: false, source: null }, }); }); }); @@ -637,6 +643,14 @@ value: false, source: null, }, + delete_own_messages: { + value: false, + source: null, + }, + delete_all_messages: { + value: false, + source: null, + }, }, subscription: { home: true, 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 @@ -241,6 +241,7 @@ userSurfacedPermissions.ADD_MEMBERS, userSurfacedPermissions.EDIT_CALENDAR, userSurfacedPermissions.CREATE_AND_EDIT_CHANNELS, + userSurfacedPermissions.DELETE_OWN_MESSAGES, ]; function getRolePermissionBlobsForCommunityRoot( @@ -282,6 +283,10 @@ const descendantReactToMessage = DESCENDANT + threadPermissions.REACT_TO_MESSAGE; const descendantEditMessage = DESCENDANT + threadPermissions.EDIT_MESSAGE; + const descendantDeleteOwnMessages = + DESCENDANT + threadPermissions.DELETE_OWN_MESSAGES; + const descendantDeleteAllMessages = + DESCENDANT + threadPermissions.DELETE_ALL_MESSAGES; const baseAdminPermissions = { [threadPermissions.KNOW_OF]: true, @@ -303,6 +308,8 @@ [threadPermissions.MANAGE_INVITE_LINKS]: true, [threadPermissions.VOICED_IN_ANNOUNCEMENT_CHANNELS]: true, [threadPermissions.MANAGE_FARCASTER_CHANNEL_TAGS]: true, + [threadPermissions.DELETE_OWN_MESSAGES]: true, + [threadPermissions.DELETE_ALL_MESSAGES]: true, [descendantKnowOf]: true, [descendantVisible]: true, [topLevelDescendantJoinThread]: true, @@ -324,6 +331,8 @@ [topLevelDescendantVoicedInAnnouncementChannels]: true, [descendantReactToMessage]: true, [descendantEditMessage]: true, + [descendantDeleteOwnMessages]: true, + [descendantDeleteAllMessages]: true, }; let adminPermissions; @@ -480,6 +489,7 @@ [threadPermissions.EDIT_THREAD_COLOR]: true, [threadPermissions.EDIT_THREAD_DESCRIPTION]: true, [threadPermissions.EDIT_THREAD_AVATAR]: true, + [threadPermissions.DELETE_OWN_MESSAGES]: true, }; if (threadType === threadTypes.THICK_SIDEBAR) { return { 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 @@ -33,6 +33,8 @@ MANAGE_INVITE_LINKS: 'manage_invite_links', VOICED_IN_ANNOUNCEMENT_CHANNELS: 'voiced_in_announcement_channels', MANAGE_FARCASTER_CHANNEL_TAGS: 'manage_farcaster_channel_tags', + DELETE_OWN_MESSAGES: 'delete_own_messages', + DELETE_ALL_MESSAGES: 'delete_all_messages', }); export type ThreadPermissionNotAffectedByBlock = $Values< @@ -75,7 +77,9 @@ ourThreadPermission === 'manage_pins' || ourThreadPermission === 'manage_invite_links' || ourThreadPermission === 'voiced_in_announcement_channels' || - ourThreadPermission === 'manage_farcaster_channel_tags', + ourThreadPermission === 'manage_farcaster_channel_tags' || + ourThreadPermission === 'delete_all_messages' || + ourThreadPermission === 'delete_own_messages', 'string is not threadPermissions enum', ); return ourThreadPermission; @@ -154,6 +158,7 @@ threadPermissions.DELETE_THREAD, threadPermissions.CHANGE_ROLE, threadPermissions.MANAGE_PINS, + threadPermissions.DELETE_ALL_MESSAGES, ]; export const threadPermissionsRemovedForGenesisMembers: $ReadOnlyArray<ThreadPermission> = @@ -161,6 +166,7 @@ threadPermissions.REACT_TO_MESSAGE, threadPermissions.EDIT_MESSAGE, threadPermissions.ADD_MEMBERS, + threadPermissions.DELETE_OWN_MESSAGES, ]; // These are the set of user-facing permissions that we display as configurable @@ -187,6 +193,8 @@ EDIT_MESSAGES: 'edit_messages', MANAGE_INVITE_LINKS: 'manage_invite_links', MANAGE_FARCASTER_CHANNEL_TAGS: 'manage_farcaster_channel_tags', + DELETE_OWN_MESSAGES: 'delete_own_messages', + DELETE_ALL_MESSAGES: 'delete_all_messages', }); export type UserSurfacedPermission = $Values<typeof userSurfacedPermissions>; export const userSurfacedPermissionsSet: $ReadOnlySet<UserSurfacedPermission> = @@ -422,6 +430,36 @@ manageFarcasterChannelTags, ]); +const deleteOwnMessagesPermission = { + title: 'Delete own messages', + description: 'Allows members to delete their sent messages', + userSurfacedPermission: userSurfacedPermissions.DELETE_OWN_MESSAGES, +}; +const deleteOwnMessages = threadPermissions.DELETE_OWN_MESSAGES; +const descendantDeleteOwnMessages = + threadPermissionPropagationPrefixes.DESCENDANT + + threadPermissionMembershipPrefixes.MEMBER + + threadPermissions.DELETE_OWN_MESSAGES; +const deleteOwnMessagesPermissions = new Set([ + deleteOwnMessages, + descendantDeleteOwnMessages, +]); + +const deleteALlMessagesPermission = { + title: 'Delete all messages', + description: 'Allows members to delete any sent message', + userSurfacedPermission: userSurfacedPermissions.DELETE_ALL_MESSAGES, +}; +const deleteAllMessages = threadPermissions.DELETE_ALL_MESSAGES; +const descendantDeleteAllMessages = + threadPermissionPropagationPrefixes.DESCENDANT + + threadPermissionMembershipPrefixes.MEMBER + + threadPermissions.DELETE_ALL_MESSAGES; +const deleteAllMessagesPermissions = new Set([ + deleteAllMessages, + descendantDeleteAllMessages, +]); + export type UserSurfacedPermissionOption = { +title: string, +description: string, @@ -443,6 +481,8 @@ editMessagePermission, manageInviteLinksPermission, manageFarcasterChannelTagsPermission, + deleteOwnMessagesPermission, + deleteALlMessagesPermission, ]); type ConfigurableCommunityPermission = { @@ -468,6 +508,8 @@ [userSurfacedPermissions.MANAGE_INVITE_LINKS]: manageInviteLinksPermissions, [userSurfacedPermissions.MANAGE_FARCASTER_CHANNEL_TAGS]: manageFarcasterChannelTagsPermissions, + [userSurfacedPermissions.DELETE_OWN_MESSAGES]: deleteOwnMessagesPermissions, + [userSurfacedPermissions.DELETE_ALL_MESSAGES]: deleteAllMessagesPermissions, }); export type ThreadPermissionInfo =