fix channel permissions & disable deleting messages
This commit is contained in:
+23
-9
@@ -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> {
|
<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> {
|
||||||
}
|
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> {formatMessage(messages.leave_chat)}
|
<i className="material-icons">exit_to_app</i> {formatMessage(messages.leave_chat)}
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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
@@ -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: "#",
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user