feat: limit to 3 pins and show how to unpin

This commit is contained in:
Jonathan Rainville 2021-07-26 13:27:09 -04:00 committed by Iuri Matias
parent 50c6e0b0a0
commit a99eccee00
3 changed files with 146 additions and 54 deletions

View File

@ -32,6 +32,11 @@ PopupMenu {
property var emojiReactionsReactedByUser: [] property var emojiReactionsReactedByUser: []
property var onClickEdit: function(){} property var onClickEdit: function(){}
property var reactionModel property var reactionModel
property bool canPin: {
const nbPinnedMessages = chatsModel.messageView.pinnedMessagesList.count
return nbPinnedMessages < Constants.maxNumberOfPins
}
signal closeParentPopup signal closeParentPopup
@ -141,16 +146,27 @@ PopupMenu {
Action { Action {
id: pinAction id: pinAction
text: {
if (pinnedMessage) {
//% "Unpin" //% "Unpin"
text: pinnedMessage ? qsTrId("unpin") : return qsTrId("unpin")
}
//% "Pin" //% "Pin"
qsTrId("pin") return qsTrId("pin")
}
onTriggered: { onTriggered: {
if (pinnedMessage) { if (pinnedMessage) {
chatsModel.messageView.unPinMessage(messageId, chatsModel.channelView.activeChannel.id) chatsModel.messageView.unPinMessage(messageId, chatsModel.channelView.activeChannel.id)
return return
} }
if (!canPin) {
// Open pin modal so that the user can unpin one
openPopup(pinnedMessagesPopupComponent, {messageToPin: messageId})
return
}
chatsModel.messageView.pinMessage(messageId, chatsModel.channelView.activeChannel.id) chatsModel.messageView.pinMessage(messageId, chatsModel.channelView.activeChannel.id)
messageContextMenu.close() messageContextMenu.close()
} }

View File

@ -1,4 +1,5 @@
import QtQuick 2.13 import QtQuick 2.13
import QtQuick.Controls 2.3
import "../../../../imports" import "../../../../imports"
import "../../../../shared" import "../../../../shared"
import "../../../../shared/status" import "../../../../shared/status"
@ -6,6 +7,19 @@ import "../data"
import "../ChatColumn" import "../ChatColumn"
ModalPopup { ModalPopup {
property bool userCanPin: {
switch (chatsModel.channelView.activeChannel.chatType) {
case Constants.chatTypePublic: return false
case Constants.chatTypeStatusUpdate: return false
case Constants.chatTypeOneToOne: return true
case Constants.chatTypePrivateGroupChat: return chatsModel.channelView.activeChannel.isAdmin(profileModel.profile.pubKey)
case Constants.chatTypeCommunity: return chatsModel.communities.activeCommunity.admin
default: return false
}
}
property string messageToPin
property string messageToUnpin
id: popup id: popup
header: Item { header: Item {
@ -14,8 +28,9 @@ ModalPopup {
StyledText { StyledText {
id: title id: title
text: !!messageToPin ? qsTr("Pin limit reached") :
//% "Pinned messages" //% "Pinned messages"
text: qsTrId("pinned-messages") qsTrId("pinned-messages")
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
font.bold: true font.bold: true
@ -26,10 +41,16 @@ ModalPopup {
property int nbMessages: pinnedMessageListView.count property int nbMessages: pinnedMessageListView.count
id: nbPinnedMessages id: nbPinnedMessages
text: {
if (!!messageToPin) {
return qsTr("Unpin a previous message first")
}
//% "%1 messages" //% "%1 messages"
text: nbMessages > 1 ? qsTrId("-1-messages").arg(nbMessages) : return nbMessages > 1 ? qsTrId("-1-messages").arg(nbMessages) :
//% "%1 message" //% "%1 message"
qsTrId("-1-message").arg(nbMessages) qsTrId("-1-message").arg(nbMessages)
}
anchors.left: parent.left anchors.left: parent.left
anchors.top: title.bottom anchors.top: title.bottom
anchors.topMargin: 2 anchors.topMargin: 2
@ -58,6 +79,10 @@ ModalPopup {
color: Style.current.secondaryText color: Style.current.secondaryText
} }
ButtonGroup {
id: pinButtonGroup
}
ListView { ListView {
id: pinnedMessageListView id: pinnedMessageListView
model: chatsModel.messageView.pinnedMessagesList model: chatsModel.messageView.pinnedMessagesList
@ -74,10 +99,14 @@ ModalPopup {
function closePopup() { function closePopup() {
popup.close() popup.close()
} }
delegate: Item {
width: parent.width
height: messageItem.height
delegate: Message { Message {
id: messageItem id: messageItem
property var view: ListView.view property var view: ListView.view
fromAuthor: model.fromAuthor fromAuthor: model.fromAuthor
chatId: model.chatId chatId: model.chatId
userName: model.userName userName: model.userName
@ -102,7 +131,7 @@ ModalPopup {
timeout: model.timeout timeout: model.timeout
pinnedMessage: true pinnedMessage: true
pinnedBy: model.pinnedBy pinnedBy: model.pinnedBy
forceHoverHandler: true forceHoverHandler: !messageToPin
activityCenterMessage: false activityCenterMessage: false
isEdited: model.isEdited isEdited: model.isEdited
showEdit: false showEdit: false
@ -116,11 +145,39 @@ ModalPopup {
} }
} }
} }
MouseArea {
anchors.fill: parent
enabled: !!messageToPin
cursorShape: Qt.PointingHandCursor
z: 55
onClicked: radio.toggle()
}
StatusRadioButton {
id: radio
visible: !!messageToPin
anchors.right: parent.right
anchors.rightMargin: 18
anchors.verticalCenter: parent.verticalCenter
ButtonGroup.group: pinButtonGroup
function toggle() {
radio.checked = !radio.checked
if (radio.checked) {
messageToUnpin = model.messageId
}
}
}
}
} }
} }
footer: StatusRoundButton { footer: Item {
width: parent.width
height: btnBack.height
StatusRoundButton {
id: btnBack id: btnBack
anchors.left: parent.left anchors.left: parent.left
icon.name: "arrow-right" icon.name: "arrow-right"
@ -129,4 +186,21 @@ ModalPopup {
rotation: 180 rotation: 180
onClicked: popup.close() onClicked: popup.close()
} }
StatusButton {
id: btnUnpin
visible: !!messageToPin
enabled: !!messageToUnpin
text: qsTr("Unpin")
type: "warn"
anchors.right: parent.right
onClicked: {
const chatId = chatsModel.channelView.activeChannel.id
chatsModel.messageView.unPinMessage(messageToUnpin, chatId)
chatsModel.messageView.pinMessage(messageToPin, chatId)
messageToUnpin = messageToPin = ""
popup.close()
}
}
}
} }

View File

@ -147,6 +147,8 @@ QtObject {
readonly property int maxUploadFiles: 5 readonly property int maxUploadFiles: 5
readonly property double maxUploadFilesizeMB: 0.5 readonly property double maxUploadFilesizeMB: 0.5
readonly property int maxNumberOfPins: 3
readonly property var acceptedImageExtensions: [".png", ".jpg", ".jpeg", ".svg", ".gif"] readonly property var acceptedImageExtensions: [".png", ".jpg", ".jpeg", ".svg", ".gif"]
readonly property var acceptedDragNDropImageExtensions: [".png", ".jpg", ".jpeg", ".heif", "tif", ".tiff"] readonly property var acceptedDragNDropImageExtensions: [".png", ".jpg", ".jpeg", ".heif", "tif", ".tiff"]