TransactionBubbleView and related sub-components removed
This commit is contained in:
parent
d5a0589591
commit
912b94859d
|
@ -41,7 +41,6 @@ Control {
|
||||||
property list<Item> quickActions
|
property list<Item> quickActions
|
||||||
property var statusChatInput
|
property var statusChatInput
|
||||||
property alias linksComponent: linksLoader.sourceComponent
|
property alias linksComponent: linksLoader.sourceComponent
|
||||||
property alias transcationComponent: transactionBubbleLoader.sourceComponent
|
|
||||||
property alias invitationComponent: invitationBubbleLoader.sourceComponent
|
property alias invitationComponent: invitationBubbleLoader.sourceComponent
|
||||||
property alias mouseArea: mouseArea
|
property alias mouseArea: mouseArea
|
||||||
|
|
||||||
|
@ -379,11 +378,6 @@ Control {
|
||||||
|| (!!root.gifLinks && root.gifLinks.length > 0))
|
|| (!!root.gifLinks && root.gifLinks.length > 0))
|
||||||
visible: active
|
visible: active
|
||||||
}
|
}
|
||||||
Loader {
|
|
||||||
id: transactionBubbleLoader
|
|
||||||
active: root.messageDetails.contentType === StatusMessage.ContentType.Transaction && !editMode
|
|
||||||
visible: active
|
|
||||||
}
|
|
||||||
Loader {
|
Loader {
|
||||||
id: invitationBubbleLoader
|
id: invitationBubbleLoader
|
||||||
// TODO remove this component in #12570
|
// TODO remove this component in #12570
|
||||||
|
|
|
@ -1,45 +0,0 @@
|
||||||
import QtQuick 2.3
|
|
||||||
|
|
||||||
import utils 1.0
|
|
||||||
import shared 1.0
|
|
||||||
import shared.panels 1.0
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: root
|
|
||||||
width: parent.width
|
|
||||||
height: childrenRect.height + Style.current.halfPadding
|
|
||||||
|
|
||||||
property var acc
|
|
||||||
property string fromAddress
|
|
||||||
property var selectedAsset
|
|
||||||
property string selectedAmount
|
|
||||||
property string selectedFiatAmount
|
|
||||||
|
|
||||||
signal sendTransaction()
|
|
||||||
|
|
||||||
Separator {
|
|
||||||
id: separator
|
|
||||||
}
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
id: signText
|
|
||||||
color: Style.current.blue
|
|
||||||
text: qsTr("Sign and send")
|
|
||||||
horizontalAlignment: Text.AlignHCenter
|
|
||||||
wrapMode: Text.WordWrap
|
|
||||||
font.weight: Font.Medium
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.left: parent.left
|
|
||||||
topPadding: Style.current.halfPadding
|
|
||||||
anchors.top: separator.bottom
|
|
||||||
font.pixelSize: 15
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
anchors.fill: parent
|
|
||||||
cursorShape: Qt.PointingHandCursor
|
|
||||||
onClicked: {
|
|
||||||
root.sendTransaction();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,81 +0,0 @@
|
||||||
import QtQuick 2.3
|
|
||||||
import QtGraphicalEffects 1.13
|
|
||||||
import shared 1.0
|
|
||||||
import shared.panels 1.0
|
|
||||||
|
|
||||||
import utils 1.0
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
property int state: Constants.pending
|
|
||||||
property bool outgoing: true
|
|
||||||
|
|
||||||
id: root
|
|
||||||
width: childrenRect.width + 24
|
|
||||||
height: 28
|
|
||||||
border.width: 1
|
|
||||||
border.color: Style.current.border
|
|
||||||
radius: 24
|
|
||||||
color: Style.current.background
|
|
||||||
|
|
||||||
SVGImage {
|
|
||||||
id: stateImage
|
|
||||||
source: {
|
|
||||||
switch (root.state) {
|
|
||||||
case Constants.pending:
|
|
||||||
case Constants.addressReceived:
|
|
||||||
case Constants.transactionRequested:
|
|
||||||
case Constants.addressRequested: return Style.svg("dotsLoadings")
|
|
||||||
case Constants.confirmed: return Style.svg("check")
|
|
||||||
case Constants.transactionDeclined:
|
|
||||||
case Constants.declined: return Style.svg("exclamation")
|
|
||||||
default: return ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
width: 16
|
|
||||||
height: 16
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.leftMargin: Style.current.halfPadding
|
|
||||||
anchors.verticalCenter: stateText.verticalCenter
|
|
||||||
}
|
|
||||||
|
|
||||||
ColorOverlay {
|
|
||||||
anchors.fill: stateImage
|
|
||||||
source: stateImage
|
|
||||||
color: state === Constants.confirmed ? Style.current.transparent : Style.current.textColor
|
|
||||||
}
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
id: stateText
|
|
||||||
color: {
|
|
||||||
if (root.state === Constants.unknown || root.state === Constants.failure) {
|
|
||||||
return Style.current.danger
|
|
||||||
}
|
|
||||||
if (root.state === Constants.confirmed || root.state === Constants.declined) {
|
|
||||||
return Style.current.textColor
|
|
||||||
}
|
|
||||||
|
|
||||||
return Style.current.secondaryText
|
|
||||||
}
|
|
||||||
text: {
|
|
||||||
switch (root.state) {
|
|
||||||
case Constants.pending: return qsTr("Pending")
|
|
||||||
case Constants.confirmed: return qsTr("Confirmed")
|
|
||||||
case Constants.unknown: return qsTr("Unknown token")
|
|
||||||
case Constants.addressRequested: return qsTr("Address requested")
|
|
||||||
case Constants.transactionRequested: return qsTr("Waiting to accept")
|
|
||||||
case Constants.addressReceived: return (!root.outgoing ?
|
|
||||||
qsTr("Address shared") :
|
|
||||||
qsTr("Address received"))
|
|
||||||
case Constants.transactionDeclined:
|
|
||||||
case Constants.declined: return qsTr("Transaction declined")
|
|
||||||
case Constants.failure: return qsTr("failure")
|
|
||||||
default: return qsTr("Unknown state")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
font.weight: Font.Medium
|
|
||||||
anchors.left: stateImage.right
|
|
||||||
anchors.leftMargin: 4
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
font.pixelSize: 13
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -15,7 +15,6 @@ MessageReactionsRow 1.0 MessageReactionsRow.qml
|
||||||
ProfileHeader 1.0 ProfileHeader.qml
|
ProfileHeader 1.0 ProfileHeader.qml
|
||||||
RectangleCorner 1.0 RectangleCorner.qml
|
RectangleCorner 1.0 RectangleCorner.qml
|
||||||
Retry 1.0 Retry.qml
|
Retry 1.0 Retry.qml
|
||||||
SendTransactionButton 1.0 SendTransactionButton.qml
|
|
||||||
SentMessage 1.0 SentMessage.qml
|
SentMessage 1.0 SentMessage.qml
|
||||||
StateBubble 1.0 StateBubble.qml
|
StateBubble 1.0 StateBubble.qml
|
||||||
UserImage 1.0 UserImage.qml
|
UserImage 1.0 UserImage.qml
|
||||||
|
|
|
@ -1,94 +0,0 @@
|
||||||
import QtQuick 2.3
|
|
||||||
|
|
||||||
import shared 1.0
|
|
||||||
import shared.popups 1.0
|
|
||||||
import shared.panels 1.0
|
|
||||||
import shared.controls 1.0
|
|
||||||
|
|
||||||
import utils 1.0
|
|
||||||
|
|
||||||
import AppLayouts.Chat.stores 1.0 as ChatStores
|
|
||||||
import AppLayouts.Profile.stores 1.0 as ProfileStores
|
|
||||||
|
|
||||||
//TODO remove dynamic scoping
|
|
||||||
Item {
|
|
||||||
id: root
|
|
||||||
width: parent.width
|
|
||||||
height: childrenRect.height
|
|
||||||
|
|
||||||
property ChatStores.RootStore store
|
|
||||||
property ProfileStores.ContactsStore contactsStore
|
|
||||||
|
|
||||||
property var token
|
|
||||||
property string tokenAmount
|
|
||||||
property string fiatValue
|
|
||||||
property int state: Constants.addressRequested
|
|
||||||
|
|
||||||
Separator {
|
|
||||||
id: separator1
|
|
||||||
}
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
id: acceptText
|
|
||||||
color: Style.current.blue
|
|
||||||
text: root.state === Constants.addressRequested ?
|
|
||||||
qsTr("Accept and share address") :
|
|
||||||
qsTr("Accept and send")
|
|
||||||
padding: Style.current.halfPadding
|
|
||||||
horizontalAlignment: Text.AlignHCenter
|
|
||||||
wrapMode: Text.WordWrap
|
|
||||||
font.weight: Font.Medium
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.top: separator1.bottom
|
|
||||||
font.pixelSize: 15
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
anchors.fill: parent
|
|
||||||
cursorShape: Qt.PointingHandCursor
|
|
||||||
onClicked: {
|
|
||||||
// ToDo launch send modal from here
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Separator {
|
|
||||||
id: separator2
|
|
||||||
anchors.topMargin: 0
|
|
||||||
anchors.top: acceptText.bottom
|
|
||||||
}
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
id: declineText
|
|
||||||
color: Style.current.blue
|
|
||||||
text: qsTr("Decline")
|
|
||||||
horizontalAlignment: Text.AlignHCenter
|
|
||||||
wrapMode: Text.WordWrap
|
|
||||||
font.weight: Font.Medium
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.left: parent.left
|
|
||||||
padding: Style.current.halfPadding
|
|
||||||
anchors.top: separator2.bottom
|
|
||||||
font.pixelSize: 15
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
anchors.fill: parent
|
|
||||||
cursorShape: Qt.PointingHandCursor
|
|
||||||
onClicked: {
|
|
||||||
if (root.state === Constants.addressRequested) {
|
|
||||||
root.store.declineAddressRequest(messageId)
|
|
||||||
} else if (root.state === Constants.transactionRequested) {
|
|
||||||
root.store.declineRequest(messageId)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ConfirmationDialog {
|
|
||||||
id: gasEstimateErrorPopup
|
|
||||||
height: 220
|
|
||||||
onConfirmButtonClicked: {
|
|
||||||
gasEstimateErrorPopup.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -977,14 +977,6 @@ Loader {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
transcationComponent: Component {
|
|
||||||
TransactionBubbleView {
|
|
||||||
transactionParams: root.transactionParams
|
|
||||||
store: root.rootStore
|
|
||||||
contactsStore: root.contactsStore
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
invitationComponent: Component {
|
invitationComponent: Component {
|
||||||
InvitationBubbleView {
|
InvitationBubbleView {
|
||||||
store: root.rootStore
|
store: root.rootStore
|
||||||
|
|
|
@ -1,236 +0,0 @@
|
||||||
import QtQuick 2.3
|
|
||||||
|
|
||||||
import StatusQ.Core 0.1
|
|
||||||
|
|
||||||
import utils 1.0
|
|
||||||
import shared 1.0
|
|
||||||
import shared.panels 1.0
|
|
||||||
import shared.popups 1.0
|
|
||||||
import shared.views.chat 1.0
|
|
||||||
import shared.controls.chat 1.0
|
|
||||||
import shared.controls 1.0
|
|
||||||
import shared.stores 1.0
|
|
||||||
|
|
||||||
import AppLayouts.Chat.stores 1.0 as ChatStores
|
|
||||||
import AppLayouts.Profile.stores 1.0 as ProfileStores
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: root
|
|
||||||
width: rectangleBubble.width
|
|
||||||
height: rectangleBubble.height
|
|
||||||
|
|
||||||
property ChatStores.RootStore store
|
|
||||||
property ProfileStores.ContactsStore contactsStore
|
|
||||||
|
|
||||||
property var transactionParams
|
|
||||||
|
|
||||||
property var transactionParamsObject: {
|
|
||||||
try {
|
|
||||||
return JSON.parse(transactionParams)
|
|
||||||
} catch (e) {
|
|
||||||
console.error('Error parsing command parameters')
|
|
||||||
console.error('JSON:', transactionParams)
|
|
||||||
console.error('Error:', e)
|
|
||||||
return {
|
|
||||||
id: "",
|
|
||||||
fromAddress: "",
|
|
||||||
address: "",
|
|
||||||
contract: "",
|
|
||||||
value: "",
|
|
||||||
transactionHash: "",
|
|
||||||
commandState: 1,
|
|
||||||
signature: null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
property var token:{
|
|
||||||
try {
|
|
||||||
return JSON.parse(transactionParamsObject.contract)
|
|
||||||
} catch (e) {
|
|
||||||
console.error('Error parsing command parameters')
|
|
||||||
console.error('JSON:', transactionParamsObject.contract)
|
|
||||||
console.error('Error:', e)
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
property string tokenAmount: transactionParamsObject.value
|
|
||||||
property string tokenSymbol: token.symbol || ""
|
|
||||||
property string fiatValue: {
|
|
||||||
if (!tokenAmount || !token.symbol) {
|
|
||||||
return "0"
|
|
||||||
}
|
|
||||||
return root.store.getFiatValue(tokenAmount, token.symbol) + " " + defaultFiatSymbol
|
|
||||||
}
|
|
||||||
property int state: transactionParamsObject.commandState
|
|
||||||
|
|
||||||
// Any transaction where isCurrentUser is true is actually outgoing transaction.
|
|
||||||
property bool outgoing: isCurrentUser
|
|
||||||
|
|
||||||
property int innerMargin: 12
|
|
||||||
property bool isError: transactionParamsObject.contract === "{}"
|
|
||||||
onTokenSymbolChanged: {
|
|
||||||
if (!!tokenSymbol) {
|
|
||||||
tokenImage.source = Style.png("tokens/"+root.tokenSymbol)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: rectangleBubble
|
|
||||||
width: (bubbleLoader.active ? bubbleLoader.width : valueContainer.width)
|
|
||||||
+ timeText.width + 3 * root.innerMargin
|
|
||||||
height: childrenRect.height + root.innerMargin
|
|
||||||
radius: 16
|
|
||||||
color: Style.current.background
|
|
||||||
border.color: Style.current.border
|
|
||||||
border.width: 1
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
id: title
|
|
||||||
color: Style.current.secondaryText
|
|
||||||
text: {
|
|
||||||
if (root.state === Constants.transactionRequested) {
|
|
||||||
let prefix = outgoing? "↑ " : "↓ "
|
|
||||||
return prefix + qsTr("Transaction request")
|
|
||||||
}
|
|
||||||
|
|
||||||
return outgoing ?
|
|
||||||
qsTr("↑ Outgoing transaction") :
|
|
||||||
qsTr("↓ Incoming transaction")
|
|
||||||
}
|
|
||||||
font.weight: Font.Medium
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.topMargin: Style.current.halfPadding
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.leftMargin: root.innerMargin
|
|
||||||
font.pixelSize: 13
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: valueContainer
|
|
||||||
width: childrenRect.width
|
|
||||||
height: tokenText.height + fiatText.height
|
|
||||||
anchors.top: title.bottom
|
|
||||||
anchors.topMargin: 4
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.leftMargin: root.innerMargin
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
id: txtError
|
|
||||||
color: Style.current.danger
|
|
||||||
visible: root.isError
|
|
||||||
text: qsTr("Token not found on your current network")
|
|
||||||
}
|
|
||||||
|
|
||||||
Image {
|
|
||||||
id: tokenImage
|
|
||||||
visible: !root.isError
|
|
||||||
width: 24
|
|
||||||
height: 24
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
}
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
id: tokenText
|
|
||||||
visible: !root.isError
|
|
||||||
color: Style.current.textColor
|
|
||||||
text: `${root.tokenAmount} ${root.tokenSymbol}`
|
|
||||||
anchors.left: tokenImage.right
|
|
||||||
anchors.leftMargin: Style.current.halfPadding
|
|
||||||
font.pixelSize: 22
|
|
||||||
}
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
id: fiatText
|
|
||||||
visible: !root.isError
|
|
||||||
color: Style.current.secondaryText
|
|
||||||
text: root.fiatValue
|
|
||||||
anchors.top: tokenText.bottom
|
|
||||||
anchors.left: tokenText.left
|
|
||||||
font.pixelSize: 13
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Loader {
|
|
||||||
id: bubbleLoader
|
|
||||||
active: {
|
|
||||||
return !root.isError && (
|
|
||||||
isCurrentUser ||
|
|
||||||
(!isCurrentUser &&
|
|
||||||
!(root.state === Constants.addressRequested ||
|
|
||||||
root.state === Constants.transactionRequested)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
sourceComponent: stateBubbleComponent
|
|
||||||
anchors.top: valueContainer.bottom
|
|
||||||
anchors.topMargin: Style.current.halfPadding
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.leftMargin: root.innerMargin
|
|
||||||
}
|
|
||||||
|
|
||||||
Component {
|
|
||||||
id: stateBubbleComponent
|
|
||||||
|
|
||||||
StateBubble {
|
|
||||||
state: root.state
|
|
||||||
outgoing: root.outgoing
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Loader {
|
|
||||||
id: buttonsLoader
|
|
||||||
active: !root.isError && (
|
|
||||||
(root.state === Constants.addressRequested && !root.outgoing) ||
|
|
||||||
(root.state === Constants.addressReceived && root.outgoing) ||
|
|
||||||
(root.state === Constants.transactionRequested && !root.outgoing)
|
|
||||||
)
|
|
||||||
sourceComponent: root.outgoing ? signAndSendComponent : acceptTransactionComponent
|
|
||||||
anchors.top: bubbleLoader.active ? bubbleLoader.bottom : valueContainer.bottom
|
|
||||||
anchors.topMargin: bubbleLoader.active ? root.innerMargin : 20
|
|
||||||
width: parent.width
|
|
||||||
}
|
|
||||||
|
|
||||||
Component {
|
|
||||||
id: acceptTransactionComponent
|
|
||||||
|
|
||||||
AcceptTransactionView {
|
|
||||||
state: root.state
|
|
||||||
store: root.store
|
|
||||||
contactsStore: root.contactsStore
|
|
||||||
token: root.token
|
|
||||||
fiatValue: root.fiatValue
|
|
||||||
tokenAmount: root.tokenAmount
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Component {
|
|
||||||
id: signAndSendComponent
|
|
||||||
|
|
||||||
SendTransactionButton {
|
|
||||||
selectedAsset: token
|
|
||||||
selectedAmount: tokenAmount
|
|
||||||
selectedFiatAmount: fiatValue
|
|
||||||
fromAddress: transactionParamsObject.fromAddress
|
|
||||||
onSendTransaction: {
|
|
||||||
// TODO: https://github.com/status-im/status-desktop/issues/6778
|
|
||||||
console.log("not implemented")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
id: timeText
|
|
||||||
color: Style.current.secondaryText
|
|
||||||
text: LocaleUtils.formatTime(messageTimestamp, Locale.ShortFormat)
|
|
||||||
anchors.left: bubbleLoader.active ? bubbleLoader.right : undefined
|
|
||||||
anchors.leftMargin: bubbleLoader.active ? 13 : 0
|
|
||||||
anchors.right: bubbleLoader.active ? undefined : parent.right
|
|
||||||
anchors.rightMargin: bubbleLoader.active ? 0 : root.innerMargin
|
|
||||||
anchors.bottom: bubbleLoader.active ? bubbleLoader.bottom : buttonsLoader.top
|
|
||||||
anchors.bottomMargin: bubbleLoader.active ? -root.innerMargin : 7
|
|
||||||
font.pixelSize: 10
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,15 +1,13 @@
|
||||||
AcceptTransactionView 1.0 AcceptTransactionView.qml
|
|
||||||
ChannelIdentifierView 1.0 ChannelIdentifierView.qml
|
ChannelIdentifierView 1.0 ChannelIdentifierView.qml
|
||||||
ChatContextMenuView 1.0 ChatContextMenuView.qml
|
ChatContextMenuView 1.0 ChatContextMenuView.qml
|
||||||
CompactMessageView 1.0 CompactMessageView.qml
|
CompactMessageView 1.0 CompactMessageView.qml
|
||||||
InvitationBubbleView 1.0 InvitationBubbleView.qml
|
InvitationBubbleView 1.0 InvitationBubbleView.qml
|
||||||
LinksMessageView 1.0 LinksMessageView.qml
|
LinksMessageView 1.0 LinksMessageView.qml
|
||||||
|
MessageAddReactionContextMenu 1.0 MessageAddReactionContextMenu.qml
|
||||||
MessageContextMenuView 1.0 MessageContextMenuView.qml
|
MessageContextMenuView 1.0 MessageContextMenuView.qml
|
||||||
MessageView 1.0 MessageView.qml
|
MessageView 1.0 MessageView.qml
|
||||||
NormalMessageView 1.0 NormalMessageView.qml
|
|
||||||
ProfileHeaderContextMenuView 1.0 ProfileHeaderContextMenuView.qml
|
|
||||||
TransactionBubbleView 1.0 TransactionBubbleView.qml
|
|
||||||
NewMessagesMarker 1.0 NewMessagesMarker.qml
|
NewMessagesMarker 1.0 NewMessagesMarker.qml
|
||||||
SimplifiedMessageView 1.0 SimplifiedMessageView.qml
|
NormalMessageView 1.0 NormalMessageView.qml
|
||||||
ProfileContextMenu 1.0 ProfileContextMenu.qml
|
ProfileContextMenu 1.0 ProfileContextMenu.qml
|
||||||
MessageAddReactionContextMenu 1.0 MessageAddReactionContextMenu.qml
|
ProfileHeaderContextMenuView 1.0 ProfileHeaderContextMenuView.qml
|
||||||
|
SimplifiedMessageView 1.0 SimplifiedMessageView.qml
|
||||||
|
|
Loading…
Reference in New Issue