Merge pull request #1074 from Bilb/various-group-fixes

Various group fixes
pull/1088/head
Mikunj Varsani 5 years ago committed by GitHub
commit 035daffe2b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -495,7 +495,6 @@
<script type='text/javascript' src='js/views/password_dialog_view.js'></script>
<script type='text/javascript' src='js/views/seed_dialog_view.js'></script>
<script type='text/javascript' src='js/views/qr_dialog_view.js'></script>
<script type='text/javascript' src='js/views/connecting_to_server_dialog_view.js'></script>
<script type='text/javascript' src='js/views/beta_release_disclaimer_view.js'></script>
<script type='text/javascript' src='js/views/identicon_svg_view.js'></script>
<script type='text/javascript' src='js/views/install_view.js'></script>

@ -495,7 +495,6 @@
<script type='text/javascript' src='js/views/password_dialog_view.js'></script>
<script type='text/javascript' src='js/views/seed_dialog_view.js'></script>
<script type='text/javascript' src='js/views/qr_dialog_view.js'></script>
<script type='text/javascript' src='js/views/connecting_to_server_dialog_view.js'></script>
<script type='text/javascript' src='js/views/beta_release_disclaimer_view.js'></script>
<script type='text/javascript' src='js/views/identicon_svg_view.js'></script>
<script type='text/javascript' src='js/views/install_view.js'></script>

@ -1160,6 +1160,11 @@
const conversationExists = ConversationController.get(conversationId);
if (conversationExists) {
window.log.warn('We are already a member of this public chat');
window.pushToast({
description: window.i18n('publicChatExists'),
type: 'info',
id: 'alreadyMemberPublicChat',
});
return;
}

