status-desktop/storybook/pages/WalletConnectPage.qml
Stefan a8fb355a8d feat(wallet) activate Wallet connect modal from deep-links
- Open wallet connect modal when the application is opened from a
  deep link
- Add test entry that opens wallet connect modal with mocked
  StatusDesktop app that can be used for testing
- Add tests

Closes #12641
2023-12-12 20:12:53 +01:00

207 lines
6.1 KiB
QML

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import QtQml 2.15
import Qt.labs.settings 1.0
import StatusQ.Core 0.1
import StatusQ.Core.Utils 0.1
import StatusQ.Controls 0.1
import StatusQ.Components 0.1
import StatusQ.Core.Theme 0.1
import StatusQ.Popups.Dialog 0.1
import Models 1.0
import Storybook 1.0
import AppLayouts.Wallet.views.walletconnect 1.0
import SortFilterProxyModel 0.2
import utils 1.0
import nim 1.0
Item {
id: root
WalletConnect {
id: wc
anchors.top: parent.bottom
anchors.left: parent.left
url: `${pagesFolder}/../stubs/AppLayouts/Wallet/views/walletconnect/src/index.html`
controller: WalletConnectController {
sessionProposal: function(sessionProposalJson) {
respondSessionProposal(sessionProposalJson, `{"eip155":{"methods":["eth_sendTransaction","eth_sendRawTransaction","personal_sign","eth_sign","eth_signTransaction","eth_signTypedData","wallet_switchEthereumChain"],"chains":["eip155:5"],"events":["accountsChanged","chainChanged"],"accounts":["eip155:5:0xE2d622C817878dA5143bBE06866ca8E35273Ba8a"]}}`, "")
}
recordSuccessfulPairing: function(sessionProposalJson) {
const sessionProposal = JSON.parse(sessionProposalJson)
pairingsModel.append({
topic: sessionProposal.params.pairingTopic,
expiry: sessionProposal.params.expiry,
active: true,
peerMetadata: {
name: sessionProposal.params.proposer.metadata.name,
url: sessionProposal.params.proposer.metadata.url,
icons: sessionProposal.params.proposer.metadata.icons,
}
})
root.saveListModel(pairingsModel)
}
deletePairing: function(pairingTopic) {
var found = false
for (var i = 0; i < pairingsModel.count; i++) {
if (pairingsModel.get(i).topic === pairingTopic) {
pairingsModel.get(i).active = false
found = true
break;
}
}
if (!found) {
console.error("Mock Controller: pairing not found", pairingTopic)
}
root.saveListModel(pairingsModel)
}
sessionRequest: function(sessionRequestJson, password) {
const signedJson = "0x1234567890"
this.respondSessionRequest(sessionRequestJson, signedJson, respondError.checked)
}
hasActivePairings: settings.hasActivePairings
projectId: "87815d72a81d739d2a7ce15c2cfdefb3"
}
clip: true
}
// qml Splitter
SplitView {
anchors.fill: parent
ColumnLayout {
SplitView.fillWidth: true
StatusButton {
id: openModalButton
text: "OpenModal"
onClicked: {
wc.modal.open()
}
}
ColumnLayout {}
}
ColumnLayout {
id: optionsSpace
StatusRadioButton {
text: "WebEngine running"
checked: wc.sdk.webEngineLoader.active
enabled: false
}
RowLayout {
id: optionsHeader
Text { text: "projectId" }
Text {
readonly property string projectId: wc.controller.projectId
text: projectId.substring(0, 3) + "..." + projectId.substring(projectId.length - 3)
font.bold: true
}
}
StatusCheckBox {
id: hasActivePairingsCheckBox
text: "Has active pairings"
checked: settings.hasActivePairings
}
StatusCheckBox {
id: respondError
text: "Respond Error"
checked: false
}
StatusBaseText { text: "Pairings History"; font.bold: true }
StatusButton {
text: "Clear"
onClicked: { pairingsModel.clear(); root.saveListModel(pairingsModel); }
}
Pairings {
id: pairingsView
Layout.fillWidth: true
Layout.minimumWidth: count > 0 ? 400 : 0
Layout.preferredHeight: contentHeight
Layout.maximumHeight: 300
onDisconnect: function(pairingTopic) {
wc.sdk.disconnectPairing(pairingTopic)
}
model: ListModel {
id: pairingsModel
}
clip: true
}
RowLayout {
StatusButton {
text: "Trigger Deep-Link"
onClicked: {
wc.controller.requestOpenWalletConnectPopup(deepLinkInput.text)
}
}
StatusInput {
id: deepLinkInput
Layout.preferredWidth: 300
placeholderText: "wc:a4f32854428af0f5b66...."
}
}
// spacer
ColumnLayout {}
}
}
Settings {
id: settings
property bool hasActivePairings: hasActivePairingsCheckBox.checked
property string pairingsHistory: ""
}
Component.onCompleted: {
loadListModel(pairingsModel)
}
function saveListModel(model) {
var listArray = [];
for (var i = 0; i < model.count; i++) {
listArray.push(model.get(i));
}
settings.pairingsHistory = JSON.stringify(listArray);
}
function loadListModel(model) {
pairingsModel.clear();
if (!settings.pairingsHistory) {
return;
}
var listArray = JSON.parse(settings.pairingsHistory);
listArray.forEach(function(entry) {
pairingsModel.append(entry);
});
}
}
// category: Popups