diff --git a/js/background.js b/js/background.js index 177ea83c1..75e67391e 100644 --- a/js/background.js +++ b/js/background.js @@ -630,6 +630,8 @@ groupId, 'group' ); + const oldMembers = convo.get('members'); + const oldName = convo.getName(); const ev = { groupDetails: { @@ -709,7 +711,6 @@ const updateObj = { id: groupId, - name: groupName, avatar: nullAvatar, recipients, members, @@ -717,6 +718,19 @@ options, }; + if (oldName !== groupName) { + updateObj.name = groupName; + } + + const addedMembers = _.difference(updateObj.members, oldMembers); + if (addedMembers.length > 0) { + updateObj.joined = addedMembers; + } + // Check if anyone got kicked: + const removedMembers = _.difference(oldMembers, updateObj.members); + if (removedMembers.length > 0) { + updateObj.kicked = removedMembers; + } // Send own sender keys and group secret key if (isMediumGroup) { const { chainKey, keyIdx } = await window.SenderKeyAPI.getSenderKeys( diff --git a/js/models/conversations.js b/js/models/conversations.js index c1f304da5..b64e18387 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -1891,7 +1891,7 @@ // if we do set an identifier here, be sure to not sync the message two times in msg.handleMessageSentSuccess() timestamp: now, groupId: id, - name, + name: name || this.getName(), avatar, members, admins: this.get('groupAdmins'), diff --git a/js/views/group_update_view.js b/js/views/group_update_view.js deleted file mode 100644 index b7e150d5e..000000000 --- a/js/views/group_update_view.js +++ /dev/null @@ -1,33 +0,0 @@ -/* global Backbone, Whisper */ - -// eslint-disable-next-line func-names -(function() { - 'use strict'; - - window.Whisper = window.Whisper || {}; - - // TODO: remove this as unused? - Whisper.GroupUpdateView = Backbone.View.extend({ - tagName: 'div', - className: 'group-update', - render() { - // TODO l10n - if (this.model.left) { - this.$el.text(`${this.model.left} left the group`); - return this; - } - - const messages = ['Updated the group.']; - if (this.model.name) { - messages.push(`Group name has been set to '${this.model.name}'.`); - } - if (this.model.joined) { - messages.push(`${this.model.joined.join(', ')} joined the group`); - } - - this.$el.text(messages.join(' ')); - - return this; - }, - }); -})(); diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index 49e979638..79fcac46e 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -685,7 +685,7 @@ label { padding-left: 10px; } -.create-group-dialog .session-modal__body { +.session-modal__body { display: flex; flex-direction: column; diff --git a/ts/components/conversation/InviteContactsDialog.tsx b/ts/components/conversation/InviteContactsDialog.tsx index c77d044b9..417ae66e0 100644 --- a/ts/components/conversation/InviteContactsDialog.tsx +++ b/ts/components/conversation/InviteContactsDialog.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { SessionModal } from '../session/SessionModal'; -import { SessionButton } from '../session/SessionButton'; +import { SessionButton, SessionButtonColor } from '../session/SessionButton'; import { ContactType, SessionMemberListItem, @@ -87,6 +87,7 @@ export class InviteContactsDialog extends React.Component { text={okText} disabled={!hasContacts} onClick={this.onClickOK} + buttonColor={SessionButtonColor.Green} /> diff --git a/ts/components/conversation/UpdateGroupMembersDialog.tsx b/ts/components/conversation/UpdateGroupMembersDialog.tsx index ca9e05e5e..374a8564e 100644 --- a/ts/components/conversation/UpdateGroupMembersDialog.tsx +++ b/ts/components/conversation/UpdateGroupMembersDialog.tsx @@ -3,7 +3,7 @@ import classNames from 'classnames'; import { Contact } from './MemberList'; import { SessionModal } from '../session/SessionModal'; -import { SessionButton } from '../session/SessionButton'; +import { SessionButton, SessionButtonColor } from '../session/SessionButton'; import { ContactType, SessionMemberListItem, @@ -136,9 +136,12 @@ export class UpdateGroupMembersDialog extends React.Component {
- - +
); diff --git a/ts/components/conversation/UpdateGroupNameDialog.tsx b/ts/components/conversation/UpdateGroupNameDialog.tsx index facdef321..4b8c8c235 100644 --- a/ts/components/conversation/UpdateGroupNameDialog.tsx +++ b/ts/components/conversation/UpdateGroupNameDialog.tsx @@ -2,7 +2,7 @@ import React from 'react'; import classNames from 'classnames'; import { SessionModal } from '../session/SessionModal'; -import { SessionButton } from '../session/SessionButton'; +import { SessionButton, SessionButtonColor } from '../session/SessionButton'; import { Avatar } from '../Avatar'; interface Props { @@ -106,9 +106,13 @@ export class UpdateGroupNameDialog extends React.Component { />
- - + +
); diff --git a/ts/receiver/queuedJob.ts b/ts/receiver/queuedJob.ts index 34493e653..6fc2da5de 100644 --- a/ts/receiver/queuedJob.ts +++ b/ts/receiver/queuedJob.ts @@ -522,6 +522,16 @@ export async function handleMessageJob( handleSessionReset(conversation, message); } else if (message.isExpirationTimerUpdate()) { const { expireTimer } = initialMessage; + const oldValue = conversation.get('expireTimer'); + if (expireTimer === oldValue) { + if (confirm) { + confirm(); + } + window.console.log( + 'Dropping ExpireTimerUpdate message as we already have the same one set.' + ); + return; + } handleExpirationTimerUpdate(conversation, message, source, expireTimer); } else { await handleRegularMessage(