feat: show ENS username details
This commit is contained in:
parent
9d5c71fb4e
commit
71fee14add
|
@ -95,6 +95,26 @@ QtObject:
|
||||||
self.setPreferredUsername(ensUsername)
|
self.setPreferredUsername(ensUsername)
|
||||||
self.add ensUsername
|
self.add ensUsername
|
||||||
|
|
||||||
|
proc loading(self: EnsManager, isLoading: bool) {.signal.}
|
||||||
|
|
||||||
|
proc details(self: EnsManager, username: string) {.slot.} =
|
||||||
|
self.loading(true)
|
||||||
|
spawnAndSend(self, "setDetails") do:
|
||||||
|
let address = status_ens.address(username)
|
||||||
|
let pubkey = status_ens.pubkey(username)
|
||||||
|
$(%* {
|
||||||
|
"ensName": username,
|
||||||
|
"address": address,
|
||||||
|
"pubkey": pubkey
|
||||||
|
})
|
||||||
|
|
||||||
|
proc detailsObtained(self: EnsManager, ensName: string, address: string, pubkey: string) {.signal.}
|
||||||
|
|
||||||
|
proc setDetails(self: EnsManager, details: string): string {.slot.} =
|
||||||
|
self.loading(false)
|
||||||
|
let detailsJson = details.parseJson
|
||||||
|
self.detailsObtained(detailsJson["ensName"].getStr, detailsJson["address"].getStr, detailsJson["pubkey"].getStr)
|
||||||
|
|
||||||
method rowCount(self: EnsManager, index: QModelIndex = nil): int =
|
method rowCount(self: EnsManager, index: QModelIndex = nil): int =
|
||||||
return self.usernames.len
|
return self.usernames.len
|
||||||
|
|
||||||
|
|
|
@ -81,7 +81,6 @@ proc pubkey*(username: string): string =
|
||||||
var userNameHash = namehash(addDomain(username))
|
var userNameHash = namehash(addDomain(username))
|
||||||
userNameHash.removePrefix("0x")
|
userNameHash.removePrefix("0x")
|
||||||
let ensResolver = resolver(userNameHash)
|
let ensResolver = resolver(userNameHash)
|
||||||
echo ensResolver
|
|
||||||
let payload = %* [{
|
let payload = %* [{
|
||||||
"to": ensResolver,
|
"to": ensResolver,
|
||||||
"from": "0x0000000000000000000000000000000000000000",
|
"from": "0x0000000000000000000000000000000000000000",
|
||||||
|
@ -95,3 +94,20 @@ proc pubkey*(username: string): string =
|
||||||
else:
|
else:
|
||||||
pubkey.removePrefix("0x")
|
pubkey.removePrefix("0x")
|
||||||
result = "0x04" & pubkey
|
result = "0x04" & pubkey
|
||||||
|
|
||||||
|
const address_signature = "0x3b3b57de" # addr(bytes32 node)
|
||||||
|
proc address*(username: string): string =
|
||||||
|
var userNameHash = namehash(addDomain(username))
|
||||||
|
userNameHash.removePrefix("0x")
|
||||||
|
let ensResolver = resolver(userNameHash)
|
||||||
|
let payload = %* [{
|
||||||
|
"to": ensResolver,
|
||||||
|
"from": "0x0000000000000000000000000000000000000000",
|
||||||
|
"data": fmt"{address_signature}{userNameHash}"
|
||||||
|
}, "latest"]
|
||||||
|
let response = callPrivateRPC("eth_call", payload)
|
||||||
|
# TODO: error handling
|
||||||
|
let address = response.parseJson["result"].getStr;
|
||||||
|
if address == "0x0000000000000000000000000000000000000000000000000000000000000000":
|
||||||
|
return ""
|
||||||
|
result = "0x" & address.substr(26)
|
|
@ -0,0 +1,90 @@
|
||||||
|
import QtQuick 2.14
|
||||||
|
import QtQuick.Layouts 1.3
|
||||||
|
import QtQuick.Controls 2.14
|
||||||
|
import "../../../../../imports"
|
||||||
|
import "../../../../../shared"
|
||||||
|
|
||||||
|
Item {
|
||||||
|
property var onClick: function(){}
|
||||||
|
property string username: ""
|
||||||
|
property string walletAddress: "-"
|
||||||
|
property string key: "-"
|
||||||
|
|
||||||
|
StyledText {
|
||||||
|
id: sectionTitle
|
||||||
|
text: username
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: 24
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.topMargin: 24
|
||||||
|
font.weight: Font.Bold
|
||||||
|
font.pixelSize: 20
|
||||||
|
}
|
||||||
|
|
||||||
|
Component {
|
||||||
|
id: loadingImageComponent
|
||||||
|
LoadingImage {}
|
||||||
|
}
|
||||||
|
|
||||||
|
Loader {
|
||||||
|
id: loadingImg
|
||||||
|
active: false
|
||||||
|
sourceComponent: loadingImageComponent
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.rightMargin: Style.current.padding
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.topMargin: Style.currentPadding
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: profileModel.ens
|
||||||
|
onDetailsObtained: {
|
||||||
|
if(username != ensName) return;
|
||||||
|
walletAddressLbl.text = address;
|
||||||
|
walletAddressLbl.textToCopy = address;
|
||||||
|
keyLbl.text = pubkey.substring(0, 20) + "..." + pubkey.substring(pubkey.length - 20);
|
||||||
|
keyLbl.textToCopy = pubkey;
|
||||||
|
walletAddressLbl.visible = true;
|
||||||
|
keyLbl.visible = true;
|
||||||
|
}
|
||||||
|
onLoading: {
|
||||||
|
console.log("ABC")
|
||||||
|
loadingImg.active = isLoading
|
||||||
|
if(!isLoading) return;
|
||||||
|
walletAddressLbl.visible = false;
|
||||||
|
keyLbl.visible = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TextWithLabel {
|
||||||
|
id: walletAddressLbl
|
||||||
|
label: qsTr("Wallet address")
|
||||||
|
visible: false
|
||||||
|
text: ""
|
||||||
|
textToCopy: ""
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: 24
|
||||||
|
anchors.top: sectionTitle.bottom
|
||||||
|
anchors.topMargin: 24
|
||||||
|
}
|
||||||
|
|
||||||
|
TextWithLabel {
|
||||||
|
id: keyLbl
|
||||||
|
visible: false
|
||||||
|
label: qsTr("Key")
|
||||||
|
text: ""
|
||||||
|
textToCopy: ""
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: 24
|
||||||
|
anchors.top: walletAddressLbl.bottom
|
||||||
|
anchors.topMargin: 24
|
||||||
|
}
|
||||||
|
|
||||||
|
StyledButton {
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.bottomMargin: Style.current.padding
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
label: qsTr("Back")
|
||||||
|
onClicked: onClick()
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,6 +7,7 @@ import "../../../Chat/ChatColumn/MessageComponents"
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
property var onClick: function(){}
|
property var onClick: function(){}
|
||||||
|
property var onSelectENS: function(){}
|
||||||
|
|
||||||
// Defaults to show message
|
// Defaults to show message
|
||||||
property bool isMessage: true
|
property bool isMessage: true
|
||||||
|
@ -57,6 +58,14 @@ Item {
|
||||||
id: ensDelegate
|
id: ensDelegate
|
||||||
Item {
|
Item {
|
||||||
height: 45
|
height: 45
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
cursorShape: Qt.PointingHandCursor
|
||||||
|
onClicked: onSelectENS(model.username)
|
||||||
|
}
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
id: circle
|
id: circle
|
||||||
|
@ -75,6 +84,7 @@ Item {
|
||||||
verticalAlignment: Text.AlignVCenter
|
verticalAlignment: Text.AlignVCenter
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Loader {
|
Loader {
|
||||||
sourceComponent: model.username.endsWith(".stateofus.eth") ? statusENS : normalENS
|
sourceComponent: model.username.endsWith(".stateofus.eth") ? statusENS : normalENS
|
||||||
|
@ -84,10 +94,6 @@ Item {
|
||||||
anchors.leftMargin: Style.current.smallPadding
|
anchors.leftMargin: Style.current.smallPadding
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ENSPopup {
|
ENSPopup {
|
||||||
|
|
|
@ -13,8 +13,10 @@ Item {
|
||||||
|
|
||||||
property bool showSearchScreen: false
|
property bool showSearchScreen: false
|
||||||
property string addedUsername: ""
|
property string addedUsername: ""
|
||||||
|
property string selectedUsername: ""
|
||||||
|
|
||||||
signal next(output: string)
|
signal next(output: string)
|
||||||
|
signal back()
|
||||||
signal connect(ensUsername: string)
|
signal connect(ensUsername: string)
|
||||||
|
|
||||||
signal goToWelcome();
|
signal goToWelcome();
|
||||||
|
@ -96,6 +98,31 @@ Item {
|
||||||
DSM.SignalTransition {
|
DSM.SignalTransition {
|
||||||
targetState: searchState
|
targetState: searchState
|
||||||
signal: next
|
signal: next
|
||||||
|
guard: output === "search"
|
||||||
|
}
|
||||||
|
DSM.SignalTransition {
|
||||||
|
targetState: detailsState
|
||||||
|
signal: next
|
||||||
|
guard: output === "details"
|
||||||
|
}
|
||||||
|
DSM.SignalTransition {
|
||||||
|
targetState: listState
|
||||||
|
signal: goToList
|
||||||
|
}
|
||||||
|
DSM.SignalTransition {
|
||||||
|
targetState: welcomeState
|
||||||
|
signal: goToWelcome
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DSM.State {
|
||||||
|
id: detailsState
|
||||||
|
onEntered: {
|
||||||
|
loader.sourceComponent = details;
|
||||||
|
}
|
||||||
|
DSM.SignalTransition {
|
||||||
|
targetState: listState
|
||||||
|
signal: back
|
||||||
}
|
}
|
||||||
DSM.SignalTransition {
|
DSM.SignalTransition {
|
||||||
targetState: listState
|
targetState: listState
|
||||||
|
@ -170,7 +197,22 @@ Item {
|
||||||
id: list
|
id: list
|
||||||
List {
|
List {
|
||||||
onClick: function(){
|
onClick: function(){
|
||||||
next(null);
|
next("search");
|
||||||
|
}
|
||||||
|
onSelectENS: function(username){
|
||||||
|
profileModel.ens.details(username)
|
||||||
|
selectedUsername = username;
|
||||||
|
next("details")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Component {
|
||||||
|
id: details
|
||||||
|
ENSDetails {
|
||||||
|
username: selectedUsername
|
||||||
|
onClick: function(){
|
||||||
|
back()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue