2020-11-18 18:55:57 +00:00
|
|
|
import QtQuick 2.13
|
2020-07-15 21:04:14 +00:00
|
|
|
import "../../../../../shared"
|
|
|
|
import "../../../../../imports"
|
2020-11-18 20:07:23 +00:00
|
|
|
import QtGraphicalEffects 1.0
|
2020-07-15 21:04:14 +00:00
|
|
|
|
2020-09-25 19:44:40 +00:00
|
|
|
Item {
|
|
|
|
property bool longChatText: true
|
|
|
|
property bool veryLongChatText: chatsModel.plainText(message).length >
|
2021-02-10 20:41:00 +00:00
|
|
|
(appSettings.useCompactMode ? Constants.limitLongChatTextCompactMode : Constants.limitLongChatText)
|
2020-09-25 19:44:40 +00:00
|
|
|
property bool readMore: false
|
|
|
|
property alias textField: chatText
|
|
|
|
|
|
|
|
id: root
|
2020-07-15 21:04:14 +00:00
|
|
|
visible: contentType == Constants.messageType || isEmoji
|
2020-12-15 18:56:02 +00:00
|
|
|
z: 51
|
2020-11-18 20:07:23 +00:00
|
|
|
|
2021-02-01 18:40:55 +00:00
|
|
|
implicitHeight: visible ? (showMoreLoader.active ? childrenRect.height - 10 : chatText.height) : 0
|
2020-11-18 18:55:57 +00:00
|
|
|
|
|
|
|
// This function is to avoid the binding loop warning
|
|
|
|
function setWidths() {
|
|
|
|
if (longChatText) {
|
|
|
|
root.width = undefined
|
|
|
|
chatText.width = Qt.binding(function () {return root.width})
|
|
|
|
} else {
|
|
|
|
chatText.width = Qt.binding(function () {return chatText.implicitWidth})
|
|
|
|
root.width = Qt.binding(function () {return chatText.width})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Component.onCompleted: {
|
|
|
|
root.setWidths()
|
|
|
|
}
|
|
|
|
|
2020-09-25 19:44:40 +00:00
|
|
|
StyledTextEdit {
|
|
|
|
id: chatText
|
2021-01-05 19:35:31 +00:00
|
|
|
visible: !showMoreLoader.active || root.readMore
|
2020-09-25 19:44:40 +00:00
|
|
|
textFormat: Text.RichText
|
|
|
|
wrapMode: Text.Wrap
|
2020-11-25 10:46:18 +00:00
|
|
|
font.pixelSize: Style.current.primaryTextFontSize
|
2020-09-25 19:44:40 +00:00
|
|
|
readOnly: true
|
|
|
|
selectByMouse: true
|
|
|
|
color: Style.current.textColor
|
2021-01-05 19:35:31 +00:00
|
|
|
height: root.veryLongChatText && !root.readMore ? Math.min(implicitHeight, 200) : implicitHeight
|
2020-09-25 19:44:40 +00:00
|
|
|
clip: true
|
|
|
|
onLinkActivated: function (link) {
|
|
|
|
if(link.startsWith("#")) {
|
|
|
|
chatsModel.joinChat(link.substring(1), Constants.chatTypePublic);
|
|
|
|
return;
|
|
|
|
}
|
2020-07-20 21:59:01 +00:00
|
|
|
|
2020-09-25 19:44:40 +00:00
|
|
|
if (link.startsWith('//')) {
|
|
|
|
let pk = link.replace("//", "");
|
2020-12-21 12:08:44 +00:00
|
|
|
const userProfileImage = appMain.getProfileImage(pk)
|
2020-11-30 17:03:52 +00:00
|
|
|
openProfilePopup(chatsModel.userNameOrAlias(pk), pk, userProfileImage || utilsModel.generateIdenticon(pk))
|
2020-09-25 19:44:40 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-12-29 20:33:54 +00:00
|
|
|
appMain.openLink(link)
|
2020-09-25 19:44:40 +00:00
|
|
|
}
|
2020-12-06 02:29:23 +00:00
|
|
|
|
|
|
|
onLinkHovered: {
|
|
|
|
cursorShape: Qt.PointingHandCursor
|
|
|
|
}
|
|
|
|
|
2020-09-25 19:44:40 +00:00
|
|
|
text: {
|
|
|
|
if(contentType === Constants.stickerType) return "";
|
|
|
|
let msg = Utils.linkifyAndXSS(message);
|
|
|
|
if(isEmoji) {
|
2021-01-14 08:46:05 +00:00
|
|
|
return Emoji.parse(msg, Emoji.size.middle);
|
2020-09-25 19:44:40 +00:00
|
|
|
} else {
|
2020-11-17 03:07:01 +00:00
|
|
|
return `<style type="text/css">` +
|
|
|
|
`p, img, a, del, code, blockquote { margin: 0; padding: 0; }` +
|
|
|
|
`code {` +
|
|
|
|
`background-color: ${Style.current.codeBackground};` +
|
|
|
|
`color: ${Style.current.white};` +
|
|
|
|
`white-space: pre;` +
|
|
|
|
`}` +
|
|
|
|
`p {` +
|
|
|
|
`line-height: 22px;` +
|
|
|
|
`}` +
|
|
|
|
`a {` +
|
2021-02-10 20:41:00 +00:00
|
|
|
`color: ${isCurrentUser && !appSettings.useCompactMode ? Style.current.white : Style.current.textColor};` +
|
2020-11-17 03:07:01 +00:00
|
|
|
`}` +
|
|
|
|
`a.mention {` +
|
2021-02-01 18:40:55 +00:00
|
|
|
`color: ${Style.current.mentionColor};` +
|
|
|
|
`background-color: ${Style.current.mentionBgColor};` +
|
|
|
|
`text-decoration: none;` +
|
2020-11-17 03:07:01 +00:00
|
|
|
`}` +
|
|
|
|
`del {` +
|
|
|
|
`text-decoration: line-through;` +
|
|
|
|
`}` +
|
|
|
|
`table.blockquote td {` +
|
|
|
|
`padding-left: 10px;` +
|
|
|
|
`color: ${isCurrentUser ? Style.current.chatReplyCurrentUser : Style.current.secondaryText};` +
|
|
|
|
`}` +
|
|
|
|
`table.blockquote td.quoteline {` +
|
|
|
|
`background-color: ${isCurrentUser ? Style.current.chatReplyCurrentUser : Style.current.secondaryText};` +
|
|
|
|
`height: 100%;` +
|
|
|
|
`padding-left: 0;` +
|
|
|
|
`}` +
|
|
|
|
`.emoji {` +
|
|
|
|
`vertical-align: bottom;` +
|
|
|
|
`}` +
|
|
|
|
`</style>` +
|
|
|
|
`${Emoji.parse(msg)}`
|
2020-09-25 19:44:40 +00:00
|
|
|
}
|
2020-07-20 21:59:01 +00:00
|
|
|
}
|
2020-09-25 19:44:40 +00:00
|
|
|
}
|
2020-07-20 21:59:01 +00:00
|
|
|
|
2020-11-18 20:07:23 +00:00
|
|
|
Loader {
|
|
|
|
id: mask
|
|
|
|
anchors.fill: chatText
|
2021-01-05 19:35:31 +00:00
|
|
|
active: showMoreLoader.active
|
2020-11-18 20:07:23 +00:00
|
|
|
visible: false
|
|
|
|
sourceComponent: LinearGradient {
|
|
|
|
start: Qt.point(0, 0)
|
|
|
|
end: Qt.point(0, chatText.height)
|
|
|
|
gradient: Gradient {
|
|
|
|
GradientStop { position: 0.0; color: "white" }
|
|
|
|
GradientStop { position: 0.85; color: "white" }
|
|
|
|
GradientStop { position: 1; color: "transparent" }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Loader {
|
|
|
|
id: opMask
|
2021-01-05 19:35:31 +00:00
|
|
|
active: showMoreLoader.active && !root.readMore
|
2020-11-18 20:07:23 +00:00
|
|
|
anchors.fill: chatText
|
|
|
|
sourceComponent: OpacityMask {
|
|
|
|
source: chatText
|
|
|
|
maskSource: mask
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-09-25 19:44:40 +00:00
|
|
|
Loader {
|
2020-09-30 18:45:45 +00:00
|
|
|
id: showMoreLoader
|
2020-09-25 19:44:40 +00:00
|
|
|
active: root.veryLongChatText
|
|
|
|
anchors.top: chatText.bottom
|
2020-11-18 20:07:23 +00:00
|
|
|
anchors.topMargin: - Style.current.padding
|
|
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
2020-09-30 18:45:45 +00:00
|
|
|
sourceComponent: Component {
|
2020-11-18 20:07:23 +00:00
|
|
|
SVGImage {
|
|
|
|
id: emojiImage
|
|
|
|
width: 256
|
|
|
|
height: 44
|
|
|
|
fillMode: Image.PreserveAspectFit
|
2020-11-19 16:08:08 +00:00
|
|
|
source: "../../../../img/read-more.svg"
|
2020-09-30 18:45:45 +00:00
|
|
|
z: 100
|
2020-11-19 16:08:08 +00:00
|
|
|
rotation: root.readMore ? 180 : 0
|
2020-09-30 18:45:45 +00:00
|
|
|
MouseArea {
|
|
|
|
z: 101
|
|
|
|
anchors.fill: parent
|
|
|
|
cursorShape: Qt.PointingHandCursor
|
|
|
|
onClicked: {
|
|
|
|
root.readMore = !root.readMore
|
|
|
|
}
|
2020-09-25 19:44:40 +00:00
|
|
|
}
|
|
|
|
}
|
2020-07-15 21:04:14 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|