After import, don't show chats in left pane unless they have messages

This commit is contained in:
trevor-signal 2024-12-12 20:55:14 -05:00 committed by GitHub
parent 97d31cd1a5
commit ec26b82ba7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 34 additions and 20 deletions

7
ts/model-types.d.ts vendored
View file

@ -504,6 +504,13 @@ export type ConversationAttributesType = {
// Legacy field, mapped to above in getConversation()
unblurredAvatarPath?: string;
// Only used during backup integration tests. After import, our data model merges
// Contact and Chat frames from a backup, and we will then by default export both, even
// if the Chat frame was not imported. That's fine in normal usage, but breaks
// integration tests that aren't expecting to see a Chat frame on export that was not
// there on import.
test_chatFrameImportedFromBackup?: boolean;
};
export type ConversationRenderInfoType = Pick<

View file

@ -140,6 +140,7 @@ import { SeenStatus } from '../../MessageSeenStatus';
import { migrateAllMessages } from '../../messages/migrateMessageData';
import { trimBody } from '../../util/longAttachment';
import { generateBackupsSubscriberData } from '../../util/backupSubscriptionData';
import { getEnvironment, isTestEnvironment } from '../../environment';
const MAX_CONCURRENCY = 10;
@ -448,9 +449,18 @@ export class BackupExportStream extends Readable {
pinnedOrder = Math.max(1, index + 1);
}
// Skip conversations that have no presence in left pane (no chats)
if (!attributes.isPinned && !attributes.active_at) {
continue;
if (isTestEnvironment(getEnvironment())) {
// In backup integration tests, we may import a Contact/Group without a Chat,
// so we don't wan't to export the (empty) Chat to satisfy the tests.
if (
!attributes.test_chatFrameImportedFromBackup &&
!attributes.isPinned &&
!attributes.active_at &&
!attributes.expireTimer &&
!attributes.muteExpiresAt
) {
continue;
}
}
this.pushFrame({

View file

@ -1201,9 +1201,8 @@ export class BackupImportStream extends Writable {
this.chatIdToConvo.set(chat.id.toNumber(), conversation);
// Make sure conversation appears in left pane
if (conversation.active_at == null) {
conversation.active_at = Math.max(chat.id.toNumber(), 1);
if (isTestEnvironment(getEnvironment())) {
conversation.test_chatFrameImportedFromBackup = true;
}
conversation.isArchived = chat.archived === true;
@ -1412,14 +1411,12 @@ export class BackupImportStream extends Writable {
...additionalMessages.map(additional => this.saveMessage(additional)),
]);
// TODO (DESKTOP-6964): We'll want to increment for more types here - stickers, etc.
if (item.standardMessage) {
if (item.outgoing != null) {
chatConvo.sentMessageCount = (chatConvo.sentMessageCount ?? 0) + 1;
} else {
chatConvo.messageCount = (chatConvo.messageCount ?? 0) + 1;
}
if (item.outgoing != null) {
chatConvo.sentMessageCount = (chatConvo.sentMessageCount ?? 0) + 1;
} else if (item.incoming != null) {
chatConvo.messageCount = (chatConvo.messageCount ?? 0) + 1;
}
await this.updateConversation(chatConvo);
}
@ -1574,6 +1571,7 @@ export class BackupImportStream extends Writable {
readStatus: ReadStatus.Read,
seenStatus: SeenStatus.Seen,
},
newActiveAt: timestamp,
};
}

View file

@ -60,12 +60,6 @@ describe('backup/integration', () => {
const files = readdirSync(BACKUP_INTEGRATION_DIR)
.filter(file => file.endsWith('.binproto'))
.filter(
file =>
// TODO (DESKTOP-8025)
!file.startsWith('chat_folder_') &&
!file.startsWith('notification_profile_')
)
.map(file => join(BACKUP_INTEGRATION_DIR, file));
if (files.length === 0) {
@ -104,7 +98,12 @@ describe('backup/integration', () => {
const actualString = actual.comparableString();
const expectedString = expected.comparableString();
if (expectedString.includes('ReleaseChannelDonationRequest')) {
if (
expectedString.includes('ReleaseChannelDonationRequest') ||
// TODO (DESKTOP-8025) roundtrip these frames
fullPath.includes('chat_folder') ||
fullPath.includes('notification_profile')
) {
// Skip the unsupported tests
return;
}