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 @@ -83,6 +83,16 @@ const RETRY_DELAY_MS = 1000; const MAX_BATCH_MESSAGE_SIZE = 500000; +type FarcasterSyncProgress = { + +completedConversations?: number, + +totalNumberOfConversations?: number, + +completedMessages?: number, +}; + +type OnFarcasterSyncProgressCallback = ( + progress: FarcasterSyncProgress, +) => void; + class BatchedUpdates { userIDs: Set; updateInfos: Array; @@ -162,6 +172,19 @@ return this.estimatedSize; } + getMessageCount(): number { + let count = this.messageInfos.length + this.additionalMessageInfos.length; + for (const updateInfo of this.updateInfos) { + if ( + updateInfo.type === updateTypes.JOIN_THREAD && + updateInfo.rawMessageInfos + ) { + count += updateInfo.rawMessageInfos.length; + } + } + return count; + } + trimToSize(maxSize: number): BatchedUpdates { const overflow = new BatchedUpdates(); @@ -286,19 +309,20 @@ batchSize: number, processor: (item: T, batchedUpdates: BatchedUpdates) => Promise, dispatch: Dispatch, - onProgress?: (completed: number, total: number) => void, + onProgress?: OnFarcasterSyncProgressCallback, addLog?: AddLogCallback, ): Promise> { const results: Array = []; let failedItemsCount = 0; let progress = 0; + let completedMessages = 0; for (let i = 0; i < items.length; i += batchSize) { const batch = items.slice(i, i + batchSize); const batchPromises = batch.map(async item => { + const itemBatchedUpdates = new BatchedUpdates(); try { - const itemBatchedUpdates = new BatchedUpdates(); const result = await processor(item, itemBatchedUpdates); return { result, updates: itemBatchedUpdates }; } catch (error) { @@ -317,7 +341,12 @@ return null; } finally { progress++; - onProgress?.(progress, items.length); + completedMessages += itemBatchedUpdates.getMessageCount(); + onProgress?.({ + completedConversations: progress, + totalNumberOfConversations: items.length, + completedMessages, + }); } }); @@ -1041,7 +1070,7 @@ } function useFarcasterConversationsSync(): ( - onProgress?: (completed: number, total: number) => void, + onProgress?: OnFarcasterSyncProgressCallback, ) => Promise { const dispatch = useDispatch(); const fetchConversationWithMessages = useFetchConversationWithMessages(); @@ -1051,7 +1080,7 @@ const removeDeadThreads = useRemoveDeadThreads(); return React.useCallback( - async (onProgress?: (completed: number, total: number) => void) => { + async (onProgress?: OnFarcasterSyncProgressCallback) => { try { const inboxResults = await Promise.all([ fetchInboxes(), @@ -1079,7 +1108,11 @@ return; } - onProgress?.(0, conversations.length); + onProgress?.({ + completedConversations: 0, + totalNumberOfConversations: conversations.length, + completedMessages: 0, + }); await processInBatchesWithReduxBatching( conversations, FARCASTER_DATA_BATCH_SIZE, @@ -1090,7 +1123,7 @@ batchedUpdates, ), dispatch, - (completed, total) => onProgress?.(completed, total), + onProgress, addLog, ); @@ -1402,8 +1435,9 @@ function useFarcasterSync(onComplete?: () => void): { +inProgress: boolean, +progress: ?{ - completed: number, - total: number, + completedConversations: number, + totalNumberOfConversations: number, + completedMessages: number, }, } { const syncFarcasterConversations = useFarcasterConversationsSync(); @@ -1414,16 +1448,25 @@ const fullyLoggedIn = isUserLoggedIn && userDataReady; const [inProgress, setInProgress] = React.useState(false); const [progress, setProgress] = React.useState(null); const handleProgress = React.useCallback( - (completed: number, total: number) => - setProgress({ - completed, - total, - }), + (progressData: FarcasterSyncProgress) => + setProgress(prev => ({ + completedConversations: + progressData.completedConversations ?? + prev?.completedConversations ?? + 0, + totalNumberOfConversations: + progressData.totalNumberOfConversations ?? + prev?.totalNumberOfConversations ?? + 0, + completedMessages: + progressData.completedMessages ?? prev?.completedMessages ?? 0, + })), [], ); diff --git a/native/farcaster/farcaster-sync-loading-screen.react.js b/native/farcaster/farcaster-sync-loading-screen.react.js --- a/native/farcaster/farcaster-sync-loading-screen.react.js +++ b/native/farcaster/farcaster-sync-loading-screen.react.js @@ -27,7 +27,7 @@ const { progress } = useFarcasterSync(handleComplete); const progressValue = progress - ? progress.completed / progress.total + ? progress.completedConversations / progress.totalNumberOfConversations : undefined; return ( @@ -63,13 +63,20 @@ {progress ? ( - + <> + + + {progress.completedMessages + ? `${progress.completedMessages.toLocaleString()} messages fetched` + : 'Fetching messages...'} + + ) : ( -

Loading conversations...

- {progress.completed} of {progress.total} ( - {progress.total - ? Math.round((progress.completed / progress.total) * 100) + {progress.completedConversations} of{' '} + {progress.totalNumberOfConversations} ( + {progress.totalNumberOfConversations + ? Math.round( + (progress.completedConversations / + progress.totalNumberOfConversations) * + 100, + ) : 0} - %) + %) conversations fetched

+ {progress.completedMessages ? ( +

+ {progress.completedMessages.toLocaleString()} messages fetched +

+ ) : null} ); }, [progress]);