fix channel permissions & disable deleting messages

This commit is contained in:
or-else
2020-08-25 17:44:14 -07:00
parent e8d48eb5f0
commit 28fd6a7236
9 changed files with 83 additions and 33 deletions
+23 -9
View File
@@ -106,6 +106,7 @@ class InfoView extends React.Component {
muted: false, muted: false,
address: null, address: null,
groupTopic: undefined, groupTopic: undefined,
channel: undefined,
fullName: undefined, fullName: undefined,
avatar: null, avatar: null,
private: null, private: null,
@@ -230,6 +231,7 @@ class InfoView extends React.Component {
private: topic.private ? topic.private.comment : null, private: topic.private ? topic.private.comment : null,
address: topic.name, address: topic.name,
groupTopic: (topic.getType() == 'grp'), groupTopic: (topic.getType() == 'grp'),
channel: topic.isChannel(),
showMemberPanel: false, showMemberPanel: false,
access: acs ? acs.getMode() : undefined, access: acs ? acs.getMode() : undefined,
modeGiven: acs ? acs.getGiven() : undefined, modeGiven: acs ? acs.getGiven() : undefined,
@@ -335,9 +337,17 @@ class InfoView extends React.Component {
case 'want': case 'want':
toEdit = this.state.modeWant; toEdit = this.state.modeWant;
toCompare = this.state.modeGiven; toCompare = this.state.modeGiven;
toSkip = this.state.owner ? 'O' : // Don't allow owner to unset 'O' permission. if (this.state.owner) {
// Don't allow owner to unset 'O' permission. All other permissions are OK.
toSkip = 'O';
} else {
// Allow accepting any of 'ASDO' permissions but don't allow asking for them. // Allow accepting any of 'ASDO' permissions but don't allow asking for them.
Tinode.AccessMode.encode(Tinode.AccessMode.diff('ASDO', this.state.modeGiven)); toSkip = Tinode.AccessMode.encode(Tinode.AccessMode.diff('ASDO', this.state.modeGiven));
if (this.state.channel) {
// Channels are read-only.
toSkip += 'W';
}
}
titleEdit = formatMessage(messages.requested); titleEdit = formatMessage(messages.requested);
titleCompare = formatMessage(messages.granted); titleCompare = formatMessage(messages.granted);
break; break;
@@ -357,11 +367,11 @@ class InfoView extends React.Component {
toSkip = 'O'; toSkip = 'O';
break; break;
case 'user': { case 'user': {
let topic = this.props.tinode.getTopic(this.props.topic); const topic = this.props.tinode.getTopic(this.props.topic);
if (!topic) { if (!topic) {
return; return;
} }
var user = topic.subscriber(uid); const user = topic.subscriber(uid);
if (!user || !user.acs) { if (!user || !user.acs) {
return; return;
} }
@@ -695,11 +705,15 @@ class InfoView extends React.Component {
null null
} }
<div className="panel-form-column"> <div className="panel-form-column">
<a href="#" className="flat-button" onClick={this.handleDeleteMessages}> {!this.state.channel ?
<i className="material-icons">delete_outline</i> &nbsp;{ <a href="#" className="flat-button" onClick={this.handleDeleteMessages}>
formatMessage(this.state.deleter ? messages.delete_messages : messages.clear_messages) <i className="material-icons">delete_outline</i> &nbsp;{
} formatMessage(this.state.deleter ? messages.delete_messages : messages.clear_messages)
</a> }
</a>
:
null
}
<a href="#" className="red flat-button" onClick={this.handleLeave}> <a href="#" className="red flat-button" onClick={this.handleLeave}>
<i className="material-icons">exit_to_app</i> &nbsp;{formatMessage(messages.leave_chat)} <i className="material-icons">exit_to_app</i> &nbsp;{formatMessage(messages.leave_chat)}
</a> </a>
+22 -8
View File
@@ -206,7 +206,8 @@ class MessagesView extends React.Component {
typingIndicator: false, typingIndicator: false,
scrollPosition: 0, scrollPosition: 0,
fetchingMessages: false, fetchingMessages: false,
peerMessagingDisabled: false peerMessagingDisabled: false,
channel: false
}; };
} else if (nextProps.topic != prevState.topic) { } else if (nextProps.topic != prevState.topic) {
const topic = nextProps.tinode.getTopic(nextProps.topic); const topic = nextProps.tinode.getTopic(nextProps.topic);
@@ -266,6 +267,9 @@ class MessagesView extends React.Component {
peerMessagingDisabled: false peerMessagingDisabled: false
}); });
} }
Object.assign(nextState, {
channel: topic.isChannel()
});
} else { } else {
// Invalid topic. // Invalid topic.
Object.assign(nextState, { Object.assign(nextState, {
@@ -273,7 +277,8 @@ class MessagesView extends React.Component {
onlineSubs: [], onlineSubs: [],
title: '', title: '',
avatar: null, avatar: null,
peerMessagingDisabled: false peerMessagingDisabled: false,
channel: false
}); });
} }
} }
@@ -579,9 +584,11 @@ class MessagesView extends React.Component {
handleShowContextMenuMessage(params, messageSpecificMenuItems) { handleShowContextMenuMessage(params, messageSpecificMenuItems) {
params.topicName = this.state.topic; params.topicName = this.state.topic;
const menuItems = messageSpecificMenuItems || []; const menuItems = messageSpecificMenuItems || [];
menuItems.push('message_delete');
const topic = this.props.tinode.getTopic(params.topicName); const topic = this.props.tinode.getTopic(params.topicName);
if (topic) { if (topic) {
if (!topic.isChannel()) {
menuItems.push('message_delete');
}
const acs = topic.getAccessMode(); const acs = topic.getAccessMode();
if (acs && acs.isDeleter()) { if (acs && acs.isDeleter()) {
menuItems.push('message_delete_hard'); menuItems.push('message_delete_hard');
@@ -781,13 +788,20 @@ class MessagesView extends React.Component {
messageNodes.push( messageNodes.push(
<ChatMessage <ChatMessage
tinode={this.props.tinode} tinode={this.props.tinode}
content={msg.content} deleted={msg.hi} content={msg.content}
deleted={msg.hi}
mimeType={msg.head ? msg.head.mime : null} mimeType={msg.head ? msg.head.mime : null}
timestamp={msg.ts} response={isReply} seq={msg.seq} timestamp={msg.ts}
userFrom={userFrom} userName={userName} userAvatar={userAvatar} response={isReply}
sequence={sequence} received={deliveryStatus} uploader={msg._uploader} seq={msg.seq}
userFrom={userFrom}
userName={userName}
userAvatar={userAvatar}
sequence={sequence}
received={deliveryStatus}
uploader={msg._uploader}
viewportWidth={this.props.viewportWidth} viewportWidth={this.props.viewportWidth}
showContextMenu={this.handleShowContextMenuMessage} showContextMenu={this.state.channel? false : this.handleShowContextMenuMessage}
onImagePreview={this.handleImagePostview} onImagePreview={this.handleImagePostview}
onFormResponse={this.handleFormResponse} onFormResponse={this.handleFormResponse}
onError={this.props.onError} onError={this.props.onError}
+1 -1
View File
@@ -136,7 +136,7 @@ export default class ChatMessage extends React.Component {
received={this.props.received} /> received={this.props.received} />
: null} : null}
</div> </div>
{this.props.deleted ? {this.props.deleted || !this.props.showContextMenu ?
null : null :
<span className="menuTrigger"> <span className="menuTrigger">
<a href="#" onClick={this.handleContextClick}> <a href="#" onClick={this.handleContextClick}>
+31 -10
View File
@@ -1975,6 +1975,7 @@ class InfoView extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
muted: false, muted: false,
address: null, address: null,
groupTopic: undefined, groupTopic: undefined,
channel: undefined,
fullName: undefined, fullName: undefined,
avatar: null, avatar: null,
private: null, private: null,
@@ -2103,6 +2104,7 @@ class InfoView extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
private: topic.private ? topic.private.comment : null, private: topic.private ? topic.private.comment : null,
address: topic.name, address: topic.name,
groupTopic: topic.getType() == 'grp', groupTopic: topic.getType() == 'grp',
channel: topic.isChannel(),
showMemberPanel: false, showMemberPanel: false,
access: acs ? acs.getMode() : undefined, access: acs ? acs.getMode() : undefined,
modeGiven: acs ? acs.getGiven() : undefined, modeGiven: acs ? acs.getGiven() : undefined,
@@ -2237,7 +2239,17 @@ class InfoView extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
case 'want': case 'want':
toEdit = this.state.modeWant; toEdit = this.state.modeWant;
toCompare = this.state.modeGiven; toCompare = this.state.modeGiven;
toSkip = this.state.owner ? 'O' : tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default.a.AccessMode.encode(tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default.a.AccessMode.diff('ASDO', this.state.modeGiven));
if (this.state.owner) {
toSkip = 'O';
} else {
toSkip = tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default.a.AccessMode.encode(tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default.a.AccessMode.diff('ASDO', this.state.modeGiven));
if (this.state.channel) {
toSkip += 'W';
}
}
titleEdit = formatMessage(messages.requested); titleEdit = formatMessage(messages.requested);
titleCompare = formatMessage(messages.granted); titleCompare = formatMessage(messages.granted);
break; break;
@@ -2262,13 +2274,13 @@ class InfoView extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
case 'user': case 'user':
{ {
let topic = this.props.tinode.getTopic(this.props.topic); const topic = this.props.tinode.getTopic(this.props.topic);
if (!topic) { if (!topic) {
return; return;
} }
var user = topic.subscriber(uid); const user = topic.subscriber(uid);
if (!user || !user.acs) { if (!user || !user.acs) {
return; return;
@@ -2575,13 +2587,13 @@ class InfoView extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
className: "hr" className: "hr"
})) : null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", { })) : null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
className: "panel-form-column" className: "panel-form-column"
}, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("a", { }, !this.state.channel ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("a", {
href: "#", href: "#",
className: "flat-button", className: "flat-button",
onClick: this.handleDeleteMessages onClick: this.handleDeleteMessages
}, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("i", { }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("i", {
className: "material-icons" className: "material-icons"
}, "delete_outline"), " \xA0", formatMessage(this.state.deleter ? messages.delete_messages : messages.clear_messages)), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("a", { }, "delete_outline"), " \xA0", formatMessage(this.state.deleter ? messages.delete_messages : messages.clear_messages)) : null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("a", {
href: "#", href: "#",
className: "red flat-button", className: "red flat-button",
onClick: this.handleLeave onClick: this.handleLeave
@@ -3035,7 +3047,8 @@ class MessagesView extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Componen
typingIndicator: false, typingIndicator: false,
scrollPosition: 0, scrollPosition: 0,
fetchingMessages: false, fetchingMessages: false,
peerMessagingDisabled: false peerMessagingDisabled: false,
channel: false
}; };
} else if (nextProps.topic != prevState.topic) { } else if (nextProps.topic != prevState.topic) {
const topic = nextProps.tinode.getTopic(nextProps.topic); const topic = nextProps.tinode.getTopic(nextProps.topic);
@@ -3094,13 +3107,18 @@ class MessagesView extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Componen
peerMessagingDisabled: false peerMessagingDisabled: false
}); });
} }
Object.assign(nextState, {
channel: topic.isChannel()
});
} else { } else {
Object.assign(nextState, { Object.assign(nextState, {
messages: [], messages: [],
onlineSubs: [], onlineSubs: [],
title: '', title: '',
avatar: null, avatar: null,
peerMessagingDisabled: false peerMessagingDisabled: false,
channel: false
}); });
} }
} }
@@ -3441,10 +3459,13 @@ class MessagesView extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Componen
handleShowContextMenuMessage(params, messageSpecificMenuItems) { handleShowContextMenuMessage(params, messageSpecificMenuItems) {
params.topicName = this.state.topic; params.topicName = this.state.topic;
const menuItems = messageSpecificMenuItems || []; const menuItems = messageSpecificMenuItems || [];
menuItems.push('message_delete');
const topic = this.props.tinode.getTopic(params.topicName); const topic = this.props.tinode.getTopic(params.topicName);
if (topic) { if (topic) {
if (!topic.isChannel()) {
menuItems.push('message_delete');
}
const acs = topic.getAccessMode(); const acs = topic.getAccessMode();
if (acs && acs.isDeleter()) { if (acs && acs.isDeleter()) {
@@ -3652,7 +3673,7 @@ class MessagesView extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Componen
received: deliveryStatus, received: deliveryStatus,
uploader: msg._uploader, uploader: msg._uploader,
viewportWidth: this.props.viewportWidth, viewportWidth: this.props.viewportWidth,
showContextMenu: this.handleShowContextMenuMessage, showContextMenu: this.state.channel ? false : this.handleShowContextMenuMessage,
onImagePreview: this.handleImagePostview, onImagePreview: this.handleImagePostview,
onFormResponse: this.handleFormResponse, onFormResponse: this.handleFormResponse,
onError: this.props.onError, onError: this.props.onError,
@@ -6589,7 +6610,7 @@ class ChatMessage extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component
}, content, attachments, this.props.timestamp ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_received_marker_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], { }, content, attachments, this.props.timestamp ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_received_marker_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
timestamp: this.props.timestamp, timestamp: this.props.timestamp,
received: this.props.received received: this.props.received
}) : null), this.props.deleted ? null : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("span", { }) : null), this.props.deleted || !this.props.showContextMenu ? null : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("span", {
className: "menuTrigger" className: "menuTrigger"
}, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("a", { }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("a", {
href: "#", href: "#",
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long