diff --git a/ts/messageModifiers/MessageReceipts.ts b/ts/messageModifiers/MessageReceipts.ts index a4bb8e6027..a120663b21 100644 --- a/ts/messageModifiers/MessageReceipts.ts +++ b/ts/messageModifiers/MessageReceipts.ts @@ -9,7 +9,7 @@ import { Collection, Model } from 'backbone'; import type { ConversationModel } from '../models/conversations'; import type { MessageModel } from '../models/messages'; import type { MessageAttributesType } from '../model-types.d'; -import { isOutgoing } from '../state/selectors/message'; +import { isOutgoing, isStory } from '../state/selectors/message'; import { isDirectConversation } from '../util/whatTypeOfConversation'; import { getOwn } from '../util/getOwn'; import { missingCaseError } from '../util/missingCaseError'; @@ -66,7 +66,8 @@ async function getTargetMessage( return null; } const message = messages.find( - item => isOutgoing(item) && sourceId === item.conversationId + item => + (isOutgoing(item) || isStory(item)) && sourceId === item.conversationId ); if (message) { return window.MessageController.register(message.id, message); @@ -78,7 +79,8 @@ async function getTargetMessage( ids.push(sourceId); const target = messages.find( - item => isOutgoing(item) && ids.includes(item.conversationId) + item => + (isOutgoing(item) || isStory(item)) && ids.includes(item.conversationId) ); if (!target) { return null; diff --git a/ts/messageModifiers/ViewSyncs.ts b/ts/messageModifiers/ViewSyncs.ts index bdafaaeb96..1c050375e2 100644 --- a/ts/messageModifiers/ViewSyncs.ts +++ b/ts/messageModifiers/ViewSyncs.ts @@ -8,7 +8,7 @@ import { Collection, Model } from 'backbone'; import type { MessageModel } from '../models/messages'; import { ReadStatus } from '../messages/MessageReadStatus'; import { markViewed } from '../services/MessageUpdater'; -import { isIncoming } from '../state/selectors/message'; +import { isIncoming, isStory } from '../state/selectors/message'; import { notificationService } from '../services/notifications'; import * as log from '../logging/log'; @@ -67,7 +67,10 @@ export class ViewSyncs extends Collection { uuid: item.sourceUuid, }); - return isIncoming(item) && senderId === sync.get('senderId'); + return ( + (isIncoming(item) || isStory(item)) && + senderId === sync.get('senderId') + ); }); if (!found) { diff --git a/ts/state/ducks/stories.ts b/ts/state/ducks/stories.ts index 1c2f44c8a0..c9b855f9ea 100644 --- a/ts/state/ducks/stories.ts +++ b/ts/state/ducks/stories.ts @@ -374,37 +374,32 @@ export function reducer( 'type', ]); - // Stories don't really need to change except for when we don't have the - // attachment downloaded and we queue a download. Then the story's message - // will have the new attachment information. This is an optimization so - // we don't needlessly re-render. - const prevStory = state.stories.find( + const prevStoryIndex = state.stories.findIndex( existingStory => existingStory.messageId === newStory.messageId ); - if (prevStory) { + if (prevStoryIndex >= 0) { + const prevStory = state.stories[prevStoryIndex]; + + // Stories rarely need to change, here are the following exceptions: + const isDownloadingAttachment = isDownloading(newStory.attachment); + const hasAttachmentDownloaded = + !isDownloaded(prevStory.attachment) && + isDownloaded(newStory.attachment); + const readStatusChanged = prevStory.readStatus !== newStory.readStatus; + const shouldReplace = - (!isDownloaded(prevStory.attachment) && - isDownloaded(newStory.attachment)) || - isDownloading(newStory.attachment); - + isDownloadingAttachment || hasAttachmentDownloaded || readStatusChanged; if (!shouldReplace) { return state; } - const storyIndex = state.stories.findIndex( - existingStory => existingStory.messageId === newStory.messageId - ); - - if (storyIndex < 0) { - return state; - } - return { ...state, - stories: replaceIndex(state.stories, storyIndex, newStory), + stories: replaceIndex(state.stories, prevStoryIndex, newStory), }; } + // Adding a new story const stories = [...state.stories, newStory].sort((a, b) => a.timestamp > b.timestamp ? 1 : -1 );