fix: Removing and releasing ENS names

This commit is contained in:
Igor Sirotin 2022-12-07 00:12:09 +03:00 committed by Igor Sirotin
parent 1b81490c55
commit e436d6937d
11 changed files with 111 additions and 123 deletions

View File

@ -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)

View File

@ -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):

View File

@ -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()

View File

@ -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")

View File

@ -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 =

View File

@ -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)

View File

@ -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

View File

@ -147,5 +147,11 @@ QtObject {
return "" return ""
return ensUsernamesModule.getChainIdForEns() return ensUsernamesModule.getChainIdForEns()
} }
function removeEnsUsername(ensUsername) {
if(!root.ensUsernamesModule)
return ""
return ensUsernamesModule.removeEnsUsername(ensUsername)
}
} }

View File

@ -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

View File

@ -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

View File

@ -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 {
} }
} }
} }