303 lines
13 KiB
QML
303 lines
13 KiB
QML
import QtQuick 2.13
|
|
import QtQuick.Controls 2.13
|
|
import QtQuick.Layouts 1.3
|
|
import QtGraphicalEffects 1.0
|
|
import QtQml.Models 2.13
|
|
|
|
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.status 1.0
|
|
import shared.stores 1.0 as SharedStores
|
|
|
|
//TODO remove this dependency!
|
|
import AppLayouts.Chat.stores 1.0
|
|
|
|
Item {
|
|
id: root
|
|
|
|
property var store
|
|
property var stickerPacks: StickerPackData {}
|
|
property int packId: -1
|
|
|
|
signal backClicked
|
|
signal uninstallClicked(int packId)
|
|
signal installClicked(var stickers, int packId, int index)
|
|
signal cancelClicked(int packId)
|
|
signal updateClicked(int packId)
|
|
signal buyClicked(int packId)
|
|
|
|
StatusGridView {
|
|
id: availableStickerPacks
|
|
objectName: "stickerMarketStatusGridView"
|
|
width: parent.width
|
|
height: 380
|
|
anchors.left: parent.left
|
|
anchors.leftMargin: Style.current.padding
|
|
anchors.right: parent.right
|
|
anchors.rightMargin: Style.current.padding
|
|
anchors.top: parent.top
|
|
anchors.topMargin: Style.current.padding
|
|
cellWidth: parent.width - (Style.current.padding * 2)
|
|
cellHeight: height - 72
|
|
|
|
focus: true
|
|
model: DelegateModel {
|
|
id: delegateModel
|
|
|
|
function update() {
|
|
if (items.count > 0) {
|
|
items.setGroups(0, items.count, "items");
|
|
}
|
|
|
|
var visible = [];
|
|
for (var i = 0; i < items.count; ++i) {
|
|
var item = items.get(i);
|
|
if (delegateModel.walletEnabled ||
|
|
!delegateModel.walletEnabled && item.model.price == 0) {
|
|
visible.push(item);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < visible.length; ++i) {
|
|
item = visible[i];
|
|
item.inVisible = true;
|
|
if (item.visibleIndex !== i) {
|
|
visibleItems.move(item.visibleIndex, i, 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
readonly property bool walletEnabled: localAccountSensitiveSettings.isWalletEnabled
|
|
onWalletEnabledChanged: {
|
|
update()
|
|
}
|
|
|
|
model: stickerPacks
|
|
items.onChanged: update()
|
|
filterOnGroup: "visible"
|
|
groups: DelegateModelGroup {
|
|
id: visibleItems
|
|
|
|
name: "visible"
|
|
includeByDefault: false
|
|
}
|
|
|
|
delegate: Item {
|
|
objectName: "stickerMarketDelegateItem" + index
|
|
readonly property string packId: model.packId // This property is necessary for the tests
|
|
readonly property bool installed: model.installed // This property is necessary for the tests
|
|
width: availableStickerPacks.cellWidth
|
|
height: availableStickerPacks.cellHeight
|
|
RoundedImage {
|
|
id: imgPreview
|
|
anchors.top: parent.top
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
height: 220
|
|
width: parent.width
|
|
radius: 12
|
|
source: model.preview
|
|
onClicked: {
|
|
stickerPackDetailsPopup.open()
|
|
}
|
|
}
|
|
|
|
// TODO: replace with StatusModal
|
|
ModalPopup {
|
|
id: stickerPackDetailsPopup
|
|
height: 540
|
|
header: StatusStickerPackDetails {
|
|
packThumb: thumbnail
|
|
packName: name
|
|
packAuthor: author
|
|
packNameFontSize: 17
|
|
spacing: Style.current.padding / 2
|
|
}
|
|
|
|
contentWrapper.anchors.topMargin: 0
|
|
contentWrapper.anchors.bottomMargin: 0
|
|
StatusStickerList {
|
|
id: stickerGridInPopup
|
|
anchors.fill: parent
|
|
anchors.topMargin: Style.current.padding
|
|
model: stickers
|
|
packId: root.packId
|
|
}
|
|
|
|
footer: StatusStickerButton {
|
|
objectName: "statusStickerMarketInstallButton"
|
|
height: 44
|
|
anchors.right: parent.right
|
|
style: StatusStickerButton.StyleType.LargeNoIcon
|
|
packPrice: price
|
|
isInstalled: installed
|
|
isBought: bought
|
|
isPending: pending
|
|
onInstallClicked: root.installClicked(stickers, packId, index)
|
|
onUninstallClicked: root.uninstallClicked(packId)
|
|
onCancelClicked: root.cancelClicked(packId)
|
|
onUpdateClicked: root.updateClicked(packId)
|
|
onBuyClicked: {
|
|
Global.openPopup(stickerPackPurchaseModal)
|
|
root.buyClicked(packId)
|
|
}
|
|
}
|
|
}
|
|
Component {
|
|
id: stickerPackPurchaseModal
|
|
SendModal {
|
|
id: buyStickersModal
|
|
interactive: false
|
|
sendType: Constants.SendType.StickersBuy
|
|
preSelectedRecipient: root.store.stickersStore.getStickersMarketAddress()
|
|
preDefinedAmountToSend: LocaleUtils.numberToLocaleString(parseFloat(price))
|
|
preSelectedAsset: {
|
|
let assetsList = buyStickersModal.store.currentAccount.assets
|
|
for(var i=0; i< assetsList.count;i++) {
|
|
let symbol = JSON.parse(root.store.stickersStore.getStatusToken()).symbol
|
|
if(symbol === assetsList.rowData(i, "symbol"))
|
|
return {
|
|
name: assetsList.rowData(i, "name"),
|
|
symbol: assetsList.rowData(i, "symbol"),
|
|
totalBalance: assetsList.rowData(i, "totalBalance"),
|
|
totalCurrencyBalance: assetsList.rowData(i, "totalCurrencyBalance"),
|
|
balances: assetsList.rowData(i, "balances"),
|
|
decimals: assetsList.rowData(i, "decimals")
|
|
}
|
|
}
|
|
return {}
|
|
}
|
|
sendTransaction: function() {
|
|
if(bestRoutes.length === 1) {
|
|
let path = bestRoutes[0]
|
|
let eip1559Enabled = path.gasFees.eip1559Enabled
|
|
let maxFeePerGas = path.gasFees.maxFeePerGasM
|
|
root.store.stickersStore.authenticateAndBuy(packId,
|
|
selectedAccount.address,
|
|
path.gasAmount,
|
|
eip1559Enabled ? "" : path.gasFees.gasPrice,
|
|
eip1559Enabled ? path.gasFees.maxPriorityFeePerGas : "",
|
|
eip1559Enabled ? maxFeePerGas : path.gasFees.gasPrice,
|
|
eip1559Enabled)
|
|
}
|
|
}
|
|
Connections {
|
|
target: root.store.stickersStore.stickersModule
|
|
onTransactionWasSent: {
|
|
try {
|
|
let response = JSON.parse(txResult)
|
|
if (!response.success) {
|
|
if (response.result.includes(Constants.walletSection.cancelledMessage)) {
|
|
return
|
|
}
|
|
buyStickersModal.sendingError.text = response.result
|
|
return buyStickersModal.sendingError.open()
|
|
}
|
|
for(var i=0; i<buyStickersModal.bestRoutes.length; i++) {
|
|
let url = "%1/%2".arg(buyStickersModal.store.getEtherscanLink(buyStickersModal.bestRoutes[i].fromNetwork.chainId)).arg(response.result)
|
|
Global.displayToastMessage(qsTr("Transaction pending..."),
|
|
qsTr("View on etherscan"),
|
|
"",
|
|
true,
|
|
Constants.ephemeralNotificationType.normal,
|
|
url)
|
|
}
|
|
buyStickersModal.close()
|
|
} catch (e) {
|
|
console.error('Error parsing the response', e)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
StatusStickerPackDetails {
|
|
id: stickerPackDetails
|
|
height: 64 - (Style.current.smallPadding * 2)
|
|
width: parent.width - (Style.current.padding * 2)
|
|
anchors.top: imgPreview.bottom
|
|
anchors.topMargin: Style.current.smallPadding
|
|
anchors.bottomMargin: Style.current.smallPadding
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
packThumb: thumbnail
|
|
packName: name
|
|
packAuthor: author
|
|
|
|
StatusStickerButton {
|
|
anchors.right: parent.right
|
|
packPrice: price
|
|
width: 75 // only needed for Qt Creator
|
|
isInstalled: installed
|
|
isBought: bought
|
|
isPending: pending
|
|
onInstallClicked: root.installClicked(stickers, packId, index)
|
|
onUninstallClicked: root.uninstallClicked(packId)
|
|
onCancelClicked: root.cancelClicked(packId)
|
|
onUpdateClicked: root.updateClicked(packId)
|
|
onBuyClicked: {
|
|
if (!SharedStores.RootStore.isWalletEnabled) {
|
|
confirmationPopup.open()
|
|
return
|
|
}
|
|
Global.openPopup(stickerPackPurchaseModal)
|
|
root.buyClicked(packId)
|
|
}
|
|
}
|
|
}
|
|
|
|
ConfirmationDialog {
|
|
id: confirmationPopup
|
|
showCancelButton: true
|
|
confirmationText: qsTr("This feature is experimental and is meant for testing purposes by core contributors and the community. It's not meant for real use and makes no claims of security or integrity of funds or data. Use at your own risk.")
|
|
confirmButtonLabel: qsTr("I understand")
|
|
onConfirmButtonClicked: {
|
|
SharedStores.RootStore.enableWallet();
|
|
close()
|
|
Global.openPopup(stickerPackPurchaseModal)
|
|
root.buyClicked(packId)
|
|
}
|
|
|
|
onCancelButtonClicked: {
|
|
close()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Item {
|
|
id: footer
|
|
height: 44 - Style.current.padding
|
|
anchors.top: availableStickerPacks.bottom
|
|
|
|
RoundedIcon {
|
|
id: btnBack
|
|
anchors.top: parent.top
|
|
anchors.topMargin: Style.current.padding / 2
|
|
anchors.left: parent.left
|
|
anchors.leftMargin: Style.current.padding / 2
|
|
width: 28
|
|
height: 28
|
|
iconWidth: 17.5
|
|
iconHeight: 13.5
|
|
iconColor: Style.current.roundedButtonSecondaryForegroundColor
|
|
source: Style.svg("arrowUp")
|
|
rotation: 270
|
|
onClicked: {
|
|
root.backClicked()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*##^##
|
|
Designer {
|
|
D{i:0;height:440;width:360}
|
|
}
|
|
##^##*/
|