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 @@ -20,6 +20,20 @@ import { useDispatch } from '../../utils/redux-utils.js'; import { useSendDMOperationUtils } from '../dm-ops/dm-op-utils.js'; +async function processInBatches( + items: $ReadOnlyArray, + batchSize: number, + processor: (item: T) => Promise, +): Promise> { + const results: Array = []; + for (let i = 0; i < items.length; i += batchSize) { + const batch = items.slice(i, i + batchSize); + const batchResults = await Promise.all(batch.map(processor)); + results.push(...batchResults); + } + return results; +} + function useFarcasterConversationsSync(): (limit: number) => Promise { const [fullInbox, setFullInbox] = React.useState(false); const [conversations, setConversations] = React.useState< @@ -73,18 +87,20 @@ void (async () => { const farcasterConversations: Array = []; - for (const conversationId of conversations) { + + const fetchConversation = async ( + conversationId: string, + ): Promise => { try { const conversationResult = await fetchFarcasterConversation({ conversationId, }); if (!conversationResult) { - continue; + return null; } const farcasterConversation = conversationResult.result.conversation; - farcasterConversations.push(farcasterConversation); const thread = createFarcasterRawThreadInfo(farcasterConversation); const update = { type: updateTypes.JOIN_THREAD, @@ -103,12 +119,25 @@ updateInfos: [update], }, }); + + return farcasterConversation; } catch (e) { console.error(`Failed fetching conversation ${conversationId}:`, e); + return null; } - } + }; - for (const farcasterConversation of farcasterConversations) { + const conversationResults = await processInBatches( + conversations, + 20, + fetchConversation, + ); + + farcasterConversations.push(...conversationResults.filter(Boolean)); + + const fetchMessagesForConversation = async ( + farcasterConversation: FarcasterConversation, + ): Promise => { try { let cursor: ?string = null; let totalMessagesFetched = 0; @@ -164,7 +193,13 @@ e, ); } - } + }; + + await processInBatches( + farcasterConversations, + 20, + fetchMessagesForConversation, + ); setConversations([]); setInProgress(false);