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 @@ -11,6 +11,7 @@ useSendFarcasterTextMessage, } from './farcaster-api.js'; import type { FarcasterConversation } from './farcaster-conversation-types.js'; +import type { FarcasterMessage } from './farcaster-messages-types'; import { messageTruncationStatus } from '../../types/message-types.js'; import { updateTypes } from '../../types/update-types-enum.js'; import { convertFarcasterMessageToCommMessages } from '../../utils/convert-farcaster-message-to-comm-messages.js'; @@ -260,9 +261,26 @@ ); } +function useAddNewFarcasterMessage(): FarcasterMessage => void { + const dispatch = useDispatch(); + + return React.useCallback( + (farcasterMessage: FarcasterMessage) => { + const rawMessageInfos = + convertFarcasterMessageToCommMessages(farcasterMessage); + dispatch({ + type: processFarcasterOpsActionType, + payload: { rawMessageInfos, updateInfos: [] }, + }); + }, + [dispatch], + ); +} + export { useFarcasterConversationsSync, useFetchConversation, useFetchMessagesForConversation, useRefreshFarcasterConversation, + useAddNewFarcasterMessage, }; diff --git a/lib/tunnelbroker/use-peer-to-peer-message-handler.js b/lib/tunnelbroker/use-peer-to-peer-message-handler.js --- a/lib/tunnelbroker/use-peer-to-peer-message-handler.js +++ b/lib/tunnelbroker/use-peer-to-peer-message-handler.js @@ -34,7 +34,10 @@ } from '../shared/device-list-utils.js'; import { dmOperationSpecificationTypes } from '../shared/dm-ops/dm-op-types.js'; import { useProcessDMOperation } from '../shared/dm-ops/process-dm-ops.js'; -import { useFarcasterConversationsSync } from '../shared/farcaster/farcaster-hooks.js'; +import { + useAddNewFarcasterMessage, + useFarcasterConversationsSync, +} from '../shared/farcaster/farcaster-hooks.js'; import { IdentityClientContext } from '../shared/identity-client-context.js'; import type { IdentityServiceClient, @@ -317,6 +320,8 @@ const handlePrimaryDeviceChanges = useResendP2PMessagesToNewPrimaryDevices(); const { createOlmSessionsWithUser } = usePeerOlmSessionsCreatorContext(); + const addNewFarcasterMessage = useAddNewFarcasterMessage(); + const { addLog } = useDebugLogs(); const olmDebugLog = useOlmDebugLogs(); @@ -655,6 +660,10 @@ deviceToken: message.invalidatedToken, }, }); + } else if ( + message.type === peerToPeerMessageTypes.NEW_FARCASTER_MESSAGE + ) { + addNewFarcasterMessage(message.message); } }, [ @@ -672,6 +681,7 @@ resendPeerToPeerMessages, handlePrimaryDeviceChanges, sqliteAPI, + addNewFarcasterMessage, ], ); } diff --git a/lib/types/tunnelbroker/farcaster-messages-types.js b/lib/types/tunnelbroker/farcaster-messages-types.js --- a/lib/types/tunnelbroker/farcaster-messages-types.js +++ b/lib/types/tunnelbroker/farcaster-messages-types.js @@ -3,6 +3,10 @@ import type { TInterface } from 'tcomb'; import t from 'tcomb'; +import { + type FarcasterMessage, + farcasterMessageValidator, +} from '../../shared/farcaster/farcaster-messages-types.js'; import { tShape, tString } from '../../utils/validation-utils.js'; type APIMethod = @@ -100,3 +104,14 @@ requestID: t.String, response: farcasterAPIResponseDataValidator, }); + +export type NewFarcasterMessage = { + +type: 'NewFarcasterMessage', + +message: FarcasterMessage, +}; + +export const newFarcasterMessageValidator: TInterface = + tShape({ + type: tString('NewFarcasterMessage'), + message: farcasterMessageValidator, + }); diff --git a/lib/types/tunnelbroker/peer-to-peer-message-types.js b/lib/types/tunnelbroker/peer-to-peer-message-types.js --- a/lib/types/tunnelbroker/peer-to-peer-message-types.js +++ b/lib/types/tunnelbroker/peer-to-peer-message-types.js @@ -3,6 +3,8 @@ import type { TInterface, TUnion } from 'tcomb'; import t from 'tcomb'; +import type { NewFarcasterMessage } from './farcaster-messages-types.js'; +import { newFarcasterMessageValidator } from './farcaster-messages-types.js'; import { tShape, tString, tUserID } from '../../utils/validation-utils.js'; import { type EncryptedData, encryptedDataValidator } from '../crypto-types.js'; import { @@ -28,6 +30,7 @@ MESSAGE_PROCESSED: 'MessageProcessed', IDENTITY_DEVICE_LIST_UPDATED: 'IdentityDeviceListUpdated', BAD_DEVICE_TOKEN: 'BadDeviceToken', + NEW_FARCASTER_MESSAGE: 'NewFarcasterMessage', }); export type OutboundSessionCreation = { @@ -128,7 +131,8 @@ | DeviceListUpdated | MessageProcessed | IdentityDeviceListUpdated - | BadDeviceToken; + | BadDeviceToken + | NewFarcasterMessage; export const peerToPeerMessageValidator: TUnion = t.union([ outboundSessionCreationValidator, @@ -139,4 +143,5 @@ messageProcessedValidator, identityDeviceListUpdatedValidator, badDeviceTokenValidator, + newFarcasterMessageValidator, ]);