2020-12-10 20:59:00 +00:00
|
|
|
import QtQuick 2.14
|
2021-04-23 15:49:05 +00:00
|
|
|
import QtQuick.Shapes 1.13
|
|
|
|
import QtGraphicalEffects 1.13
|
2020-07-15 21:04:14 +00:00
|
|
|
import "../../../../../shared"
|
|
|
|
import "../../../../../imports"
|
|
|
|
|
2020-09-30 20:40:54 +00:00
|
|
|
Loader {
|
|
|
|
property int textFieldWidth: item ? item.textField.width : 0
|
2021-02-08 18:46:20 +00:00
|
|
|
property int textFieldImplicitWidth: 0
|
2020-12-10 20:59:00 +00:00
|
|
|
property int authorWidth: item ? item.authorMetrics.width : 0
|
|
|
|
|
2020-07-20 21:26:29 +00:00
|
|
|
property bool longReply: false
|
2020-09-22 14:30:49 +00:00
|
|
|
property color elementsColor: isCurrentUser ? Style.current.chatReplyCurrentUser : Style.current.secondaryText
|
2020-12-16 20:50:54 +00:00
|
|
|
property var container
|
feat: whitelist gifs (no url extension needed)
Fixes #1377.
Fixes #1479.
Two sites have been added to the whitelist: giphy.com and tenor.com.
`imageUrls` in its entirety has been removed and instead all links are being handle through the message `linkUrls`. This prevents double-handling of urls that may or may not be images.
The logic to automatically show links previews works like this:
1. If the setting "display chat images" is enabled, all links that *contain* ".png", ".jpg", ".jpeg", ".svg", ".gif" will be automatically shown. If the URL doesn't contain the extension, we are not downloading it. This was meant to be somewhat of a security compromise as we do not want to download each and every link posted in a message just to find out its true content type.
2. If the above setting is *disabled*, then we follow the whitelist settings for tenor and giphy. This allows us to preview gifs that do not have a file extension in their url.
feat: bump status-go to the commit that supports the new whitelist (https://github.com/status-im/status-go/pull/2094), and also lets us get link preview data from urls in the whitelist. NOTE: this commit was branched off status-go `develop`, so once it is merged, and we update this PR to the new commit, we will effectively be getting status-go develop changes. We *could* base that status-go PR off of master if it makes things easier.
fix: height on settings update issue
feat: move date/time of message below links
fix: layout issues when changing setting `neverAskAboutUnfurlingAgain`
feat: Add MessageBorder component to aid in showing rounded corners with different radius
2020-12-11 00:53:44 +00:00
|
|
|
property int chatHorizontalPadding
|
2020-07-20 21:26:29 +00:00
|
|
|
|
2021-04-23 15:49:05 +00:00
|
|
|
property int nameMargin: 6
|
|
|
|
|
2020-09-30 20:40:54 +00:00
|
|
|
id: root
|
2021-06-11 19:50:52 +00:00
|
|
|
active: responseTo !== "" && replyMessageIndex > -1 && !activityCenterMessage
|
2020-07-15 21:04:14 +00:00
|
|
|
|
2020-09-30 20:40:54 +00:00
|
|
|
sourceComponent: Component {
|
2021-02-08 18:46:20 +00:00
|
|
|
Item {
|
2020-09-30 20:40:54 +00:00
|
|
|
property alias textField: lblReplyMessage
|
2020-12-10 20:59:00 +00:00
|
|
|
property alias authorMetrics: txtAuthorMetrics
|
2020-07-17 19:44:25 +00:00
|
|
|
|
2020-09-30 20:40:54 +00:00
|
|
|
id: chatReply
|
2021-02-08 18:46:20 +00:00
|
|
|
// childrenRect.height shows a binding loop for some reason, so we use heights instead
|
2021-04-23 15:49:05 +00:00
|
|
|
height: {
|
2021-07-02 16:13:53 +00:00
|
|
|
const h = userImage.height + 4
|
2021-04-23 15:49:05 +00:00
|
|
|
if (repliedMessageType === Constants.imageType) {
|
|
|
|
return h + imgReplyImage.height
|
|
|
|
}
|
|
|
|
if (repliedMessageType === Constants.stickerType) {
|
|
|
|
return h + stickerLoader.height
|
|
|
|
}
|
|
|
|
return h + lblReplyMessage.height
|
|
|
|
}
|
|
|
|
width: parent.width
|
|
|
|
clip: true
|
2020-09-30 20:40:54 +00:00
|
|
|
|
2020-12-10 20:59:00 +00:00
|
|
|
TextMetrics {
|
|
|
|
id: txtAuthorMetrics
|
|
|
|
font: lblReplyAuthor.font
|
|
|
|
text: lblReplyAuthor.text
|
|
|
|
}
|
|
|
|
|
2021-04-23 15:49:05 +00:00
|
|
|
Shape {
|
|
|
|
id: replyCorner
|
|
|
|
anchors.left: parent.left
|
|
|
|
anchors.leftMargin: 20 - 1
|
|
|
|
anchors.top: parent.top
|
|
|
|
anchors.topMargin: Style.current.smallPadding
|
|
|
|
width: 20
|
|
|
|
height: parent.height - anchors.topMargin
|
|
|
|
asynchronous: true
|
|
|
|
antialiasing: true
|
|
|
|
|
|
|
|
ShapePath {
|
|
|
|
id: capTest
|
|
|
|
|
|
|
|
strokeColor: Utils.setColorAlpha(root.elementsColor, 0.4)
|
|
|
|
strokeWidth: 3
|
|
|
|
fillColor: "transparent"
|
|
|
|
|
|
|
|
capStyle: ShapePath.RoundCap
|
|
|
|
joinStyle: ShapePath.RoundJoin
|
|
|
|
|
|
|
|
startX: 20
|
|
|
|
startY: 0
|
|
|
|
PathLine { x: 10; y: 0 }
|
|
|
|
PathArc {
|
|
|
|
x: 0; y: 10
|
|
|
|
radiusX: 13
|
|
|
|
radiusY: 13
|
|
|
|
direction: PathArc.Counterclockwise
|
|
|
|
}
|
|
|
|
PathLine { x: 0; y: chatReply.height - replyCorner.anchors.topMargin }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
UserImage {
|
|
|
|
id: userImage
|
|
|
|
imageHeight: 20
|
|
|
|
imageWidth: 20
|
|
|
|
active: true
|
|
|
|
anchors.left: replyCorner.right
|
|
|
|
anchors.leftMargin: Style.current.halfPadding
|
|
|
|
identiconImageSource: repliedMessageUserIdenticon
|
|
|
|
isReplyImage: true
|
|
|
|
profileImage: repliedMessageUserImage
|
|
|
|
}
|
|
|
|
|
2021-06-29 14:49:32 +00:00
|
|
|
Connections {
|
|
|
|
target: chatsModel.messageView
|
|
|
|
onMessageEdited: {
|
|
|
|
if (responseTo === editedMessageId){
|
|
|
|
lblReplyMessage.text = Utils.getReplyMessageStyle(Emoji.parse(Utils.linkifyAndXSS(editedMessageContent + Constants.editLabel), Emoji.size.small), isCurrentUser, appSettings.useCompactMode)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-09-30 20:40:54 +00:00
|
|
|
StyledTextEdit {
|
|
|
|
id: lblReplyAuthor
|
2021-04-23 15:49:05 +00:00
|
|
|
text: repliedMessageAuthor
|
2020-09-30 20:40:54 +00:00
|
|
|
color: root.elementsColor
|
|
|
|
readOnly: true
|
2021-04-23 15:49:05 +00:00
|
|
|
font.pixelSize: Style.current.secondaryTextFontSize
|
2020-09-30 20:40:54 +00:00
|
|
|
selectByMouse: true
|
2021-04-23 15:49:05 +00:00
|
|
|
font.weight: Font.Medium
|
|
|
|
anchors.verticalCenter: userImage.verticalCenter
|
|
|
|
anchors.left: userImage.right
|
|
|
|
anchors.leftMargin: 5
|
2020-09-30 20:40:54 +00:00
|
|
|
}
|
2020-07-15 21:04:14 +00:00
|
|
|
|
2020-09-30 20:40:54 +00:00
|
|
|
ChatImage {
|
|
|
|
id: imgReplyImage
|
2021-04-23 15:49:05 +00:00
|
|
|
visible: repliedMessageType === Constants.imageType
|
2020-09-30 20:40:54 +00:00
|
|
|
imageWidth: 50
|
|
|
|
imageSource: repliedMessageImage
|
|
|
|
anchors.top: lblReplyAuthor.bottom
|
2021-04-23 15:49:05 +00:00
|
|
|
anchors.topMargin: nameMargin
|
|
|
|
anchors.left: userImage.left
|
2020-09-30 20:40:54 +00:00
|
|
|
chatHorizontalPadding: 0
|
2020-12-16 20:50:54 +00:00
|
|
|
container: root.container
|
2021-04-23 15:49:05 +00:00
|
|
|
allCornersRounded: true
|
|
|
|
}
|
|
|
|
|
|
|
|
Loader {
|
|
|
|
id: stickerLoader
|
|
|
|
active: repliedMessageType === Constants.stickerType
|
|
|
|
anchors.top: lblReplyAuthor.bottom
|
|
|
|
anchors.topMargin: nameMargin
|
|
|
|
anchors.left: userImage.left
|
|
|
|
sourceComponent: Component {
|
|
|
|
Sticker {
|
|
|
|
id: stickerId
|
|
|
|
imageHeight: 56
|
|
|
|
imageWidth: 56
|
2021-06-21 19:35:32 +00:00
|
|
|
stickerData: chatsModel.messageView.messageList.getMessageData(replyMessageIndex, "sticker")
|
2021-04-23 15:49:05 +00:00
|
|
|
contentType: repliedMessageType
|
|
|
|
container: root.container
|
|
|
|
}
|
|
|
|
}
|
2020-09-30 20:40:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
StyledTextEdit {
|
|
|
|
id: lblReplyMessage
|
2021-04-23 15:49:05 +00:00
|
|
|
visible: repliedMessageType !== Constants.imageType && repliedMessageType !== Constants.stickerType
|
2021-02-08 18:46:20 +00:00
|
|
|
Component.onCompleted: textFieldImplicitWidth = implicitWidth
|
2020-09-30 20:40:54 +00:00
|
|
|
anchors.top: lblReplyAuthor.bottom
|
2021-04-23 15:49:05 +00:00
|
|
|
anchors.topMargin: nameMargin
|
2021-06-29 14:49:32 +00:00
|
|
|
text: {
|
|
|
|
if (repliedMessageIsEdited){
|
|
|
|
let index = repliedMessageContent.length - 4
|
|
|
|
return Utils.getReplyMessageStyle(Emoji.parse(Utils.linkifyAndXSS(repliedMessageContent.slice(0, index) + Constants.editLabel + repliedMessageContent.slice(index)), Emoji.size.small), isCurrentUser, appSettings.useCompactMode)
|
|
|
|
} else {
|
|
|
|
return Utils.getReplyMessageStyle(Emoji.parse(Utils.linkifyAndXSS(repliedMessageContent), Emoji.size.small), isCurrentUser, appSettings.useCompactMode)
|
|
|
|
}
|
|
|
|
}
|
2020-09-30 20:40:54 +00:00
|
|
|
textFormat: Text.RichText
|
|
|
|
color: root.elementsColor
|
|
|
|
readOnly: true
|
|
|
|
selectByMouse: true
|
2021-08-06 12:21:51 +00:00
|
|
|
font.pixelSize: Style.current.additionalTextSize
|
|
|
|
font.weight: Font.Medium
|
2021-04-23 15:49:05 +00:00
|
|
|
anchors.left: userImage.left
|
2021-02-08 18:46:20 +00:00
|
|
|
width: root.longReply ? parent.width : implicitWidth
|
2021-07-02 16:13:53 +00:00
|
|
|
height: 20
|
2021-04-23 15:49:05 +00:00
|
|
|
clip: true
|
2020-09-30 20:40:54 +00:00
|
|
|
z: 51
|
|
|
|
}
|
|
|
|
}
|
2020-07-15 21:04:14 +00:00
|
|
|
}
|
|
|
|
}
|
2020-09-30 20:40:54 +00:00
|
|
|
|