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/password_dialog_view.js'></script>
<script type='text/javascript' src='js/views/seed_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/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/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/identicon_svg_view.js'></script>
<script type='text/javascript' src='js/views/install_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/password_dialog_view.js'></script>
<script type='text/javascript' src='js/views/seed_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/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/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/identicon_svg_view.js'></script>
<script type='text/javascript' src='js/views/install_view.js'></script> <script type='text/javascript' src='js/views/install_view.js'></script>

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

@ -113,6 +113,8 @@
this.propsForMessage = this.getPropsForMessage(); this.propsForMessage = this.getPropsForMessage();
} }
}; };
const triggerChange = () => this.trigger('change');
this.on('change', generateProps); this.on('change', generateProps);
const applicableConversationChanges = const applicableConversationChanges =
@ -120,8 +122,11 @@
const conversation = this.getConversation(); const conversation = this.getConversation();
const fromContact = this.getIncomingContact(); const fromContact = this.getIncomingContact();
this.listenTo(conversation, applicableConversationChanges, generateProps); 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) { if (fromContact) {
this.listenTo( this.listenTo(
fromContact, fromContact,
@ -703,6 +708,8 @@
multiSelectMode: conversation && conversation.selectedMessages.size > 0, multiSelectMode: conversation && conversation.selectedMessages.size > 0,
isPublic: !!this.get('isPublic'), isPublic: !!this.get('isPublic'),
isRss: !!this.get('isRss'), isRss: !!this.get('isRss'),
isKickedFromGroup:
conversation && conversation.get('isKickedFromGroup'),
senderIsModerator: senderIsModerator:
!!this.get('isPublic') && !!this.get('isPublic') &&
conversation && 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'), value: item.get('seconds'),
})), })),
hasNickname: !!this.model.getNickname(), hasNickname: !!this.model.getNickname(),
isKickedFromGroup: this.model.get('isKickedFromGroup'),
onSetDisappearingMessages: seconds => onSetDisappearingMessages: seconds =>
this.setDisappearingMessages(seconds), this.setDisappearingMessages(seconds),
@ -294,6 +295,7 @@
amMod: this.model.isModerator( amMod: this.model.isModerator(
window.storage.get('primaryDevicePubKey') window.storage.get('primaryDevicePubKey')
), ),
isKickedFromGroup: this.model.get('isKickedFromGroup'),
timerOptions: Whisper.ExpirationTimerOptions.map(item => ({ timerOptions: Whisper.ExpirationTimerOptions.map(item => ({
name: item.getName(), name: item.getName(),

@ -14,11 +14,14 @@
const convos = window.getConversations().models; const convos = window.getConversations().models;
const friends = convos.filter( this.friends = convos.filter(
d => !!d && d.isFriend() && d.isPrivate() && !d.isMe() 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.chatName = convo.get('name');
this.chatServer = convo.get('server'); this.chatServer = convo.get('server');
this.channelId = convo.get('channelId'); this.channelId = convo.get('channelId');

@ -1565,7 +1565,7 @@ input {
} }
.friend-selection-list { .friend-selection-list {
width: 40vh; width: 20vw;
} }
.session-beta-disclaimer { .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/password_dialog_view.js"></script>
<script type="text/javascript" src="../js/views/seed_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/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/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/identicon_svg_view.js"></script>
<script type="text/javascript" src="../js/views/install_view.js"></script> <script type="text/javascript" src="../js/views/install_view.js"></script>

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

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

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

Loading…
Cancel
Save