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 @@ -20,6 +20,7 @@ useUpdateFarcasterGroupNameAndDescription, useModifyFarcasterMembershipInput, useAcceptInvite, + useAcceptOneOnOneInvite, } from '../shared/farcaster/farcaster-api.js'; import { useFetchConversation, @@ -507,6 +508,7 @@ ); const keyserverCall = useJoinKeyserverThread(); const farcasterAcceptInvite = useAcceptInvite(); + const farcasterAcceptOneOnOneInvite = useAcceptOneOnOneInvite(); const refreshFarcasterConversation = useRefreshFarcasterConversation(); return React.useCallback( @@ -522,6 +524,7 @@ calendarQuery: input.calendarQuery, farcasterAcceptInvite, refreshFarcasterConversation, + farcasterAcceptOneOnOneInvite, }, ), [ @@ -530,6 +533,7 @@ processAndSendDMOperation, refreshFarcasterConversation, viewerID, + farcasterAcceptOneOnOneInvite, ], ); } diff --git a/lib/shared/farcaster/farcaster-api.js b/lib/shared/farcaster/farcaster-api.js --- a/lib/shared/farcaster/farcaster-api.js +++ b/lib/shared/farcaster/farcaster-api.js @@ -854,6 +854,41 @@ ); } +export type AcceptOneOnOneInviteInput = { + +conversationId: string, + +category: 'default', +}; + +function useAcceptOneOnOneInvite(): ( + input: AcceptOneOnOneInviteInput, +) => Promise { + const { sendFarcasterRequest } = useTunnelbroker(); + const { addLog } = useDebugLogs(); + return React.useCallback( + async (input: AcceptOneOnOneInviteInput) => { + try { + await sendFarcasterRequest({ + apiVersion: 'v2', + endpoint: 'direct-cast-conversation-categorization', + method: { type: 'POST' }, + payload: JSON.stringify(input), + }); + } catch (error) { + addLog( + 'Farcaster API: Failed to accept one-one-one invite', + JSON.stringify({ + conversationId: input.conversationId, + error: getMessageForException(error), + }), + new Set([logTypes.FARCASTER, logTypes.ERROR]), + ); + throw error; + } + }, + [addLog, sendFarcasterRequest], + ); +} + export { useSendFarcasterTextMessage, useFetchFarcasterMessages, @@ -869,4 +904,5 @@ useSendFarcasterReaction, useAcceptInvite, useFetchFarcasterConversationInvites, + useAcceptOneOnOneInvite, }; 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 @@ -916,10 +916,18 @@ utils: JoinThreadUtils, ): Promise => { const threadID = input.rawThreadInfo.id; + const threadType = input.rawThreadInfo.type; const conversationID = conversationIDFromFarcasterThreadID(threadID); - await utils.farcasterAcceptInvite({ - conversationId: conversationID, - }); + if (threadTypeIsPersonal(threadType)) { + await utils.farcasterAcceptOneOnOneInvite({ + conversationId: conversationID, + category: 'default', + }); + } else { + await utils.farcasterAcceptInvite({ + conversationId: conversationID, + }); + } await utils.refreshFarcasterConversation(conversationID); 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 @@ -101,6 +101,7 @@ ModifyFarcasterMembershipInput, SendReactionInput, AcceptInviteInput, + AcceptOneOnOneInviteInput, } from '../farcaster/farcaster-api.js'; import type { FarcasterConversation } from '../farcaster/farcaster-conversation-types.js'; import type { FarcasterMessageFetchingContextType } from '../farcaster/farcaster-message-fetching-context.js'; @@ -378,6 +379,9 @@ +keyserverJoinThread: ClientThreadJoinRequest => Promise, +calendarQuery: () => CalendarQuery, +farcasterAcceptInvite: (input: AcceptInviteInput) => Promise, + +farcasterAcceptOneOnOneInvite: ( + input: AcceptOneOnOneInviteInput, + ) => Promise, +refreshFarcasterConversation: (conversationId: string) => Promise, };