diff --git a/lib/shared/farcaster/farcaster-hooks.js b/lib/shared/farcaster/farcaster-hooks.js --- a/lib/shared/farcaster/farcaster-hooks.js +++ b/lib/shared/farcaster/farcaster-hooks.js @@ -17,7 +17,10 @@ import { messageTruncationStatus } from '../../types/message-types.js'; import { updateTypes } from '../../types/update-types-enum.js'; import type { ClientUpdateInfo } from '../../types/update-types.js'; -import { createFarcasterRawThreadInfo } from '../../utils/farcaster-utils.js'; +import { + convertFarcasterMessageToCommMessages, + createFarcasterRawThreadInfo, +} from '../../utils/farcaster-utils.js'; import { useDispatch } from '../../utils/redux-utils.js'; import { useSendDMOperationUtils } from '../dm-ops/dm-op-utils.js'; @@ -89,11 +92,6 @@ .filter(Boolean) .map(conversationResult => conversationResult.result.conversation); - console.log( - 'Farcaster conversations:', - JSON.stringify(farcasterConversations, null, 2), - ); - const messagePromises: $ReadOnlyArray< Promise, > = farcasterConversations.map(async ({ conversationId }) => { @@ -113,12 +111,10 @@ .filter(Boolean) .flatMap(messagesResult => messagesResult.result.messages); - console.log( - 'Farcaster messages:', - JSON.stringify(farcasterMessages, null, 2), + const rawMessageInfos = farcasterMessages.flatMap(farcasterMessage => + convertFarcasterMessageToCommMessages(farcasterMessage), ); - //TODO: dispatch messages const updates = farcasterConversations .map(conversation => createFarcasterRawThreadInfo(conversation)) .map( @@ -136,7 +132,7 @@ dispatch({ type: processFarcasterOpsActionType, payload: { - rawMessageInfos: [], + rawMessageInfos, updateInfos: updates, }, }); 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 @@ -19,10 +19,14 @@ import { getOwnPeerDevices } from '../selectors/user-selectors.js'; import { generatePendingThreadColor } from '../shared/color-utils.js'; import type { FarcasterConversation } from '../shared/farcaster/farcaster-conversation-types.js'; +import type { FarcasterMessage } from '../shared/farcaster/farcaster-messages-types.js'; import { IdentityClientContext } from '../shared/identity-client-context.js'; import { PeerToPeerContext } from '../tunnelbroker/peer-to-peer-context.js'; import type { ClientAvatar } from '../types/avatar-types.js'; import { databaseIdentifier } from '../types/database-identifier-types.js'; +import type { Media } from '../types/media-types.js'; +import { messageTypes } from '../types/message-types-enum.js'; +import type { RawMessageInfo } from '../types/message-types.js'; import { minimallyEncodeRoleInfo, minimallyEncodeThreadCurrentUserInfo, @@ -386,6 +390,80 @@ }; } +function convertFarcasterMessageToCommMessages( + farcasterMessage: FarcasterMessage, +): $ReadOnlyArray { + const creatorID = `${farcasterMessage.senderFid}`; + const threadID = farcasterThreadIDFromConversationID( + farcasterMessage.conversationId, + ); + if ( + farcasterMessage.type === 'group_membership_addition' && + farcasterMessage.actionTargetUserContext?.fid + ) { + const addedUser = `${farcasterMessage.actionTargetUserContext.fid}`; + return [ + { + id: farcasterMessage.messageId, + type: messageTypes.ADD_MEMBERS, + threadID, + creatorID, + time: parseInt(farcasterMessage.serverTimestamp, 10), + addedUserIDs: [addedUser], + }, + ]; + } + + if ( + farcasterMessage.type === 'text' && + !!farcasterMessage?.metadata?.medias + ) { + const media = farcasterMessage.metadata.medias.map( + med => + ({ + id: uuid.v4(), + uri: med.staticRaster, + type: 'photo', + thumbHash: null, + dimensions: { + height: med.height, + width: med.width, + }, + }: Media), + ); + return [ + { + id: farcasterMessage.messageId, + type: messageTypes.MULTIMEDIA, + threadID, + creatorID, + time: parseInt(farcasterMessage.serverTimestamp, 10), + media, + }, + ]; + } + + if (farcasterMessage.type === 'text') { + return [ + { + id: farcasterMessage.messageId, + type: messageTypes.TEXT, + threadID, + creatorID, + time: parseInt(farcasterMessage.serverTimestamp, 10), + text: farcasterMessage.message, + }, + ]; + } + + console.log( + 'UNSUPPORTED FARCASTER MESSAGE', + JSON.stringify(farcasterMessage, null, 2), + ); + + return []; +} + export { DISABLE_CONNECT_FARCASTER_ALERT, NO_FID_METADATA, @@ -399,4 +477,5 @@ useLinkFarcasterDCs, createFarcasterDCsAuthMessage, createFarcasterRawThreadInfo, + convertFarcasterMessageToCommMessages, };