Merge pull request #43 from tinode/retry-context-menu
Add Retry option in context menu for failed messages.
This commit is contained in:
@@ -101,6 +101,7 @@
|
|||||||
"menu_item_clear_messages_for_all": "Clear for All",
|
"menu_item_clear_messages_for_all": "Clear for All",
|
||||||
"menu_item_delete": "Delete",
|
"menu_item_delete": "Delete",
|
||||||
"menu_item_delete_for_all": "Delete for All",
|
"menu_item_delete_for_all": "Delete for All",
|
||||||
|
"menu_item_send_retry": "Retry",
|
||||||
"menu_item_mute": "Mute",
|
"menu_item_mute": "Mute",
|
||||||
"menu_item_unmute": "Unmute",
|
"menu_item_unmute": "Unmute",
|
||||||
"menu_item_delete_topic": "Delete",
|
"menu_item_delete_topic": "Delete",
|
||||||
|
|||||||
@@ -93,6 +93,7 @@
|
|||||||
"menu_item_clear_messages_for_all": "Удалить для всех",
|
"menu_item_clear_messages_for_all": "Удалить для всех",
|
||||||
"menu_item_delete": "Удалить",
|
"menu_item_delete": "Удалить",
|
||||||
"menu_item_delete_for_all": "Удалить для всех",
|
"menu_item_delete_for_all": "Удалить для всех",
|
||||||
|
"menu_item_send_retry": "Отправить заново",
|
||||||
"menu_item_mute": "Не уведомлять",
|
"menu_item_mute": "Не уведомлять",
|
||||||
"menu_item_unmute": "Уведомлять",
|
"menu_item_unmute": "Уведомлять",
|
||||||
"menu_item_delete_topic": "Удалить чат",
|
"menu_item_delete_topic": "Удалить чат",
|
||||||
|
|||||||
+2
-1
@@ -151,5 +151,6 @@
|
|||||||
"topic_block_warning": ":!![MISSING]!!:Are you sure you want to block this conversation?",
|
"topic_block_warning": ":!![MISSING]!!:Are you sure you want to block this conversation?",
|
||||||
"search_no_results": ":!![MISSING]!!:Search returned no results",
|
"search_no_results": ":!![MISSING]!!:Search returned no results",
|
||||||
"deleted_content": "内容已删除",
|
"deleted_content": "内容已删除",
|
||||||
"image_caption_prompt": "图片标题"
|
"image_caption_prompt": "图片标题",
|
||||||
|
"menu_item_send_retry": ":!![MISSING]!!:Retry"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -102,6 +102,7 @@
|
|||||||
"menu_item_clear_messages_for_all": "Clear for All",
|
"menu_item_clear_messages_for_all": "Clear for All",
|
||||||
"menu_item_delete": "Delete",
|
"menu_item_delete": "Delete",
|
||||||
"menu_item_delete_for_all": "Delete for All",
|
"menu_item_delete_for_all": "Delete for All",
|
||||||
|
"menu_item_send_retry": "Retry",
|
||||||
"menu_item_mute": "Mute",
|
"menu_item_mute": "Mute",
|
||||||
"menu_item_unmute": "Unmute",
|
"menu_item_unmute": "Unmute",
|
||||||
"menu_item_delete_topic": "Delete",
|
"menu_item_delete_topic": "Delete",
|
||||||
@@ -249,6 +250,7 @@
|
|||||||
"menu_item_clear_messages_for_all": "Удалить для всех",
|
"menu_item_clear_messages_for_all": "Удалить для всех",
|
||||||
"menu_item_delete": "Удалить",
|
"menu_item_delete": "Удалить",
|
||||||
"menu_item_delete_for_all": "Удалить для всех",
|
"menu_item_delete_for_all": "Удалить для всех",
|
||||||
|
"menu_item_send_retry": "Отправить заново",
|
||||||
"menu_item_mute": "Не уведомлять",
|
"menu_item_mute": "Не уведомлять",
|
||||||
"menu_item_unmute": "Уведомлять",
|
"menu_item_unmute": "Уведомлять",
|
||||||
"menu_item_delete_topic": "Удалить чат",
|
"menu_item_delete_topic": "Удалить чат",
|
||||||
|
|||||||
@@ -482,9 +482,10 @@ class MessagesView extends React.Component {
|
|||||||
this.props.showContextMenu({ topicName: this.state.topic, y: e.pageY, x: e.pageX });
|
this.props.showContextMenu({ topicName: this.state.topic, y: e.pageY, x: e.pageX });
|
||||||
}
|
}
|
||||||
|
|
||||||
handleShowContextMenuMessage(params) {
|
handleShowContextMenuMessage(params, messageSpecificMenuItems) {
|
||||||
params.topicName = this.state.topic;
|
params.topicName = this.state.topic;
|
||||||
const menuItems = ['message_delete'];
|
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) {
|
||||||
const acs = topic.getAccessMode();
|
const acs = topic.getAccessMode();
|
||||||
@@ -516,7 +517,7 @@ class MessagesView extends React.Component {
|
|||||||
// Too large to send inband - uploading out of band and sending as a link.
|
// Too large to send inband - uploading out of band and sending as a link.
|
||||||
const uploader = this.props.tinode.getLargeFileHelper();
|
const uploader = this.props.tinode.getLargeFileHelper();
|
||||||
if (!uploader) {
|
if (!uploader) {
|
||||||
this.props.onError(formatMessage(messages.cannot_initiate_upload));
|
this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const uploadCompletionPromise = uploader.upload(file);
|
const uploadCompletionPromise = uploader.upload(file);
|
||||||
@@ -537,7 +538,7 @@ class MessagesView extends React.Component {
|
|||||||
handleAttachFile(file) {
|
handleAttachFile(file) {
|
||||||
if (file.size > MAX_EXTERN_ATTACHMENT_SIZE) {
|
if (file.size > MAX_EXTERN_ATTACHMENT_SIZE) {
|
||||||
// Too large.
|
// Too large.
|
||||||
this.props.onError(formatMessage(messages.file_attachment_too_large,
|
this.props.onError(this.props.intl.formatMessage(messages.file_attachment_too_large,
|
||||||
{size: bytesToHumanSize(file.size), limit: bytesToHumanSize(MAX_EXTERN_ATTACHMENT_SIZE)}), 'err');
|
{size: bytesToHumanSize(file.size), limit: bytesToHumanSize(MAX_EXTERN_ATTACHMENT_SIZE)}), 'err');
|
||||||
} else {
|
} else {
|
||||||
this.setState({ docPreview: {
|
this.setState({ docPreview: {
|
||||||
|
|||||||
@@ -58,7 +58,9 @@ export default class ChatMessage extends React.Component {
|
|||||||
handleContextClick(e) {
|
handleContextClick(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
this.props.showContextMenu({ seq: this.props.seq, y: e.pageY, x: e.pageX });
|
const menuItems = this.props.received == Tinode.MESSAGE_STATUS_FAILED ? ['menu_item_send_retry'] : [];
|
||||||
|
this.props.showContextMenu({ seq: this.props.seq, content: this.props.content,
|
||||||
|
y: e.pageY, x: e.pageX }, menuItems);
|
||||||
}
|
}
|
||||||
|
|
||||||
handleProgress(ratio) {
|
handleProgress(ratio) {
|
||||||
|
|||||||
@@ -32,6 +32,11 @@ const messages = defineMessages({
|
|||||||
defaultMessage: 'Delete for All',
|
defaultMessage: 'Delete for All',
|
||||||
description: 'Delete selected message(s) for all members'
|
description: 'Delete selected message(s) for all members'
|
||||||
},
|
},
|
||||||
|
send_retry: {
|
||||||
|
id: 'menu_item_send_retry',
|
||||||
|
defaultMessage: 'Retry',
|
||||||
|
description: 'Retry sending message'
|
||||||
|
},
|
||||||
mute: {
|
mute: {
|
||||||
id: 'menu_item_mute',
|
id: 'menu_item_mute',
|
||||||
defaultMessage: 'Mute',
|
defaultMessage: 'Mute',
|
||||||
@@ -139,6 +144,13 @@ class ContextMenu extends React.Component {
|
|||||||
return this.deleteMessages(false, true, params, errorHandler);
|
return this.deleteMessages(false, true, params, errorHandler);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
'menu_item_send_retry': {
|
||||||
|
id: 'menu_item_send_retry',
|
||||||
|
title: formatMessage(messages.send_retry),
|
||||||
|
handler: (params, errorHandler) => {
|
||||||
|
return this.retryMessage(params, errorHandler);
|
||||||
|
}
|
||||||
|
},
|
||||||
'topic_unmute': {
|
'topic_unmute': {
|
||||||
id: 'topic_unmute',
|
id: 'topic_unmute',
|
||||||
title: formatMessage(messages.unmute),
|
title: formatMessage(messages.unmute),
|
||||||
@@ -331,6 +343,21 @@ class ContextMenu extends React.Component {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Retries sending failed message.
|
||||||
|
retryMessage(params, errorHandler) {
|
||||||
|
const topic = this.props.tinode.getTopic(params.topicName);
|
||||||
|
// Remove the existing message entry.
|
||||||
|
if (!topic || !topic.flushMessage(params.seq)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const msg = topic.createMessage(params.content, false);
|
||||||
|
return topic.publishDraft(msg).catch((err) => {
|
||||||
|
if (errorHandler) {
|
||||||
|
errorHandler(err.message, 'err');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Function is used by context menu to set permissions.
|
// Function is used by context menu to set permissions.
|
||||||
topicPermissionSetter(mode, params, errorHandler) {
|
topicPermissionSetter(mode, params, errorHandler) {
|
||||||
const topic = this.props.tinode.getTopic(params.topicName);
|
const topic = this.props.tinode.getTopic(params.topicName);
|
||||||
|
|||||||
+36
-6
File diff suppressed because one or more lines are too long
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
+82
-40
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