diff --git a/lib/permissions/farcaster-permissions.js b/lib/permissions/farcaster-permissions.js --- a/lib/permissions/farcaster-permissions.js +++ b/lib/permissions/farcaster-permissions.js @@ -3,18 +3,35 @@ import type { RolePermissionBlobs } from './thread-permissions.js'; import type { FarcasterConversation } from '../shared/farcaster/farcaster-conversation-types.js'; import { threadPermissions } from '../types/thread-permission-types.js'; +import type { FarcasterThreadType } from '../types/thread-types-enum.js'; +import { farcasterThreadTypes } from '../types/thread-types-enum.js'; -function getFarcasterRolePermissionsBlobs( +function getFarcasterRolePermissionsBlobsFromConversation( conversation: FarcasterConversation, ): RolePermissionBlobs { - if (conversation.isGroup) { + const threadType = conversation.isGroup + ? farcasterThreadTypes.FARCASTER_GROUP + : farcasterThreadTypes.FARCASTER_PERSONAL; + return getFarcasterRolePermissionsBlobs( + threadType, + conversation.groupPreferences?.onlyAdminsCanWrite, + conversation.groupPreferences?.membersCanInvite, + ); +} + +function getFarcasterRolePermissionsBlobs( + threadType: FarcasterThreadType, + onlyAdminsCanWrite: boolean = false, + membersCanInvite: boolean = true, +): RolePermissionBlobs { + if (threadType === farcasterThreadTypes.FARCASTER_GROUP) { // These permissions are based on the experimentation: // Only admins can create invite links // Admins can decide who can add users (admins or all the members) // Admins can change a role of a user // Only admins can edit a thread let membersPermissions; - if (conversation.groupPreferences?.onlyAdminsCanWrite) { + if (onlyAdminsCanWrite) { membersPermissions = { [threadPermissions.KNOW_OF]: true, [threadPermissions.VISIBLE]: true, @@ -29,8 +46,7 @@ [threadPermissions.REACT_TO_MESSAGE]: true, [threadPermissions.EDIT_MESSAGE]: true, [threadPermissions.DELETE_OWN_MESSAGES]: true, - [threadPermissions.ADD_MEMBERS]: - !!conversation.groupPreferences?.membersCanInvite, + [threadPermissions.ADD_MEMBERS]: membersCanInvite, [threadPermissions.LEAVE_THREAD]: true, }; } @@ -74,4 +90,7 @@ } } -export { getFarcasterRolePermissionsBlobs }; +export { + getFarcasterRolePermissionsBlobsFromConversation, + getFarcasterRolePermissionsBlobs, +}; diff --git a/lib/shared/threads/protocols/farcaster-thread-protocol.js b/lib/shared/threads/protocols/farcaster-thread-protocol.js --- a/lib/shared/threads/protocols/farcaster-thread-protocol.js +++ b/lib/shared/threads/protocols/farcaster-thread-protocol.js @@ -1,5 +1,6 @@ // @flow +import { getFarcasterRolePermissionsBlobs } from '../../../permissions/farcaster-permissions.js'; import type { RolePermissionBlobs } from '../../../permissions/thread-permissions.js'; import type { SetThreadUnreadStatusPayload } from '../../../types/activity-types.js'; import type { @@ -17,6 +18,7 @@ } from '../../../types/minimally-encoded-thread-permissions-types.js'; import type { SubscriptionUpdateResult } from '../../../types/subscription-types.js'; import type { ThreadType } from '../../../types/thread-types-enum.js'; +import { assertFarcasterThreadType } from '../../../types/thread-types-enum.js'; import type { ChangeThreadSettingsPayload, ThreadJoinPayload, @@ -115,8 +117,9 @@ ); }, - getRolePermissionBlobs: (): RolePermissionBlobs => { - throw new Error('getRolePermissionBlobs method is not yet implemented'); + getRolePermissionBlobs: (threadType: ThreadType): RolePermissionBlobs => { + const farcasterThreadType = assertFarcasterThreadType(threadType); + return getFarcasterRolePermissionsBlobs(farcasterThreadType); }, deleteMessage: async (): Promise => { diff --git a/lib/utils/farcaster-utils.js b/lib/utils/farcaster-utils.js --- a/lib/utils/farcaster-utils.js +++ b/lib/utils/farcaster-utils.js @@ -10,7 +10,7 @@ import { farcasterIDPrefix } from './validation-utils.js'; import { setSyncedMetadataEntryActionType } from '../actions/synced-metadata-actions.js'; import { useUserIdentityCache } from '../components/user-identity-cache.react.js'; -import { getFarcasterRolePermissionsBlobs } from '../permissions/farcaster-permissions.js'; +import { getFarcasterRolePermissionsBlobsFromConversation } from '../permissions/farcaster-permissions.js'; import { specialRoles } from '../permissions/special-roles.js'; import { getAllThreadPermissions, @@ -288,7 +288,8 @@ const threadType = conversation.isGroup ? farcasterThreadTypes.FARCASTER_GROUP : farcasterThreadTypes.FARCASTER_PERSONAL; - const permissionBlobs = getFarcasterRolePermissionsBlobs(conversation); + const permissionBlobs = + getFarcasterRolePermissionsBlobsFromConversation(conversation); const membersRole: RoleInfo = { ...minimallyEncodeRoleInfo({