adding pinned messages (wip)

This commit is contained in:
or-else
2023-03-22 17:50:33 -07:00
parent 9640c604b9
commit 11fe81fdf1
27 changed files with 365 additions and 53 deletions
+19 -14
View File
@@ -93,23 +93,28 @@ class BaseChatMessage extends React.PureComponent {
if (this.props.received == Tinode.MESSAGE_STATUS_FAILED) {
menuItems.push('menu_item_send_retry');
}
if (this.props.userIsWriter && this.props.received > Tinode.MESSAGE_STATUS_FATAL) {
menuItems.push('menu_item_reply');
if (!this.props.response) {
let immutable = false;
Drafty.entities(this.props.content, (_0, _1, tp) => {
immutable = ['AU', 'EX', 'FM', 'IM', 'VC', 'VD'].includes(tp);
return immutable;
});
if (!immutable) {
Drafty.styles(this.props.content, tp => {
immutable = ['QQ'].includes(tp);
if (this.props.received > Tinode.MESSAGE_STATUS_FATAL) {
if (this.props.userIsWriter) {
menuItems.push('menu_item_reply');
if (!this.props.response) {
let immutable = false;
Drafty.entities(this.props.content, (_0, _1, tp) => {
immutable = ['AU', 'EX', 'FM', 'IM', 'VC', 'VD'].includes(tp);
return immutable;
});
if (!immutable) {
Drafty.styles(this.props.content, tp => {
immutable = ['QQ'].includes(tp);
return immutable;
});
}
if (!immutable) {
menuItems.push('menu_item_edit');
}
}
if (!immutable) {
menuItems.push('menu_item_edit');
}
}
if (this.props.userIsAdmin) {
menuItems.push('menu_item_pin');
}
}
menuItems.push('menu_item_forward');
+55
View File
@@ -116,6 +116,16 @@ const messages = defineMessages({
defaultMessage: 'Are you sure you want to clear all messages? It cannot be undone.',
description: 'Alert dialog warning when deleting all messages.'
},
pin_message: {
id: 'pin_message',
defaultMessage: 'Pin',
description: 'Menu item [Pin] for pinning message to the top.'
},
unpin_message: {
id: 'unpin_message',
defaultMessage: 'Unpin',
description: 'Menu item [Unpin] for un-pinning the message.'
},
});
class ContextMenu extends React.Component {
@@ -205,6 +215,20 @@ class ContextMenu extends React.Component {
return this.editMessage(params, errorHandler);
}
},
'menu_item_pin': {
id: 'menu_item_pin',
title: formatMessage(messages.pin_message),
handler: (params, errorHandler) => {
return this.pinMessage(true, params, errorHandler);
}
},
'menu_item_unpin': {
id: 'menu_item_unpin',
title: formatMessage(messages.unpin_message),
handler: (params, errorHandler) => {
return this.pinMessage(false, params, errorHandler);
}
},
'topic_unmute': {
id: 'topic_unmute',
title: formatMessage(messages.unmute),
@@ -428,6 +452,37 @@ class ContextMenu extends React.Component {
});
}
// Pin or unpin the message.
pinMessage(pin, params, errorHandler) {
const topic = this.props.tinode.getTopic(params.topicName);
if (!topic) {
return;
}
let pinned = topic.aux('pins');
console.log("topic.aux[pins]=", pinned);
if (!Array.isArray(pinned)) {
pinned = [];
}
let changed = false;
if (pin) {
if (!pinned.includes(params.seq)) {
changed = true;
pinned.push(params.seq);
}
} else {
if (pinned.includes(params.seq)) {
changed = true;
pinned = pinned.filter(seq => seq != params.seq)
}
}
if (changed) {
console.log("sending pins=", pinned);
topic.setMeta({aux: {pins: pinned}})
.catch(err => errorHandler ? errorHandler(err.message, 'err') : null);
}
}
// Function is used by context menu to set permissions.
topicPermissionSetter(mode, params, errorHandler) {
const topic = this.props.tinode.getTopic(params.topicName);