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 @@ -815,7 +815,8 @@ const minimallyEncodedRawThreadInfoWithMemberPermissions = minimallyEncodeRawThreadInfoWithMemberPermissions(rawThreadInfo); invariant( - !minimallyEncodedRawThreadInfoWithMemberPermissions.thick, + !minimallyEncodedRawThreadInfoWithMemberPermissions.thick && + !minimallyEncodedRawThreadInfoWithMemberPermissions.farcaster, 'ServerThreadInfo should be thin thread', ); diff --git a/lib/types/minimally-encoded-thread-permissions-types.js b/lib/types/minimally-encoded-thread-permissions-types.js --- a/lib/types/minimally-encoded-thread-permissions-types.js +++ b/lib/types/minimally-encoded-thread-permissions-types.js @@ -14,6 +14,7 @@ LegacyThinRawThreadInfo, LegacyThreadCurrentUserInfo, ThickMemberInfo, + LegacyFarcasterRawThreadInfo, } from './thread-types.js'; import { decodeThreadRolePermissionsBitmaskArray, @@ -177,7 +178,18 @@ +currentUser: ThreadCurrentUserInfo, }>; -export type RawThreadInfo = ThinRawThreadInfo | ThickRawThreadInfo; +export type FarcasterRawThreadInfo = $ReadOnly<{ + ...LegacyFarcasterRawThreadInfo, + +minimallyEncoded: true, + +members: $ReadOnlyArray, + +roles: { +[id: string]: RoleInfo }, + +currentUser: ThreadCurrentUserInfo, +}>; + +export type RawThreadInfo = + | ThinRawThreadInfo + | ThickRawThreadInfo + | FarcasterRawThreadInfo; const minimallyEncodeRawThreadInfoWithMemberPermissions = ( rawThreadInfo: LegacyRawThreadInfo, diff --git a/lib/types/thread-types.js b/lib/types/thread-types.js --- a/lib/types/thread-types.js +++ b/lib/types/thread-types.js @@ -35,6 +35,7 @@ type ThinThreadType, type ThickThreadType, thinThreadTypeValidator, + type FarcasterThreadType, } from './thread-types-enum.js'; import type { ClientUpdateInfo, ServerUpdateInfo } from './update-types.js'; import type { UserInfo, UserInfos } from './user-types.js'; @@ -173,9 +174,29 @@ +timestamps: ThreadTimestamps, }; +export type LegacyFarcasterRawThreadInfo = { + +farcaster: true, + +id: string, + +type: FarcasterThreadType, + +name?: ?string, + +avatar?: ?ClientAvatar, + +description?: ?string, + +color: string, // hex, without "#" or "0x" + +creationTime: number, // millisecond timestamp + +parentThreadID: ?string, + +containingThreadID?: ?string, + +community: ?string, + +members: $ReadOnlyArray, + +roles: { +[id: string]: ClientLegacyRoleInfo }, + +currentUser: LegacyThreadCurrentUserInfo, + +repliesCount: number, + +pinnedCount?: number, +}; + export type LegacyRawThreadInfo = | LegacyThinRawThreadInfo - | LegacyThickRawThreadInfo; + | LegacyThickRawThreadInfo + | LegacyFarcasterRawThreadInfo; export type LegacyRawThreadInfos = { +[id: string]: LegacyRawThreadInfo, diff --git a/lib/utils/thread-ops-utils.js b/lib/utils/thread-ops-utils.js --- a/lib/utils/thread-ops-utils.js +++ b/lib/utils/thread-ops-utils.js @@ -32,7 +32,7 @@ function convertRawThreadInfoToClientDBThreadInfo( rawThreadInfo: LegacyRawThreadInfo | RawThreadInfo, ): ClientDBThreadInfo { - const { minimallyEncoded, thick, ...rest } = rawThreadInfo; + const { minimallyEncoded, thick, farcaster, ...rest } = rawThreadInfo; return { ...rest, creationTime: rawThreadInfo.creationTime.toString(), diff --git a/native/redux/edit-thread-permission-migration.js b/native/redux/edit-thread-permission-migration.js --- a/native/redux/edit-thread-permission-migration.js +++ b/native/redux/edit-thread-permission-migration.js @@ -90,6 +90,17 @@ roles: updatedRoles, }; newThreadInfos[threadID] = newThreadInfo; + } else if (threadInfo.farcaster) { + const updatedMembers = threadInfo.members.map(member => + addDetailedThreadEditPermissionsToUser(threadInfo, member, threadID), + ); + const newThreadInfo = { + ...threadInfo, + members: updatedMembers, + currentUser: updatedCurrentUser, + roles: updatedRoles, + }; + newThreadInfos[threadID] = newThreadInfo; } else { const updatedMembers = threadInfo.members.map(member => addDetailedThreadEditPermissionsToUser(threadInfo, member, threadID), diff --git a/native/redux/manage-pins-permission-migration.js b/native/redux/manage-pins-permission-migration.js --- a/native/redux/manage-pins-permission-migration.js +++ b/native/redux/manage-pins-permission-migration.js @@ -90,6 +90,17 @@ roles: updatedRoles, }; newThreadInfos[threadID] = updatedThreadInfo; + } else if (threadInfo.farcaster) { + const updatedMembers = threadInfo.members.map(member => + addManagePinsThreadPermissionToUser(threadInfo, member, threadID), + ); + const updatedThreadInfo = { + ...threadInfo, + members: updatedMembers, + currentUser: updatedCurrentUser, + roles: updatedRoles, + }; + newThreadInfos[threadID] = updatedThreadInfo; } else { const updatedMembers = threadInfo.members.map(member => addManagePinsThreadPermissionToUser(threadInfo, member, threadID),