diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 89a84b4ab..903689057 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -3059,7 +3059,40 @@ "message": "An admin changed who can edit group membership to \"All members.\"", "description": "Shown in timeline or conversation preview when v2 group changes" }, - + "GroupV2--member-add--invited--you": { + "message": "You added invited member $inviteeName$.", + "description": "Shown in timeline or conversation preview when v2 group changes", + "placeholders": { + "inviteeName": { + "content": "$1", + "example": "Alice" + } + } + }, + "GroupV2--member-add--invited--other": { + "message": "$memberName$ added invited member $inviteeName$.", + "description": "Shown in timeline or conversation preview when v2 group changes", + "placeholders": { + "memberName": { + "content": "$1", + "example": "Alice" + }, + "inviteeName": { + "content": "$2", + "example": "Bob" + } + } + }, + "GroupV2--member-add--invited--unknown": { + "message": "A member added invited member $inviteeName$.", + "description": "Shown in timeline or conversation preview when v2 group changes", + "placeholders": { + "inviteeName": { + "content": "$1", + "example": "Alice" + } + } + }, "GroupV2--member-add--from-invite--other": { "message": "$inviteeName$ accepted an invitation to the group from $inviterName$.", "description": "Shown in timeline or conversation preview when v2 group changes", @@ -3074,6 +3107,16 @@ } } }, + "GroupV2--member-add--from-invite--other-no-from": { + "message": "$inviteeName$ accepted an invitation to the group.", + "description": "Shown in timeline or conversation preview when v2 group changes", + "placeholders": { + "inviteeName": { + "content": "$1", + "example": "Alice" + } + } + }, "GroupV2--member-add--from-invite--you": { "message": "You accepted an invitation to the group from $inviterName$.", "description": "Shown in timeline or conversation preview when v2 group changes", @@ -3084,6 +3127,10 @@ } } }, + "GroupV2--member-add--from-invite--you-no-from": { + "message": "You accepted an invitation to the group.", + "description": "Shown in timeline or conversation preview when v2 group changes" + }, "GroupV2--member-add--from-invite--from-you": { "message": "$inviteeName$ accepted your invitation to the group.", "description": "Shown in timeline or conversation preview when v2 group changes", diff --git a/ts/components/conversation/GroupV2Change.stories.tsx b/ts/components/conversation/GroupV2Change.stories.tsx index e0ba70459..351fd8436 100644 --- a/ts/components/conversation/GroupV2Change.stories.tsx +++ b/ts/components/conversation/GroupV2Change.stories.tsx @@ -368,9 +368,60 @@ storiesOf('Components/Conversation/GroupV2Change', module) ); }) - .add('Member Add - from invite', () => { + .add('Member Add - add invited', () => { return ( <> + {/* the strings where someone added you - shown like a normal add */} + {renderChange({ + from: CONTACT_A, + details: [ + { + type: 'member-add-from-invite', + conversationId: OUR_ID, + inviter: CONTACT_B, + }, + ], + })} + {renderChange({ + details: [ + { + type: 'member-add-from-invite', + conversationId: OUR_ID, + inviter: CONTACT_A, + }, + ], + })} + {/* the rest of the 'someone added someone else' checks */} + {renderChange({ + from: OUR_ID, + details: [ + { + type: 'member-add-from-invite', + conversationId: CONTACT_A, + inviter: CONTACT_B, + }, + ], + })} + {renderChange({ + from: CONTACT_A, + details: [ + { + type: 'member-add-from-invite', + conversationId: CONTACT_B, + inviter: CONTACT_C, + }, + ], + })} + {renderChange({ + details: [ + { + type: 'member-add-from-invite', + conversationId: CONTACT_A, + inviter: CONTACT_B, + }, + ], + })} + {/* in all of these we know the user has accepted the invite */} {renderChange({ from: OUR_ID, details: [ @@ -382,7 +433,16 @@ storiesOf('Components/Conversation/GroupV2Change', module) ], })} {renderChange({ - from: CONTACT_B, + from: OUR_ID, + details: [ + { + type: 'member-add-from-invite', + conversationId: OUR_ID, + }, + ], + })} + {renderChange({ + from: CONTACT_A, details: [ { type: 'member-add-from-invite', @@ -392,6 +452,7 @@ storiesOf('Components/Conversation/GroupV2Change', module) ], })} {renderChange({ + from: CONTACT_A, details: [ { type: 'member-add-from-invite', @@ -400,6 +461,15 @@ storiesOf('Components/Conversation/GroupV2Change', module) }, ], })} + {renderChange({ + from: CONTACT_A, + details: [ + { + type: 'member-add-from-invite', + conversationId: CONTACT_A, + }, + ], + })} ); }) diff --git a/ts/groupChange.ts b/ts/groupChange.ts index e009360c6..7802dcba1 100644 --- a/ts/groupChange.ts +++ b/ts/groupChange.ts @@ -189,20 +189,62 @@ export function renderChangeDetail( const weAreJoiner = conversationId === ourConversationId; const weAreInviter = Boolean(inviter && inviter === ourConversationId); + if (!from || from !== conversationId) { + if (weAreJoiner) { + // They can't be the same, no fromYou check here + if (from) { + return renderString('GroupV2--member-add--you--other', i18n, [ + renderContact(from), + ]); + } + return renderString('GroupV2--member-add--you--unknown', i18n); + } + + if (fromYou) { + return renderString('GroupV2--member-add--invited--you', i18n, { + inviteeName: renderContact(conversationId), + }); + } + if (from) { + return renderString('GroupV2--member-add--invited--other', i18n, { + memberName: renderContact(from), + inviteeName: renderContact(conversationId), + }); + } + return renderString('GroupV2--member-add--invited--unknown', i18n, { + inviteeName: renderContact(conversationId), + }); + } + if (weAreJoiner) { - return renderString('GroupV2--member-add--from-invite--you', i18n, [ - renderContact(inviter), - ]); + if (inviter) { + return renderString('GroupV2--member-add--from-invite--you', i18n, [ + renderContact(inviter), + ]); + } + return renderString( + 'GroupV2--member-add--from-invite--you-no-from', + i18n + ); } if (weAreInviter) { return renderString('GroupV2--member-add--from-invite--from-you', i18n, [ renderContact(conversationId), ]); } - return renderString('GroupV2--member-add--from-invite--other', i18n, { - inviteeName: renderContact(conversationId), - inviterName: renderContact(inviter), - }); + if (inviter) { + return renderString('GroupV2--member-add--from-invite--other', i18n, { + inviteeName: renderContact(conversationId), + inviterName: renderContact(inviter), + }); + } + return renderString( + 'GroupV2--member-add--from-invite--other-no-from', + i18n, + { + inviteeName: renderContact(conversationId), + } + ); } else if (detail.type === 'member-remove') { const { conversationId } = detail; const weAreLeaver = conversationId === ourConversationId; diff --git a/ts/groups.ts b/ts/groups.ts index 67a35607d..184d795ec 100644 --- a/ts/groups.ts +++ b/ts/groups.ts @@ -78,7 +78,7 @@ export type GroupV2MemberAddChangeType = { export type GroupV2MemberAddFromInviteChangeType = { type: 'member-add-from-invite'; conversationId: string; - inviter: string; + inviter?: string; }; export type GroupV2MemberPrivilegeChangeType = { type: 'member-privilege'; @@ -946,7 +946,7 @@ function extractDiffs({ if (!oldMember) { const pendingMember = oldPendingMemberLookup[conversationId]; - if (pendingMember && pendingMember.addedByUserId) { + if (pendingMember) { details.push({ type: 'member-add-from-invite', conversationId,