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

204 lines
6.5 KiB
QML

import QtQuick 2.15
import utils 1.0
import StatusQ.Core 0.1
import StatusQ.Core.Theme 0.1
import StatusQ.Controls 0.1
import StatusQ.Components 0.1
import shared.controls 1.0
import shared.status 1.0
import shared.panels 1.0
import shared.controls.delegates 1.0
Flow {
id: root
required property bool isOnline
required property bool playAnimations
required property var linkPreviewModel
required property var gifLinks
required property bool gifUnfurlingEnabled
required property bool canAskToUnfurlGifs
readonly property alias hoveredLink: linksRepeater.hoveredUrl
property string highlightLink: ""
signal imageClicked(var image, var mouse, string imageSource, string url)
signal openContextMenu(var item, string url, string domain)
signal setNeverAskAboutUnfurlingAgain(bool neverAskAgain)
function resetLocalAskAboutUnfurling() {
d.localAskAboutUnfurling = true
}
spacing: 12
//TODO: remove once GIF previews are unfurled sender side
QtObject {
id: d
property bool localAskAboutUnfurling: true
}
Loader {
visible: active
active: root.gifLinks && root.gifLinks.length > 0
&& !root.gifUnfurlingEnabled
&& d.localAskAboutUnfurling && root.canAskToUnfurlGifs
sourceComponent: enableLinkComponent
}
Repeater {
id: tempRepeater
visible: root.canAskToUnfurlGifs
model: root.gifUnfurlingEnabled ? gifLinks : []
delegate: LinkPreviewGifDelegate {
required property string modelData
link: modelData
isOnline: root.isOnline
playAnimation: root.playAnimations
onClicked: root.imageClicked(imageAlias, mouse, link, link)
}
}
Repeater {
id: linksRepeater
property string hoveredUrl: ""
model: root.linkPreviewModel
delegate: LinkPreviewCardDelegate {
id: delegate
highlight: url === root.highlightLink
onHoveredChanged: {
linksRepeater.hoveredUrl = hovered ? url : ""
}
onClicked: (mouse) => {
if(mouse.button === Qt.RightButton) {
const domain = previewType === Constants.LinkPreviewType.Standard ? linkData.domain : Constants.externalStatusLink
root.openContextMenu(delegate, url, domain)
return
}
if(previewType === Constants.LinkPreviewType.Standard) {
Global.openLinkWithConfirmation(url, linkData.domain)
return
}
Global.activateDeepLink(url)
}
}
}
Component {
id: enableLinkComponent
Rectangle {
id: enableLinkRoot
implicitWidth: 300
implicitHeight: childrenRect.height + Theme.smallPadding
radius: 16
border.width: 1
border.color: Theme.palette.border
color: Theme.palette.background
StatusFlatRoundButton {
anchors.top: parent.top
anchors.topMargin: Theme.smallPadding
anchors.right: parent.right
anchors.rightMargin: Theme.smallPadding
icon.width: 20
icon.height: 20
icon.name: "close-circle"
onClicked: d.localAskAboutUnfurling = false
}
Image {
id: unfurlingImage
source: Theme.png("unfurling-image")
width: 132
height: 94
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: parent.top
anchors.topMargin: Theme.smallPadding
}
StatusBaseText {
id: enableText
text: qsTr("Enable automatic GIF unfurling")
horizontalAlignment: Text.AlignHCenter
width: parent.width
wrapMode: Text.WordWrap
anchors.top: unfurlingImage.bottom
anchors.topMargin: Theme.halfPadding
color: Theme.palette.directColor1
}
StatusBaseText {
id: infoText
text: qsTr("Once enabled, links posted in the chat may share your metadata with their owners")
horizontalAlignment: Text.AlignHCenter
width: parent.width
wrapMode: Text.WordWrap
anchors.top: enableText.bottom
font.pixelSize: 13
color: Theme.palette.baseColor1
}
Separator {
id: sep1
anchors.top: infoText.bottom
anchors.topMargin: Theme.smallPadding
}
StatusFlatButton {
id: enableBtn
objectName: "LinksMessageView_enableBtn"
text: qsTr("Enable in Settings")
onClicked: {
Global.changeAppSectionBySectionType(Constants.appSection.profile, Constants.settingsSubsection.messaging);
}
width: parent.width
anchors.top: sep1.bottom
Component.onCompleted: {
background.radius = 0;
}
}
Separator {
id: sep2
anchors.top: enableBtn.bottom
anchors.topMargin: 0
}
Item {
width: parent.width
height: 44
anchors.top: sep2.bottom
clip: true
StatusFlatButton {
id: dontAskBtn
width: parent.width
height: (parent.height+Theme.padding)
anchors.top: parent.top
anchors.topMargin: -Theme.padding
contentItem: Item {
StatusBaseText {
anchors.centerIn: parent
anchors.verticalCenterOffset: Theme.halfPadding
font: dontAskBtn.font
color: dontAskBtn.textColor
text: qsTr("Don't ask me again")
}
}
onClicked: root.setNeverAskAboutUnfurlingAgain(true)
Component.onCompleted: {
background.radius = Theme.padding
}
}
}
}
}
}