@ -113,6 +113,8 @@
this.propsForMessage = this.getPropsForMessage();
}
};
const triggerChange = () => this.trigger('change');
this.on('change', generateProps);
const applicableConversationChanges =
@ -120,8 +122,11 @@
const conversation = this.getConversation();
const fromContact = this.getIncomingContact();
this.listenTo(conversation, applicableConversationChanges, generateProps);
// trigger a change event on this component.
// this will call generateProps and refresh the Message.tsx component with new props
this.listenTo(conversation, 'disable:input', triggerChange);
if (fromContact) {
this.listenTo(
fromContact,
@ -703,6 +708,8 @@
multiSelectMode: conversation && conversation.selectedMessages.size > 0,
isPublic: !!this.get('isPublic'),
isRss: !!this.get('isRss'),
isKickedFromGroup:
conversation && conversation.get('isKickedFromGroup'),
senderIsModerator:
!!this.get('isPublic') &&
conversation &&

@ -1,61 +0,0 @@
/* global Whisper, i18n, log */
// eslint-disable-next-line func-names
(function() {
'use strict';
window.Whisper = window.Whisper || {};
Whisper.ConnectingToServerDialogView = Whisper.View.extend({
templateName: 'connecting-to-server-template',
className: 'loki-dialog connecting-to-server modal',
initialize(options = {}) {
this.title = i18n('connectingLoad');
this.cancelText = options.cancelText || i18n('cancel');
this.serverUrl = options.serverUrl;
this.channelId = options.channelId;
this.once('attemptConnection', () =>
this.attemptConnection(options.serverUrl, options.channelId)
);
this.render();
},
events: {
keyup: 'onKeyup',
'click .cancel': 'close',
},
async attemptConnection(serverUrl, channelId) {
let conversation = null;
try {
conversation = await window.attemptConnection(serverUrl, channelId);
} catch (e) {
log.error('can not connect', e.message, e.code);
return this.resolveWith({ errorCode: e.message });
}
return this.resolveWith({ conversation });
},
resolveWith(result) {
this.trigger('connectionResult', result);
this.remove();
},
render_attributes() {
return {
title: this.title,
cancel: this.cancelText,
};
},
close() {
this.trigger('connectionResult', { cancelled: true });
this.remove();
},
onKeyup(event) {
switch (event.key) {
case 'Escape':
case 'Esc':
this.close();
break;
default:
break;
}
},
});
})();

@ -196,6 +196,7 @@
value: item.get('seconds'),
})),
hasNickname: !!this.model.getNickname(),
isKickedFromGroup: this.model.get('isKickedFromGroup'),
onSetDisappearingMessages: seconds =>
this.setDisappearingMessages(seconds),
@ -294,6 +295,7 @@
amMod: this.model.isModerator(
window.storage.get('primaryDevicePubKey')
),
isKickedFromGroup: this.model.get('isKickedFromGroup'),
timerOptions: Whisper.ExpirationTimerOptions.map(item => ({
name: item.getName(),

@ -14,11 +14,14 @@
const convos = window.getConversations().models;
const friends = convos.filter(
this.friends = convos.filter(
d => !!d && d.isFriend() && d.isPrivate() && !d.isMe()
);
if (!convo.isPublic()) {
const members = convo.get('members') || [];
this.friends = this.friends.filter(d => !members.includes(d.id));
}
this.friends = friends;
this.chatName = convo.get('name');
this.chatServer = convo.get('server');
this.channelId = convo.get('channelId');

@ -1565,7 +1565,7 @@ input {
}
.friend-selection-list {
width: 40vh;
width: 20vw;
}
.session-beta-disclaimer {

@ -542,7 +542,6 @@
<script type="text/javascript" src="../js/views/password_dialog_view.js"></script>
<script type="text/javascript" src="../js/views/seed_dialog_view.js"></script>
<script type="text/javascript" src="../js/views/qr_dialog_view.js"></script>
<script type="text/javascript" src="../js/views/connecting_to_server_dialog_view.js"></script>
<script type="text/javascript" src="../js/views/beta_release_disclaimer_view.js"></script>
<script type="text/javascript" src="../js/views/identicon_svg_view.js"></script>
<script type="text/javascript" src="../js/views/install_view.js"></script>

@ -62,6 +62,7 @@ interface Props {
isOnline?: boolean;
selectedMessages: any;
isKickedFromGroup: boolean;
onSetDisappearingMessages: (seconds: number) => void;
onDeleteMessages: () => void;
@ -145,6 +146,7 @@ export class ConversationHeader extends React.Component<Props> {
subscriberCount,
isFriendRequestPending,
isMe,
isKickedFromGroup,
name,
} = this.props;
@ -179,7 +181,7 @@ export class ConversationHeader extends React.Component<Props> {
}
const textEl =
text === '' ? null : (
text === '' || isKickedFromGroup ? null : (
<span className="module-conversation-header__title-text">{text}</span>
);
@ -298,6 +300,7 @@ export class ConversationHeader extends React.Component<Props> {
isPublic,
isRss,
isGroup,
isKickedFromGroup,
amMod,
onDeleteMessages,
onDeleteContact,
@ -320,20 +323,20 @@ export class ConversationHeader extends React.Component<Props> {
<MenuItem onClick={onCopyPublicKey}>{copyIdLabel}</MenuItem>
) : null}
<MenuItem onClick={onDeleteMessages}>{i18n('deleteMessages')}</MenuItem>
{amMod ? (
{amMod && !isKickedFromGroup ? (
<MenuItem onClick={onAddModerators}>{i18n('addModerators')}</MenuItem>
) : null}
{amMod ? (
{amMod && !isKickedFromGroup ? (
<MenuItem onClick={onRemoveModerators}>
{i18n('removeModerators')}
</MenuItem>
) : null}
{amMod ? (
{amMod && !isKickedFromGroup ? (
<MenuItem onClick={onUpdateGroupName}>
{i18n('editGroupNameOrPicture')}
</MenuItem>
) : null}
{isPrivateGroup ? (
{isPrivateGroup && !isKickedFromGroup ? (
<MenuItem onClick={onLeaveGroup}>{i18n('leaveGroup')}</MenuItem>
) : null}
{/* TODO: add delete group */}
@ -391,7 +394,7 @@ export class ConversationHeader extends React.Component<Props> {
}
public render() {
const { id } = this.props;
const { id, isKickedFromGroup } = this.props;
const triggerId = `conversation-${id}-${Date.now()}`;
return (
@ -407,7 +410,7 @@ export class ConversationHeader extends React.Component<Props> {
{/*isPrivateGroup ? this.renderMemberCount() : null*/}
</div>
</div>
{this.renderExpirationLength()}
{!isKickedFromGroup && this.renderExpirationLength()}
{!this.props.isRss && this.renderAvatar()}
@ -436,6 +439,8 @@ export class ConversationHeader extends React.Component<Props> {
isBlocked,
isMe,
isGroup,
isFriend,
isKickedFromGroup,
isArchived,
isPublic,
isRss,
@ -452,7 +457,6 @@ export class ConversationHeader extends React.Component<Props> {
// hasNickname,
// onClearNickname,
// onChangeNickname,
isFriend,
} = this.props;
if (isPublic || isRss) {
@ -464,20 +468,21 @@ export class ConversationHeader extends React.Component<Props> {
const blockTitle = isBlocked ? i18n('unblockUser') : i18n('blockUser');
const blockHandler = isBlocked ? onUnblockUser : onBlockUser;
const disappearingMessagesMenuItem = isFriend && (
<SubMenu title={disappearingTitle}>
{(timerOptions || []).map(item => (
<MenuItem
key={item.value}
onClick={() => {
onSetDisappearingMessages(item.value);
}}
>
{item.name}
</MenuItem>
))}
</SubMenu>
);
const disappearingMessagesMenuItem = isFriend &&
!isKickedFromGroup && (
<SubMenu title={disappearingTitle}>
{(timerOptions || []).map(item => (
<MenuItem
key={item.value}
onClick={() => {
onSetDisappearingMessages(item.value);
}}
>
{item.name}
</MenuItem>
))}
</SubMenu>
);
const showMembersMenuItem = isGroup && (
<MenuItem onClick={onShowGroupMembers}>{i18n('showMembers')}</MenuItem>
);

@ -100,6 +100,7 @@ export interface Props {
isPublic?: boolean;
isRss?: boolean;
selected: boolean;
isKickedFromGroup: boolean;
// whether or not to show check boxes
multiSelectMode: boolean;
@ -782,11 +783,12 @@ export class Message extends React.PureComponent<Props, State> {
attachments,
direction,
disableMenu,
isKickedFromGroup,
onDownload,
onReply,
} = this.props;
if (!isCorrectSide || disableMenu) {
if (!isCorrectSide || disableMenu || isKickedFromGroup) {
return null;
}
@ -1051,12 +1053,14 @@ export class Message extends React.PureComponent<Props, State> {
return false;
}
// tslint:disable-next-line: cyclomatic-complexity
public render() {
const {
authorPhoneNumber,
authorColor,
direction,
id,
isKickedFromGroup,
isRss,
timestamp,
selected,
@ -1106,7 +1110,7 @@ export class Message extends React.PureComponent<Props, State> {
divClasses.push('public-chat-message-wrapper');
}
const enableContextMenu = !isRss && !multiSelectMode;
const enableContextMenu = !isRss && !multiSelectMode && !isKickedFromGroup;
return (
<div className={classNames(divClasses)}>
@ -1136,7 +1140,9 @@ export class Message extends React.PureComponent<Props, State> {
}}
>
{this.renderError(isIncoming)}
{isRss ? null : this.renderMenu(!isIncoming, triggerId)}
{isRss || isKickedFromGroup
? null
: this.renderMenu(!isIncoming, triggerId)}
<div
className={classNames(
'module-message__container',

@ -21,6 +21,7 @@ interface Props {
isPublic: boolean;
isAdmin: boolean;
amMod: boolean;
isKickedFromGroup: boolean;
onGoBack: () => void;
onInviteFriends: () => void;
@ -212,14 +213,17 @@ export class SessionGroupSettings extends React.Component<Props, any> {
onLeaveGroup,
isPublic,
isAdmin,
isKickedFromGroup,
amMod,
} = this.props;
const { documents, media, onItemClick } = this.state;
const showMemberCount = !!(memberCount && memberCount > 0);
const hasDisappearingMessages = !isPublic;
const hasDisappearingMessages = !isPublic && !isKickedFromGroup;
const leaveGroupString = isPublic
? window.i18n('leaveOpenGroup')
: window.i18n('leaveClosedGroup');
: isKickedFromGroup
? window.i18n('youAreKickedFromThisGroup')
: window.i18n('leaveClosedGroup');
const disappearingMessagesOptions = timerOptions.map(option => {
return {
@ -230,8 +234,10 @@ export class SessionGroupSettings extends React.Component<Props, any> {
};
});
const showUpdateGroupNameButton = isPublic ? amMod : isAdmin;
const showUpdateGroupMembersButton = !isPublic && isAdmin;
const showUpdateGroupNameButton =
isPublic && !isKickedFromGroup ? amMod : isAdmin;
const showUpdateGroupMembersButton =
!isPublic && !isKickedFromGroup && isAdmin;
return (
<div className="group-settings">
@ -292,6 +298,7 @@ export class SessionGroupSettings extends React.Component<Props, any> {
buttonColor={SessionButtonColor.Danger}
buttonType={SessionButtonType.SquareOutline}
onClick={onLeaveGroup}
disabled={isKickedFromGroup}
/>
</div>
);
@ -305,9 +312,10 @@ export class SessionGroupSettings extends React.Component<Props, any> {
avatarPath,
isAdmin,
isPublic,
isKickedFromGroup,
} = this.props;
const showInviteFriends = isPublic || isAdmin;
const showInviteFriends = (isPublic || isAdmin) && !isKickedFromGroup;
return (
<div className="group-settings-header">

Loading…
Cancel
Save