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 @@ -28,10 +28,14 @@ import { convertFarcasterMessageToCommMessages } from '../../utils/convert-farcaster-message-to-comm-messages.js'; import { createFarcasterRawThreadInfo } from '../../utils/create-farcaster-raw-thread-info.js'; import { useSetFarcasterDCsLoaded } from '../../utils/farcaster-utils.js'; -import { useDispatch } from '../../utils/redux-utils.js'; +import { values } from '../../utils/objects.js'; +import { useDispatch, useSelector } from '../../utils/redux-utils.js'; import sleep from '../../utils/sleep.js'; import { useSendDMOperationUtils } from '../dm-ops/dm-op-utils.js'; -import { userIDFromFID } from '../id-utils.js'; +import { + conversationIDFromFarcasterThreadID, + userIDFromFID, +} from '../id-utils.js'; const FARCASTER_DATA_BATCH_SIZE = 20; const MAX_RETRIES = 3; @@ -368,6 +372,8 @@ const fetchConversation = useFetchConversationWithBatching(); const fetchMessagesForConversation = useFetchMessagesForConversation(); + const threadInfos = useSelector(state => state.threadStore.threadInfos); + const fetchInboxes: (cursor: ?string) => Promise = React.useCallback( async (cursor: ?string) => { try { @@ -402,6 +408,34 @@ [fetchFarcasterInbox], ); + const removeDeadThreads = React.useCallback(() => { + const conversationsSet = new Set(conversations); + const time = Date.now(); + + const updateInfos = values(threadInfos) + .filter( + threadInfo => + threadInfo.farcaster && + !conversationsSet.has( + conversationIDFromFarcasterThreadID(threadInfo.id), + ), + ) + .map(threadInfo => ({ + type: updateTypes.DELETE_THREAD, + id: uuid.v4(), + time, + threadID: threadInfo.id, + })); + + dispatch({ + type: processFarcasterOpsActionType, + payload: { + rawMessageInfos: [], + updateInfos, + }, + }); + }, [conversations, dispatch, threadInfos]); + const [inProgress, setInProgress] = React.useState(false); const setFarcasterDCsLoaded = useSetFarcasterDCsLoaded(); React.useEffect(() => { @@ -410,6 +444,8 @@ } setInProgress(true); + removeDeadThreads(); + void (async () => { const farcasterConversations: Array = []; @@ -451,6 +487,8 @@ sendFarcasterTextMessage, utils, setFarcasterDCsLoaded, + threadInfos, + removeDeadThreads, ]); return React.useCallback(