diff --git a/index.html b/index.html
index bf8e7b10..5792b857 100644
--- a/index.html
+++ b/index.html
@@ -300,18 +300,18 @@
/* BEGIN Context Menu: popup/dropdown menu */
// Function is used by context menu to set permissions.
- function topicPermissionSetter(mode, topicName, uid, errorHandler) {
- var topic = Tinode.getTopic(topicName);
+ function topicPermissionSetter(mode, params, errorHandler) {
+ var topic = Tinode.getTopic(params.topicName);
if (!topic) {
- console.log("Topic not found: " + topicName);
+ console.log("Topic not found: " + params.topicName);
return;
}
var am;
- if (uid) {
- var user = topic.subscriber(uid);
+ if (params.user) {
+ var user = topic.subscriber(params.user);
if (!user) {
- console.log("Subscriber not found: " + topicName + "[" + uid + "]");
+ console.log("Subscriber not found: " + params.topicName + "[" + params.user + "]");
return;
}
am = user.acs.updateGiven(mode).getGiven();
@@ -332,40 +332,71 @@
var ContextMenuItems = {
"topic_info": {title: "Info", handler: null},
- "messages_clear": {title: "Clear messages", handler: function(topicName) {
- var topic = Tinode.getTopic(topicName);
+ "messages_clear": {title: "Clear messages", handler: function(params, errorHandler) {
+ var topic = Tinode.getTopic(params.topicName);
if (!topic) {
- console.log("Topic not found: " + topicName);
+ console.log("Topic not found: " + params.topicName);
return;
}
topic.delMessagesAll(false).then(function(){
console.log("refresh message list");
+ }).catch(function(err) {
+ if (errorHandler) {
+ errorHandler(err.message, "err");
+ } else {
+ console.log(err);
+ }
+ });
+ }},
+ "message_delete": {title: "Delete", handler: function(params, errorHandler) {
+ var topic = Tinode.getTopic(params.topicName);
+ if (!topic) {
+ console.log("Topic not found: " + params.topicName);
+ return;
+ }
+ topic.delMessagesList([params.seq], false).catch(function(err) {
+ if (errorHandler) {
+ errorHandler(err.message, "err");
+ } else {
+ console.log(err);
+ }
});
}},
- "message_delete": {title: "Delete", handler: null},
"topic_unmute": {title: "Unmute", handler: topicPermissionSetter.bind(this, "+P")},
"topic_mute": {title: "Mute", handler: topicPermissionSetter.bind(this, "-P")},
"topic_unblock": {title: "Unblock", handler: topicPermissionSetter.bind(this, "+J")},
"topic_block": {title: "Block", handler: topicPermissionSetter.bind(this, "-J")},
- "topic_delete": {title: "Delete", handler: function(topicName) {
- var topic = Tinode.getTopic(topicName);
+ "topic_delete": {title: "Delete", handler: function(params, errorHandler) {
+ var topic = Tinode.getTopic(params.topicName);
if (!topic) {
- console.log("Topic not found: " + topicName);
+ console.log("Topic not found: " + params.topicName);
return;
}
- topic.delTopic();
+ topic.delTopic().catch(function(err) {
+ if (errorHandler) {
+ errorHandler(err.message, "err");
+ } else {
+ console.log(err);
+ }
+ });
}},
"permissions": {title: "Edit permissions", handler: null},
- "member_delete": {title: "Remove", handler: function(topicName, user) {
- var topic = Tinode.getTopic(topicName);
- if (!topic || !user) {
- console.log("Topic or user not found: '" + topicName + "', '" + user + "'");
+ "member_delete": {title: "Remove", handler: function(params, errorHandler) {
+ var topic = Tinode.getTopic(params.topicName);
+ if (!topic || !params.user) {
+ console.log("Topic or user not found: '" + params.topicName + "', '" + params.user + "'");
return;
}
- topic.delSubscription(user);
+ topic.delSubscription(params.user).catch(function(err) {
+ if (errorHandler) {
+ errorHandler(err.message, "err");
+ } else {
+ console.log(err);
+ }
+ });
}},
"member_mute": {title: "Mute", handler: topicPermissionSetter.bind(this, "-P")},
"member_unmute": {title: "Unmute", handler: topicPermissionSetter.bind(this, "+P")},
@@ -407,7 +438,7 @@
e.stopPropagation();
this.props.hide();
var item = this.props.items[e.currentTarget.dataset.id];
- item.handler(this.props.topic, this.props.user, this.props.onError);
+ item.handler(this.props.params, this.props.onError);
},
render: function() {
@@ -1382,7 +1413,7 @@
handleContextClick: function(e) {
e.preventDefault();
e.stopPropagation();
- this.props.showContextMenu(this.props.item, e.pageY, e.pageX);
+ this.props.showContextMenu({ topicName: this.props.item, y: e.pageY, x: e.pageX });
},
render: function() {
@@ -2266,7 +2297,7 @@
user.acs.isMuted() ? ContextMenuItems["member_unmute"] : ContextMenuItems["member_mute"],
user.acs.isJoiner() ? ContextMenuItems["member_block"] : ContextMenuItems["member_unblock"]
];
- this.props.showContextMenu(this.props.topic, x, y, item, menuItems);
+ this.props.showContextMenu({ topicName: this.props.topic, x: x, y: y, user: item }, menuItems);
},
render: function() {
@@ -2461,7 +2492,7 @@
handleContextClick: function(e) {
e.preventDefault();
e.stopPropagation();
- this.props.showContextMenu(this.props.seq, e.pageY, e.pageX);
+ this.props.showContextMenu({ seq: this.props.seq, y: e.pageY, x: e.pageX });
},
render: function() {
@@ -2804,11 +2835,12 @@
handleContextClick: function(e) {
e.preventDefault();
e.stopPropagation();
- this.props.showContextMenu(this.state.topic, e.pageY, e.pageX);
+ this.props.showContextMenu({ topicName: this.state.topic, y: e.pageY, x: e.pageX });
},
- handleMessageContextMenu: function(seq, y, x) {
- console.log("Message cklicked", seq, x, y);
+ handleShowContextMenuMessage: function(params) {
+ params.topicName = this.state.topic;
+ this.props.showContextMenu(params, [ContextMenuItems["message_delete"]]);
},
handleBackNavigation: function() {
@@ -2867,7 +2899,7 @@
userFrom={userFrom} userName={userName} userAvatar={userAvatar}
sequence={sequence} received={msgReceived}
viewportWidth={this.props.viewportWidth}
- showContextMenu={this.handleMessageContextMenu}
+ showContextMenu={this.handleShowContextMenuMessage}
onImagePreview={this.handleImagePreview} key={msg.seq} />
);
}
@@ -3173,7 +3205,7 @@
contextMenuVisible: false,
contextMenuBounds: null,
contextMenuClickAt: null,
- contextMenuTopic: '',
+ contextMenuParams: null,
contextMenuItems: [],
serverVersion: 'no connection',
contactsSearchQuery: '',
@@ -3544,13 +3576,12 @@
this.setState({dialogSelected: null});
},
- handleShowContextMenu: function(topicName, y, x, uid, menuItems) {
+ handleShowContextMenu: function(params, menuItems) {
this.setState({
contextMenuVisible: true,
- contextMenuClickAt: {x: x, y: y},
- contextMenuTopic: topicName,
- contextMenuUser: uid,
- contextMenuItems: menuItems || this.defaultTopicContextMenu(topicName),
+ contextMenuClickAt: {x: params.x, y: params.y},
+ contextMenuParams: params,
+ contextMenuItems: menuItems || this.defaultTopicContextMenu(params.topicName),
contextMenuBounds: ReactDOM.findDOMNode(this).getBoundingClientRect()
});
},
@@ -3580,8 +3611,7 @@
this.setState({
contextMenuVisible: false,
contextMenuClickAt: null,
- contextMenuTopic: null,
- contextMenuUser: null,
+ contextMenuParams: null,
contextMenuBounds: null
});
},
@@ -3625,8 +3655,7 @@
bounds={this.state.contextMenuBounds}
clickAt={this.state.contextMenuClickAt}
visible={this.state.contextMenuVisible}
- topic={this.state.contextMenuTopic}
- user={this.state.contextMenuUser}
+ params={this.state.contextMenuParams}
items={this.state.contextMenuItems}
hide={this.handleHideContextMenu}
onAction={this.handleContextMenuAction}