diff --git a/ts/models/message.ts b/ts/models/message.ts index 75e3d415f..08bb6a77a 100644 --- a/ts/models/message.ts +++ b/ts/models/message.ts @@ -128,6 +128,7 @@ export class MessageModel extends Backbone.Model { public getDescription() { if (this.isGroupUpdate()) { const groupUpdate = this.get('group_update'); + const ourPrimary = window.textsecure.storage.get('primaryDevicePubKey'); if ( groupUpdate.left === 'You' || @@ -136,7 +137,10 @@ export class MessageModel extends Backbone.Model { groupUpdate.left[0] === ourPrimary) ) { return window.i18n('youLeftTheGroup'); - } else if (groupUpdate.left) { + } else if ( + (groupUpdate.left && Array.isArray(groupUpdate.left) && groupUpdate.left.length === 1) || + typeof groupUpdate.left === 'string' + ) { return window.i18n( 'leftTheGroup', ConversationController.getInstance().getContactProfileNameOrShortenedPubKey( @@ -144,7 +148,6 @@ export class MessageModel extends Backbone.Model { ) ); } - if (groupUpdate.kicked === 'You') { return window.i18n('youGotKickedFromGroup'); } @@ -373,7 +376,10 @@ export class MessageModel extends Backbone.Model { type: 'remove', isMe: true, }); - } else { + } else if ( + typeof groupUpdate.left === 'string' || + (Array.isArray(groupUpdate.left) && groupUpdate.left.length === 1) + ) { changes.push({ type: 'remove', contacts: _.map( diff --git a/ts/receiver/closedGroups.ts b/ts/receiver/closedGroups.ts index 8c8eb08c9..7c89425a4 100644 --- a/ts/receiver/closedGroups.ts +++ b/ts/receiver/closedGroups.ts @@ -449,6 +449,12 @@ async function performIfValid( await removeFromCache(envelope); return; } + // make sure the conversation with this user exist (even if it's just hidden) + await ConversationController.getInstance().getOrCreateAndWait( + sender, + ConversationTypeEnum.PRIVATE + ); + if (groupUpdate.type === Type.NAME_CHANGE) { await handleClosedGroupNameChanged(envelope, groupUpdate, convo); } else if (groupUpdate.type === Type.MEMBERS_ADDED) { @@ -531,6 +537,12 @@ async function handleClosedGroupMembersAdded( } const members = [...oldMembers, ...membersNotAlreadyPresent]; + // make sure the conversation with those members (even if it's just hidden) + await Promise.all( + members.map(async m => + ConversationController.getInstance().getOrCreateAndWait(m, ConversationTypeEnum.PRIVATE) + ) + ); const groupDiff: ClosedGroup.GroupDiff = { joiningMembers: membersNotAlreadyPresent, @@ -748,6 +760,7 @@ async function handleClosedGroupMemberLeft(envelope: EnvelopePlus, convo: Conver const groupDiff: ClosedGroup.GroupDiff = { leavingMembers: [sender], }; + await ClosedGroup.addUpdateMessage(convo, groupDiff, 'incoming', _.toNumber(envelope.timestamp)); convo.updateLastMessage(); // if a user just left and we are the admin, we remove him right away for everyone by sending a MEMBERS_REMOVED message so no need to add him as a zombie