status-desktop/ui/imports/shared/views/chat/MessageContextMenuView.qml

160 lines
5.1 KiB
QML

import QtQuick 2.15
import QtQuick.Controls 2.15
import StatusQ 0.1
import StatusQ.Core.Theme 0.1
import StatusQ.Popups 0.1
import StatusQ.Components 0.1
import utils 1.0
import shared.controls.chat 1.0
StatusMenu {
id: root
// expected roles: emojiId:int, filename:string, didIReactWithThisEmoji:bool
property var reactionModel
property string myPublicKey: ""
property bool amIChatAdmin: false
property bool disabledForChat: false
property bool forceEnableEmojiReactions: false
property int chatType: Constants.chatType.unknown
property string messageId: ""
property string unparsedText: ""
property string messageSenderId: ""
property int messageContentType: Constants.messageContentType.unknownContentType
property bool pinMessageAllowedForMembers: false
property bool isDebugEnabled: false
property bool editRestricted: false
property bool pinnedMessage: false
property bool canPin: false
readonly property bool isMyMessage: {
return root.messageSenderId !== "" && root.messageSenderId === root.myPublicKey;
}
signal pinMessage()
signal unpinMessage()
signal pinnedMessagesLimitReached()
signal showReplyArea(string messageSenderId)
signal toggleReaction(int emojiId)
signal deleteMessage()
signal editClicked()
signal markMessageAsUnread()
signal copyToClipboard(string text)
MessageReactionsRow {
id: emojiRow
visible: !root.disabledForChat || root.forceEnableEmojiReactions
reactionsModel: root.reactionModel
bottomPadding: Theme.halfPadding
onToggleReaction: {
root.toggleReaction(emojiId)
root.close()
}
}
StatusMenuSeparator {
visible: emojiRow.visible && !root.disabledForChat
}
StatusAction {
id: replyToMenuItem
text: qsTr("Reply to")
icon.name: "chat"
onTriggered: root.showReplyArea(root.messageSenderId)
enabled: !root.disabledForChat
}
StatusAction {
id: editMessageAction
text: qsTr("Edit message")
onTriggered: editClicked()
icon.name: "edit"
enabled: root.isMyMessage &&
!root.editRestricted &&
!root.disabledForChat
}
StatusAction {
id: copyMessageMenuItem
text: qsTr("Copy message")
icon.name: "copy"
onTriggered: root.copyToClipboard(root.unparsedText)
enabled: root.messageContentType === Constants.messageContentType.messageType && replyToMenuItem.enabled
}
StatusAction {
id: copyMessageIdAction
text: qsTr("Copy Message Id")
icon.name: "copy"
enabled: root.isDebugEnabled && replyToMenuItem.enabled
onTriggered: root.copyToClipboard(root.messageId)
}
StatusAction {
id: pinAction
text: root.pinnedMessage ? qsTr("Unpin") : qsTr("Pin")
icon.name: root.pinnedMessage ? "unpin" : "pin"
onTriggered: {
if (root.pinnedMessage) return root.unpinMessage()
if (!root.canPin) return root.pinnedMessagesLimitReached()
root.pinMessage()
}
enabled: {
if (root.disabledForChat)
return false
switch (root.chatType) {
case Constants.chatType.profile:
return false
case Constants.chatType.oneToOne:
return true
case Constants.chatType.privateGroupChat:
return root.amIChatAdmin
case Constants.chatType.communityChat:
return root.amIChatAdmin || root.pinMessageAllowedForMembers
default:
return false
}
}
}
StatusAction {
id: markMessageAsUnreadAction
text: qsTr("Mark as unread")
icon.name: "hide"
enabled: !root.disabledForChat
onTriggered: root.markMessageAsUnread()
}
StatusMenuSeparator {
visible: deleteMessageAction.enabled &&
(replyToMenuItem.enabled ||
copyMessageMenuItem.enabled ||
copyMessageIdAction.enabled ||
editMessageAction.enabled ||
pinAction.enabled ||
markMessageAsUnreadAction.enabled)
}
StatusAction {
id: deleteMessageAction
enabled: (root.isMyMessage || root.amIChatAdmin) &&
!root.disabledForChat &&
(root.messageContentType === Constants.messageContentType.messageType ||
root.messageContentType === Constants.messageContentType.bridgeMessageType ||
root.messageContentType === Constants.messageContentType.stickerType ||
root.messageContentType === Constants.messageContentType.emojiType ||
root.messageContentType === Constants.messageContentType.imageType ||
root.messageContentType === Constants.messageContentType.audioType)
text: qsTr("Delete message")
icon.name: "delete"
type: StatusAction.Type.Danger
onTriggered: root.deleteMessage()
}
}