diff --git a/lib/hooks/input-state-container-hooks.js b/lib/hooks/input-state-container-hooks.js --- a/lib/hooks/input-state-container-hooks.js +++ b/lib/hooks/input-state-container-hooks.js @@ -83,6 +83,9 @@ const processHolders = useProcessBlobHolders(); const dispatch = useDispatch(); + const sendFarcasterTextMessage = useSendFarcasterTextMessage(); + const currentUserFID = useCurrentUserFID(); + return React.useCallback( async ( messageInfo: RawMultimediaMessageInfo, @@ -104,6 +107,8 @@ reassignThickThreadMedia, processHolders, dispatch, + currentUserFID, + sendFarcasterTextMessage, }, ); }, @@ -115,6 +120,8 @@ sendComposableDMOperation, sendMultimediaMessage, threadInfos, + currentUserFID, + sendFarcasterTextMessage, ], ); } 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 @@ -86,6 +86,8 @@ RemoveUsersFromThreadUtils, ProtocolLeaveThreadInput, LeaveThreadUtils, + ProtocolSendMultimediaMessageInput, + SendMultimediaMessageUtils, } from '../thread-spec.js'; const farcasterThreadProtocol: ThreadProtocol = { @@ -134,8 +136,61 @@ }; }, - sendMultimediaMessage: async (): Promise => { - throw new Error('sendMultimediaMessage method is not yet implemented'); + sendMultimediaMessage: async ( + message: ProtocolSendMultimediaMessageInput, + utils: SendMultimediaMessageUtils, + ): Promise => { + const { messageInfo, threadInfo } = message; + const { sendFarcasterTextMessage, currentUserFID } = utils; + const { localID, media } = messageInfo; + invariant( + localID !== null && localID !== undefined, + 'localID should be set', + ); + + const time = Date.now(); + + const messageText = media + .map(m => { + if (m.type === 'photo' || m.type === 'video') { + return m.uri; + } + return null; + }) + .filter(Boolean) + .join('\n'); + + let request; + if (threadInfo.type === farcasterThreadTypes.FARCASTER_PERSONAL) { + const otherUser = getSingleOtherUser(threadInfo, currentUserFID); + invariant( + otherUser, + `Farcaster 1:1 conversation should have one more member except ${ + currentUserFID ?? 'null' + }`, + ); + request = { + recipientFid: otherUser, + message: messageText, + }; + } else { + const conversationID = conversationIDFromFarcasterThreadID(threadInfo.id); + request = { + groupId: conversationID, + message: messageText, + }; + } + + const result = await sendFarcasterTextMessage(request); + + return { + result: { + localID, + serverID: result.result.messageId, + threadID: messageInfo.threadID, + time, + }, + }; }, editTextMessage: async (): Promise => { 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 @@ -140,6 +140,8 @@ +reassignThickThreadMedia: MediaMetadataReassignmentAction, +processHolders: ProcessHolders, +dispatch: Dispatch, + +sendFarcasterTextMessage: SendFarcasterTextMessageInput => Promise, + +currentUserFID: ?string, }; export type ProtocolEditTextMessageInput = {