diff --git a/lib/hooks/thread-hooks.js b/lib/hooks/thread-hooks.js --- a/lib/hooks/thread-hooks.js +++ b/lib/hooks/thread-hooks.js @@ -5,7 +5,6 @@ import uuid from 'uuid'; import { useChatMentionContext } from './chat-mention-hooks.js'; -import { useGetCommFCUsersForFIDs } from './user-identities-hooks.js'; import { removeUsersFromThreadActionTypes } from '../actions/thread-action-types.js'; import genesis from '../facts/genesis.js'; import { extractKeyserverIDFromID } from '../keyserver-conn/keyserver-call-utils.js'; @@ -18,8 +17,6 @@ } from '../shared/dm-ops/dm-op-types.js'; import { useProcessAndSendDMOperation } from '../shared/dm-ops/process-dm-ops.js'; import { - useFetchFarcasterConversation, - useFetchFarcasterMessages, useUpdateFarcasterGroupNameAndDescription, useModifyFarcasterMembershipInput, } from '../shared/farcaster/farcaster-api.js'; @@ -58,7 +55,7 @@ } from '../types/thread-types.js'; import { values } from '../utils/objects.js'; import { useDispatchActionPromise } from '../utils/redux-promise-utils.js'; -import { useSelector, useDispatch } from '../utils/redux-utils.js'; +import { useSelector } from '../utils/redux-utils.js'; function useChildThreadInfosMap(): { +[id: string]: $ReadOnlyArray, @@ -243,10 +240,9 @@ const keyserverCall = useKeyserverCall(changeThreadSettings); const updateFarcasterGroupNameAndDescription = useUpdateFarcasterGroupNameAndDescription(); - const fetchFarcasterConversation = useFetchFarcasterConversation(); - const fetchFarcasterMessages = useFetchFarcasterMessages(); - const fetchUsersByFIDs = useGetCommFCUsersForFIDs(); - const dispatch = useDispatch(); + const modifyFarcasterMembership = useModifyFarcasterMembershipInput(); + const refreshFarcasterConversation = useRefreshFarcasterConversation(); + const auxUserStore = useSelector(state => state.auxUserStore); return React.useCallback( async (input: UseChangeThreadSettingsInput) => @@ -256,21 +252,19 @@ processAndSendDMOperation, keyserverChangeThreadSettings: keyserverCall, updateFarcasterGroupNameAndDescription, - fetchFarcasterConversation, - fetchFarcasterMessages, - fetchUsersByFIDs, - dispatch, + modifyFarcasterMembership, + refreshFarcasterConversation, + auxUserStore, }, ), [ - fetchFarcasterConversation, + auxUserStore, keyserverCall, + modifyFarcasterMembership, processAndSendDMOperation, + refreshFarcasterConversation, updateFarcasterGroupNameAndDescription, viewerID, - fetchFarcasterMessages, - fetchUsersByFIDs, - dispatch, ], ); } 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 @@ -46,19 +46,13 @@ ThreadJoinPayload, } from '../../../types/thread-types.js'; import { updateTypes } from '../../../types/update-types-enum.js'; -import { type ThreadUpdateInfo } from '../../../types/update-types.js'; -import { extractFarcasterIDsFromPayload } from '../../../utils/conversion-utils.js'; -import { convertFarcasterMessageToCommMessages } from '../../../utils/convert-farcaster-message-to-comm-messages.js'; -import { createFarcasterRawThreadInfo } from '../../../utils/create-farcaster-raw-thread-info.js'; import { farcasterThreadIDRegExp } from '../../../utils/validation-utils.js'; import { generatePendingThreadColor } from '../../color-utils.js'; import { type ModifyFarcasterMembershipInput } from '../../farcaster/farcaster-api.js'; -import { farcasterMessageValidator } from '../../farcaster/farcaster-messages-types.js'; import { conversationIDFromFarcasterThreadID, extractFIDFromUserID, farcasterThreadIDFromConversationID, - userIDFromFID, } from '../../id-utils.js'; import { messageNotifyTypes } from '../../messages/message-spec.js'; import { @@ -157,10 +151,9 @@ } = protocolInput; const { updateFarcasterGroupNameAndDescription, - fetchFarcasterConversation, - fetchFarcasterMessages, - fetchUsersByFIDs, - dispatch, + modifyFarcasterMembership, + refreshFarcasterConversation, + auxUserStore, } = utils; invariant( !changes.color, @@ -190,58 +183,40 @@ ); } if (changes.newMemberIDs) { - throw new Error('newMemberIDs not implemented yet'); + const targetFids = changes.newMemberIDs + .map(memberID => { + const targetFid = + auxUserStore.auxUserInfos[memberID]?.fid ?? + extractFIDFromUserID(memberID); + return targetFid ? parseInt(targetFid, 10) : null; + }) + .filter(Boolean); + + if (targetFids.length > 0) { + const modifyFarcasterMembershipInput: ModifyFarcasterMembershipInput = { + conversationId, + action: 'add', + targetFids, + }; + + promises.push( + modifyFarcasterMembership(modifyFarcasterMembershipInput), + ); + } } if (changes.avatar) { throw new Error('avatar not implemented yet'); } - // Perform all updates before fetching updated thread + // Perform all updates before refreshing conversation await Promise.all(promises); - const updatedConversation = await fetchFarcasterConversation({ - conversationId, - }); - - const update = ({ - type: updateTypes.UPDATE_THREAD, - id: threadInfo.id, - time: Date.now(), - threadInfo: createFarcasterRawThreadInfo( - updatedConversation.result.conversation, - ), - }: ThreadUpdateInfo); - - const messagesResponse = await fetchFarcasterMessages({ - conversationId, - }); - const farcasterMessages = messagesResponse.result.messages; - const userFIDs = farcasterMessages.flatMap(message => - extractFarcasterIDsFromPayload(farcasterMessageValidator, message), - ); - - const fcUserInfos = await fetchUsersByFIDs(userFIDs); - - const newMessageInfos = farcasterMessages.flatMap(farcasterMessage => - convertFarcasterMessageToCommMessages(farcasterMessage, fcUserInfos), - ); - - if (fcUserInfos.size > 0) { - const newUserIDs = Array.from(fcUserInfos.entries()).map( - ([fid, user]) => user?.userID ?? userIDFromFID(fid), - ); - dispatch({ - // TODO: importing processNewUserIDsActionType causes circular - // dependencies that are hard to resolve - type: 'PROCESS_NEW_USER_IDS', - payload: { userIDs: newUserIDs }, - }); - } + await refreshFarcasterConversation(conversationId); return ({ threadID: threadInfo.id, - updatesResult: { newUpdates: [update] }, - newMessageInfos, + updatesResult: { newUpdates: [] }, + newMessageInfos: [], }: ChangeThreadSettingsPayload); }, diff --git a/lib/shared/threads/thread-spec.js b/lib/shared/threads/thread-spec.js --- a/lib/shared/threads/thread-spec.js +++ b/lib/shared/threads/thread-spec.js @@ -24,7 +24,6 @@ LeaveThreadResult, RemoveUsersFromThreadInput, } from '../../hooks/thread-hooks.js'; -import type { GetCommFCUsersForFIDs } from '../../hooks/user-identities-hooks.js'; import type { RolePermissionBlobs } from '../../permissions/thread-permissions.js'; import type { ProcessOutboundP2PMessagesResult } from '../../tunnelbroker/peer-to-peer-context.js'; import type { TunnelbrokerSocketState } from '../../tunnelbroker/tunnelbroker-context.js'; @@ -88,13 +87,9 @@ OutboundDMOperationSpecification, } from '../dm-ops/dm-op-types.js'; import type { - FetchFarcasterConversationResult, SendFarcasterMessageResult, SendFarcasterTextMessageInput, UpdateFarcasterGroupNameAndDescriptionInput, - FetchFarcasterConversationInput, - FetchFarcasterMessageInput, - FetchFarcasterMessageResult, UpdateFarcasterSubscriptionInput, StreamFarcasterDirectCastReadInput, MarkFarcasterDirectCastUnreadInput, @@ -167,10 +162,11 @@ +processAndSendDMOperation: OutboundDMOperationSpecification => Promise, +keyserverChangeThreadSettings: UpdateThreadRequest => Promise, +updateFarcasterGroupNameAndDescription: UpdateFarcasterGroupNameAndDescriptionInput => Promise, - +fetchFarcasterConversation: FetchFarcasterConversationInput => Promise, - +fetchFarcasterMessages: FetchFarcasterMessageInput => Promise, - +fetchUsersByFIDs: GetCommFCUsersForFIDs, - +dispatch: Dispatch, + +modifyFarcasterMembership: ( + input: ModifyFarcasterMembershipInput, + ) => Promise, + +refreshFarcasterConversation: (conversationId: string) => Promise, + +auxUserStore: AuxUserStore, }; export type ProtocolCreateEntryInput = {