fix: Removing and releasing ENS names
This commit is contained in:
parent
1b81490c55
commit
e436d6937d
|
@ -400,7 +400,6 @@ proc buildAndRegisterUserProfile(self: AppController) =
|
||||||
singletonInstance.userProfile.setDisplayName(displayName)
|
singletonInstance.userProfile.setDisplayName(displayName)
|
||||||
singletonInstance.userProfile.setPreferredName(preferredName)
|
singletonInstance.userProfile.setPreferredName(preferredName)
|
||||||
singletonInstance.userProfile.setEnsName(firstEnsName)
|
singletonInstance.userProfile.setEnsName(firstEnsName)
|
||||||
singletonInstance.userProfile.setFirstEnsName(firstEnsName)
|
|
||||||
singletonInstance.userProfile.setThumbnailImage(thumbnail)
|
singletonInstance.userProfile.setThumbnailImage(thumbnail)
|
||||||
singletonInstance.userProfile.setLargeImage(large)
|
singletonInstance.userProfile.setLargeImage(large)
|
||||||
singletonInstance.userProfile.setCurrentUserStatus(currentUserStatus.statusType.int)
|
singletonInstance.userProfile.setCurrentUserStatus(currentUserStatus.statusType.int)
|
||||||
|
|
|
@ -13,7 +13,6 @@ QtObject:
|
||||||
# fields which may change during runtime
|
# fields which may change during runtime
|
||||||
ensName: string
|
ensName: string
|
||||||
displayName: string
|
displayName: string
|
||||||
firstEnsName: string
|
|
||||||
preferredName: string
|
preferredName: string
|
||||||
thumbnailImage: string
|
thumbnailImage: string
|
||||||
largeImage: string
|
largeImage: string
|
||||||
|
@ -82,25 +81,6 @@ QtObject:
|
||||||
read = getEnsName
|
read = getEnsName
|
||||||
notify = nameChanged
|
notify = nameChanged
|
||||||
|
|
||||||
# this is not a slot
|
|
||||||
proc setFirstEnsName*(self: UserProfile, name: string) =
|
|
||||||
if(self.firstEnsName == name):
|
|
||||||
return
|
|
||||||
self.firstEnsName = name
|
|
||||||
self.nameChanged()
|
|
||||||
|
|
||||||
proc getFirstEnsName*(self: UserProfile): string {.slot.} =
|
|
||||||
self.firstEnsName
|
|
||||||
QtProperty[string] firstEnsName:
|
|
||||||
read = getFirstEnsName
|
|
||||||
notify = nameChanged
|
|
||||||
|
|
||||||
proc getPrettyFirstEnsName*(self: UserProfile): string {.slot.} =
|
|
||||||
self.firstEnsName
|
|
||||||
QtProperty[string] prettyFirstEnsName:
|
|
||||||
read = getPrettyFirstEnsName
|
|
||||||
notify = nameChanged
|
|
||||||
|
|
||||||
|
|
||||||
# this is not a slot
|
# this is not a slot
|
||||||
proc setPreferredName*(self: UserProfile, name: string) =
|
proc setPreferredName*(self: UserProfile, name: string) =
|
||||||
|
@ -137,8 +117,6 @@ QtObject:
|
||||||
proc getName*(self: UserProfile): string {.slot.} =
|
proc getName*(self: UserProfile): string {.slot.} =
|
||||||
if(self.preferredName.len > 0):
|
if(self.preferredName.len > 0):
|
||||||
return self.getPrettyPreferredName()
|
return self.getPrettyPreferredName()
|
||||||
elif(self.firstEnsName.len > 0):
|
|
||||||
return self.getPrettyFirstEnsName()
|
|
||||||
elif(self.ensName.len > 0):
|
elif(self.ensName.len > 0):
|
||||||
return self.ensName
|
return self.ensName
|
||||||
elif(self.displayName.len > 0):
|
elif(self.displayName.len > 0):
|
||||||
|
|
|
@ -88,6 +88,9 @@ proc getSigningPhrase*(self: Controller): string =
|
||||||
proc saveNewEnsUsername*(self: Controller, ensUsername: string): bool =
|
proc saveNewEnsUsername*(self: Controller, ensUsername: string): bool =
|
||||||
return self.settingsService.saveNewEnsUsername(ensUsername)
|
return self.settingsService.saveNewEnsUsername(ensUsername)
|
||||||
|
|
||||||
|
proc removeEnsUsername*(self: Controller, ensUsername: string): bool =
|
||||||
|
return self.settingsService.removeEnsUsername(ensUsername)
|
||||||
|
|
||||||
proc getPreferredEnsUsername*(self: Controller): string =
|
proc getPreferredEnsUsername*(self: Controller): string =
|
||||||
return self.settingsService.getPreferredName()
|
return self.settingsService.getPreferredName()
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,9 @@ method authenticateAndSetPubKey*(self: AccessInterface, ensUsername: string, add
|
||||||
maxPriorityFeePerGas: string, maxFeePerGas: string, eip1559Enabled: bool) {.base.} =
|
maxPriorityFeePerGas: string, maxFeePerGas: string, eip1559Enabled: bool) {.base.} =
|
||||||
raise newException(ValueError, "No implementation available")
|
raise newException(ValueError, "No implementation available")
|
||||||
|
|
||||||
|
method removeEnsUsername*(self: AccessInterface, ensUsername: string): bool {.base.} =
|
||||||
|
raise newException(ValueError, "No implementation available")
|
||||||
|
|
||||||
method releaseEnsEstimate*(self: AccessInterface, ensUsername: string, address: string): int {.base.} =
|
method releaseEnsEstimate*(self: AccessInterface, ensUsername: string, address: string): int {.base.} =
|
||||||
raise newException(ValueError, "No implementation available")
|
raise newException(ValueError, "No implementation available")
|
||||||
|
|
||||||
|
|
|
@ -177,6 +177,15 @@ method authenticateAndReleaseEns*(self: Module, ensUsername: string, address: st
|
||||||
else:
|
else:
|
||||||
self.controller.authenticateUser()
|
self.controller.authenticateUser()
|
||||||
|
|
||||||
|
method removeEnsUsername*(self: Module, ensUsername: string): bool =
|
||||||
|
if (not self.controller.removeEnsUsername(ensUsername)):
|
||||||
|
info "an error occurred removing ens username", methodName="removeEnsUsername"
|
||||||
|
return false
|
||||||
|
if (self.controller.getPreferredEnsUsername() == ensUsername):
|
||||||
|
self.controller.setPreferredName("")
|
||||||
|
self.view.model().removeItemByEnsUsername(ensUsername)
|
||||||
|
return true
|
||||||
|
|
||||||
method releaseEns*(self: Module, password: string) =
|
method releaseEns*(self: Module, password: string) =
|
||||||
let response = self.controller.release(
|
let response = self.controller.release(
|
||||||
self.tmpSendEnsTransactionDetails.ensUsername,
|
self.tmpSendEnsTransactionDetails.ensUsername,
|
||||||
|
@ -205,8 +214,7 @@ method releaseEns*(self: Module, password: string) =
|
||||||
|
|
||||||
var result: string
|
var result: string
|
||||||
if(responseObj.getProp("result", result)):
|
if(responseObj.getProp("result", result)):
|
||||||
self.controller.setPreferredName("")
|
let removed = self.removeEnsUsername(self.tmpSendEnsTransactionDetails.ensUsername)
|
||||||
self.view.model().removeItemByEnsUsername(self.tmpSendEnsTransactionDetails.ensUsername)
|
|
||||||
self.view.emitTransactionWasSentSignal(response)
|
self.view.emitTransactionWasSentSignal(response)
|
||||||
|
|
||||||
proc formatUsername(self: Module, ensUsername: string, isStatus: bool): string =
|
proc formatUsername(self: Module, ensUsername: string, isStatus: bool): string =
|
||||||
|
|
|
@ -91,6 +91,9 @@ QtObject:
|
||||||
revertReason: string) =
|
revertReason: string) =
|
||||||
self.transactionCompleted(success, txHash, username, trxType, revertReason)
|
self.transactionCompleted(success, txHash, username, trxType, revertReason)
|
||||||
|
|
||||||
|
proc removeEnsUsername*(self: View, ensUsername: string): bool {.slot.} =
|
||||||
|
return self.delegate.removeEnsUsername(ensUsername)
|
||||||
|
|
||||||
proc releaseEnsEstimate*(self: View, ensUsername: string, address: string): int {.slot.} =
|
proc releaseEnsEstimate*(self: View, ensUsername: string, address: string): int {.slot.} =
|
||||||
return self.delegate.releaseEnsEstimate(ensUsername, address)
|
return self.delegate.releaseEnsEstimate(ensUsername, address)
|
||||||
|
|
||||||
|
|
|
@ -163,6 +163,19 @@ QtObject:
|
||||||
return true
|
return true
|
||||||
return false
|
return false
|
||||||
|
|
||||||
|
proc removeEnsUsername*(self: Service, username: string): bool =
|
||||||
|
var newEnsUsernames = self.settings.ensUsernames
|
||||||
|
let index = newEnsUsernames.find(username)
|
||||||
|
if (index < 0):
|
||||||
|
return false
|
||||||
|
newEnsUsernames.delete(index)
|
||||||
|
let newEnsUsernamesAsJson = %* newEnsUsernames
|
||||||
|
|
||||||
|
if(self.saveSetting(KEY_ENS_USERNAMES, newEnsUsernamesAsJson)):
|
||||||
|
self.settings.ensUsernames = newEnsUsernames
|
||||||
|
return true
|
||||||
|
return false
|
||||||
|
|
||||||
proc getEnsUsernames*(self: Service): seq[string] =
|
proc getEnsUsernames*(self: Service): seq[string] =
|
||||||
return self.settings.ensUsernames
|
return self.settings.ensUsernames
|
||||||
|
|
||||||
|
|
|
@ -147,5 +147,11 @@ QtObject {
|
||||||
return ""
|
return ""
|
||||||
return ensUsernamesModule.getChainIdForEns()
|
return ensUsernamesModule.getChainIdForEns()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function removeEnsUsername(ensUsername) {
|
||||||
|
if(!root.ensUsernamesModule)
|
||||||
|
return ""
|
||||||
|
return ensUsernamesModule.removeEnsUsername(ensUsername)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ QtObject {
|
||||||
property string name: userProfile.name // in case of ens returns pretty ens form
|
property string name: userProfile.name // in case of ens returns pretty ens form
|
||||||
property string username: userProfile.username
|
property string username: userProfile.username
|
||||||
property string displayName: userProfile.displayName
|
property string displayName: userProfile.displayName
|
||||||
property string ensName: userProfile.preferredName || userProfile.firstEnsName || userProfile.ensName
|
property string ensName: userProfile.preferredName || userProfile.ensName
|
||||||
property string profileLargeImage: userProfile.largeImage
|
property string profileLargeImage: userProfile.largeImage
|
||||||
property string icon: userProfile.icon
|
property string icon: userProfile.icon
|
||||||
property bool userDeclinedBackupBanner: localAccountSensitiveSettings.userDeclinedBackupBanner
|
property bool userDeclinedBackupBanner: localAccountSensitiveSettings.userDeclinedBackupBanner
|
||||||
|
|
|
@ -18,11 +18,16 @@ Item {
|
||||||
property string username: ""
|
property string username: ""
|
||||||
property string walletAddress: "-"
|
property string walletAddress: "-"
|
||||||
property string key: "-"
|
property string key: "-"
|
||||||
property var expiration: 0
|
|
||||||
|
|
||||||
signal backBtnClicked();
|
signal backBtnClicked();
|
||||||
signal usernameReleased(username: string);
|
signal usernameReleased(username: string);
|
||||||
|
|
||||||
|
QtObject {
|
||||||
|
id: d
|
||||||
|
|
||||||
|
property int expirationTimestamp: 0
|
||||||
|
}
|
||||||
|
|
||||||
StatusBaseText {
|
StatusBaseText {
|
||||||
id: sectionTitle
|
id: sectionTitle
|
||||||
text: username
|
text: username
|
||||||
|
@ -60,18 +65,21 @@ Item {
|
||||||
walletAddressLbl.visible = true;
|
walletAddressLbl.visible = true;
|
||||||
keyLbl.visible = true;
|
keyLbl.visible = true;
|
||||||
releaseBtn.visible = isStatus
|
releaseBtn.visible = isStatus
|
||||||
releaseBtn.enabled = (Date.now() / 1000) > expirationTime && expirationTime > 0 &&
|
removeButton.visible = true
|
||||||
root.ensUsernamesStore.preferredUsername != username
|
releaseBtn.enabled = expirationTime > 0
|
||||||
releaseBtn.enabled = true
|
&& (Date.now() / 1000) > expirationTime
|
||||||
expiration = new Date(expirationTime * 1000).getTime()
|
&& root.ensUsernamesStore.preferredUsername !== username
|
||||||
|
d.expirationTimestamp = expirationTime * 1000
|
||||||
}
|
}
|
||||||
onLoading: {
|
onLoading: {
|
||||||
loadingImg.active = isLoading
|
loadingImg.active = isLoading
|
||||||
if(!isLoading) return;
|
if (!isLoading)
|
||||||
|
return;
|
||||||
walletAddressLbl.visible = false;
|
walletAddressLbl.visible = false;
|
||||||
keyLbl.visible = false;
|
keyLbl.visible = false;
|
||||||
releaseBtn.visible = false;
|
releaseBtn.visible = false;
|
||||||
expiration = 0;
|
removeButton.visible = false;
|
||||||
|
d.expirationTimestamp = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,31 +179,49 @@ Item {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
StatusQControls.StatusButton {
|
RowLayout {
|
||||||
id: releaseBtn
|
id: actionsLayout
|
||||||
visible: false
|
|
||||||
enabled: false
|
|
||||||
anchors.top: keyLbl.bottom
|
anchors.top: keyLbl.bottom
|
||||||
anchors.topMargin: 24
|
anchors.topMargin: 24
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.leftMargin: 24
|
anchors.leftMargin: 24
|
||||||
text: qsTr("Release username")
|
|
||||||
onClicked: {
|
StatusQControls.StatusButton {
|
||||||
Global.openPopup(transactionDialogComponent)
|
id: removeButton
|
||||||
|
visible: false
|
||||||
|
type: StatusQControls.StatusBaseButton.Type.Danger
|
||||||
|
text: qsTr("Remove username")
|
||||||
|
onClicked: {
|
||||||
|
root.ensUsernamesStore.removeEnsUsername(root.username)
|
||||||
|
root.backBtnClicked()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
StatusQControls.StatusButton {
|
||||||
|
id: releaseBtn
|
||||||
|
visible: false
|
||||||
|
enabled: false
|
||||||
|
text: qsTr("Release username")
|
||||||
|
onClicked: {
|
||||||
|
Global.openPopup(transactionDialogComponent)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
visible: releaseBtn.visible && !releaseBtn.enabled
|
visible: releaseBtn.visible && !releaseBtn.enabled
|
||||||
anchors.top: releaseBtn.bottom
|
anchors.top: actionsLayout.bottom
|
||||||
anchors.topMargin: 2
|
anchors.topMargin: 2
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.leftMargin: 24
|
anchors.leftMargin: 24
|
||||||
text: qsTr("Username locked. You won't be able to release it until %1").arg(Utils.formatShortDateStr(new Date(expiration).toDateString()))
|
text: {
|
||||||
|
const formattedDate = Utils.formatShortDate(d.expirationTimestamp, localAccountSensitiveSettings.isDDMMYYDateFormat)
|
||||||
|
return qsTr("Username locked. You won't be able to release it until %1").arg(formattedDate)
|
||||||
|
}
|
||||||
color: Style.current.darkGrey
|
color: Style.current.darkGrey
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
StatusQControls.StatusButton {
|
StatusQControls.StatusButton {
|
||||||
anchors.bottom: parent.bottom
|
anchors.bottom: parent.bottom
|
||||||
anchors.bottomMargin: Style.current.padding
|
anchors.bottomMargin: Style.current.padding
|
||||||
|
|
|
@ -55,83 +55,6 @@ Item {
|
||||||
width: profileContentWidth
|
width: profileContentWidth
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
|
||||||
Component {
|
|
||||||
id: statusENS
|
|
||||||
Item {
|
|
||||||
Text {
|
|
||||||
id: usernameTxt
|
|
||||||
text: username.substr(0, username.indexOf(".")) + " " + (isPending ? qsTr("(pending)") : "")
|
|
||||||
color: Style.current.textColor
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
|
|
||||||
anchors.top: usernameTxt.bottom
|
|
||||||
anchors.topMargin: 2
|
|
||||||
text: username.substr(username.indexOf("."))
|
|
||||||
color: Theme.palette.baseColor1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Component {
|
|
||||||
id: normalENS
|
|
||||||
Item {
|
|
||||||
Text {
|
|
||||||
id: usernameTxt
|
|
||||||
text: username + " " + (isPending ? qsTr("(pending)") : "")
|
|
||||||
font.pixelSize: 16
|
|
||||||
color: Theme.palette.directColor1
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.topMargin: 5
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Component {
|
|
||||||
id: ensDelegate
|
|
||||||
Item {
|
|
||||||
height: 45
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: parent.right
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
enabled: !model.isPending
|
|
||||||
anchors.fill: parent
|
|
||||||
cursorShape:enabled ? Qt.PointingHandCursor : Qt.ArrowCursor
|
|
||||||
onClicked: selectEns(model.ensUsername)
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: circle
|
|
||||||
width: 35
|
|
||||||
height: 35
|
|
||||||
radius: 35
|
|
||||||
color: Theme.palette.primaryColor1
|
|
||||||
|
|
||||||
StatusBaseText {
|
|
||||||
text: "@"
|
|
||||||
opacity: 0.7
|
|
||||||
font.weight: Font.Bold
|
|
||||||
font.pixelSize: 16
|
|
||||||
color: Theme.palette.indirectColor1
|
|
||||||
anchors.centerIn: parent
|
|
||||||
verticalAlignment: Text.AlignVCenter
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Loader {
|
|
||||||
sourceComponent: model.ensUsername.endsWith(".stateofus.eth") ? statusENS : normalENS
|
|
||||||
property string username: model.ensUsername
|
|
||||||
property bool isPending: model.isPending
|
|
||||||
active: true
|
|
||||||
anchors.left: circle.right
|
|
||||||
anchors.leftMargin: Style.current.smallPadding
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
StatusBaseText {
|
StatusBaseText {
|
||||||
id: sectionTitle
|
id: sectionTitle
|
||||||
text: qsTr("ENS usernames")
|
text: qsTr("ENS usernames")
|
||||||
|
@ -201,9 +124,36 @@ Item {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
model: root.ensUsernamesStore.ensUsernamesModel
|
model: root.ensUsernamesStore.ensUsernamesModel
|
||||||
spacing: 10
|
spacing: 10
|
||||||
delegate: ensDelegate
|
delegate: StatusListItem {
|
||||||
|
readonly property int indexOfDomainStart: model.ensUsername.indexOf(".")
|
||||||
|
|
||||||
|
width: ListView.view.width
|
||||||
|
title: model.ensUsername.substr(0, indexOfDomainStart)
|
||||||
|
subTitle: model.ensUsername.substr(indexOfDomainStart)
|
||||||
|
titleAsideText: model.isPending ? qsTr("(pending)") : ""
|
||||||
|
|
||||||
|
statusListItemTitle.font.pixelSize: 17
|
||||||
|
statusListItemTitle.font.bold: true
|
||||||
|
|
||||||
|
asset.isImage: false
|
||||||
|
asset.isLetterIdenticon: true
|
||||||
|
asset.bgColor: Theme.palette.primaryColor1
|
||||||
|
asset.width: 40
|
||||||
|
asset.height: 40
|
||||||
|
|
||||||
|
components: [
|
||||||
|
StatusIcon {
|
||||||
|
icon: "chevron-down"
|
||||||
|
rotation: 270
|
||||||
|
color: Theme.palette.baseColor1
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
onClicked: {
|
||||||
|
root.selectEns(model.ensUsername)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ScrollBar.vertical: ScrollBar { policy: ScrollBar.AsNeeded }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -306,4 +256,3 @@ Item {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue