From 18a50c6de5ae539a62642951bc0988dee4af0239 Mon Sep 17 00:00:00 2001 From: Dario Gabriel Lipicar Date: Thu, 21 Sep 2023 09:58:36 -0300 Subject: [PATCH] feat(@desktop/wallet): add community info to collectibles Fixes #12172 --- .../collectible_details_entry.nim | 41 ++++++++++ .../shared_models/collectibles_item.nim | 33 +++++++- .../shared_models/collectibles_model.nim | 21 +++++ .../shared_models/collectibles_utils.nim | 19 ++++- src/backend/collectibles_types.nim | 78 ++++++++++++++++++- src/backend/community_tokens_types.nim | 4 + vendor/status-go | 2 +- 7 files changed, 190 insertions(+), 8 deletions(-) create mode 100644 src/backend/community_tokens_types.nim diff --git a/src/app/modules/shared_models/collectible_details_entry.nim b/src/app/modules/shared_models/collectible_details_entry.nim index 781b99b78f..50cf350eb1 100644 --- a/src/app/modules/shared_models/collectible_details_entry.nim +++ b/src/app/modules/shared_models/collectible_details_entry.nim @@ -1,4 +1,5 @@ import NimQml, json, strformat, sequtils, strutils, stint, strutils +import options import backend/collectibles as backend import collectible_trait_model @@ -157,6 +158,46 @@ QtObject: QtProperty[string] networkShortName: read = getNetworkShortName + proc getCommunityId*(self: CollectibleDetailsEntry): string {.slot.} = + if self.data == nil or isNone(self.data.communityInfo): + return "" + return self.data.communityInfo.get().communityId + + QtProperty[string] communityId: + read = getCommunityId + + proc getCommunityName*(self: CollectibleDetailsEntry): string {.slot.} = + if self.data == nil or isNone(self.data.communityInfo): + return "" + return self.data.communityInfo.get().communityName + + QtProperty[string] communityName: + read = getCommunityName + + proc getCommunityColor*(self: CollectibleDetailsEntry): string {.slot.} = + if self.data == nil or isNone(self.data.communityInfo): + return "" + return self.data.communityInfo.get().communityColor + + QtProperty[string] communityColor: + read = getCommunityColor + + proc getCommunityImage*(self: CollectibleDetailsEntry): string {.slot.} = + if self.data == nil or isNone(self.data.communityInfo): + return "" + return self.data.communityInfo.get().communityImage + + QtProperty[string] communityImage: + read = getCommunityImage + + proc getCommunityPrivilegesLevel*(self: CollectibleDetailsEntry): int {.slot.} = + if self.data == nil or isNone(self.data.communityInfo): + return 0 + return int(self.data.communityInfo.get().privilegesLevel) + + QtProperty[int] communityPrivilegesLevel: + read = getCommunityPrivilegesLevel + proc getNetworkColor*(self: CollectibleDetailsEntry): string {.slot.} = return self.extradata.networkColor diff --git a/src/app/modules/shared_models/collectibles_item.nim b/src/app/modules/shared_models/collectibles_item.nim index 38c2b1d07d..4b18f57f42 100644 --- a/src/app/modules/shared_models/collectibles_item.nim +++ b/src/app/modules/shared_models/collectibles_item.nim @@ -15,6 +15,10 @@ type collectionImageUrl: string isLoading: bool isPinned: bool + communityId: string + communityName: string + communityColor: string + communityPrivilegesLevel: int proc initItem*( chainId: int, @@ -28,7 +32,12 @@ proc initItem*( collectionName: string, collectionSlug: string, collectionImageUrl: string, - isPinned: bool + isPinned: bool, + communityId: string, + communityName: string, + communityColor: string, + communityPrivilegesLevel: int + ): Item = result.chainId = chainId result.contractAddress = contractAddress @@ -43,9 +52,13 @@ proc initItem*( result.collectionImageUrl = collectionImageUrl result.isLoading = false result.isPinned = isPinned + result.communityId = communityId + result.communityName = communityName + result.communityColor = communityColor + result.communityPrivilegesLevel = communityPrivilegesLevel proc initItem*: Item = - result = initItem(0, "", u256(0), "", "", "", "", "transparent", "Collectibles", "", "", false) + result = initItem(0, "", u256(0), "", "", "", "", "transparent", "Collectibles", "", "", false, "", "", "", 0) proc initLoadingItem*: Item = result = initItem() @@ -66,6 +79,10 @@ proc `$`*(self: Item): string = collectionImageUrl: {self.collectionImageUrl}, isLoading: {self.isLoading}, isPinned: {self.isPinned}, + communityId: {self.communityId}, + communityName: {self.communityName}, + communityColor: {self.communityColor}, + communityPrivilegesLevel: {self.communityPrivilegesLevel}, ]""" proc getChainId*(self: Item): int = @@ -114,3 +131,15 @@ proc getIsLoading*(self: Item): bool = proc getIsPinned*(self: Item): bool = return self.isPinned + +proc getCommunityId*(self: Item): string = + return self.communityId + +proc getCommunityName*(self: Item): string = + return self.communityName + +proc getCommunityColor*(self: Item): string = + return self.communityColor + +proc getCommunityPrivilegesLevel*(self: Item): int = + return self.communityPrivilegesLevel diff --git a/src/app/modules/shared_models/collectibles_model.nim b/src/app/modules/shared_models/collectibles_model.nim index 0ee4c5aca4..298a8ac6f1 100644 --- a/src/app/modules/shared_models/collectibles_model.nim +++ b/src/app/modules/shared_models/collectibles_model.nim @@ -21,6 +21,11 @@ type CollectionSlug IsLoading IsPinned + # Community-related roles + CommunityId + CommunityName + CommunityColor + CommunityPrivilegesLevel const loadingItemsCount = 10 @@ -154,6 +159,10 @@ QtObject: CollectibleRole.CollectionSlug.int:"collectionSlug", CollectibleRole.IsLoading.int:"isLoading", CollectibleRole.IsPinned.int:"isPinned", + CollectibleRole.CommunityId.int:"communityId", + CollectibleRole.CommunityName.int:"communityName", + CollectibleRole.CommunityColor.int:"communityColor", + CollectibleRole.CommunityPrivilegesLevel.int:"communityPrivilegesLevel", }.toTable method data(self: Model, index: QModelIndex, role: int): QVariant = @@ -196,6 +205,14 @@ QtObject: result = newQVariant(false) of CollectibleRole.IsPinned: result = newQVariant(item.getIsPinned()) + of CollectibleRole.CommunityId: + result = newQVariant(item.getCommunityId()) + of CollectibleRole.CommunityName: + result = newQVariant(item.getCommunityName()) + of CollectibleRole.CommunityColor: + result = newQVariant(item.getCommunityColor()) + of CollectibleRole.CommunityPrivilegesLevel: + result = newQVariant(item.getCommunityPrivilegesLevel()) else: # Loading item case enumRole: @@ -224,6 +241,10 @@ QtObject: of "collectionSlug": result = item.getCollectionSlug() of "isLoading": result = $false of "isPinned": result = $item.getIsPinned() + of "communityId": result = item.getCommunityId() + of "communityName": result = item.getCommunityName() + of "communityColor": result = item.getCommunityColor() + of "communityPrivilegesLevel": result = $item.getCommunityPrivilegesLevel() proc appendCollectibleItems(self: Model, newItems: seq[Item]) = if len(newItems) == 0: diff --git a/src/app/modules/shared_models/collectibles_utils.nim b/src/app/modules/shared_models/collectibles_utils.nim index 8597cb4fb7..101a34680a 100644 --- a/src/app/modules/shared_models/collectibles_utils.nim +++ b/src/app/modules/shared_models/collectibles_utils.nim @@ -1,4 +1,4 @@ -import sequtils, sugar, times +import sequtils, sugar, times, options import backend/collectibles as backend import collectibles_item @@ -9,6 +9,17 @@ proc collectibleToItem*(c: backend.CollectibleHeader, isPinned: bool = false) : mediaUrl = c.imageUrl mediaType = "image" + var communityId = "" + var communityName = "" + var communityColor = "" + var communityPrivilegesLevel = 0 + if isSome(c.communityHeader): + let communityHeader = c.communityHeader.get() + communityId = communityHeader.communityId + communityName = communityHeader.communityName + communityColor = communityHeader.communityColor + communityPrivilegesLevel = int(communityHeader.privilegesLevel) + return initItem( c.id.contractID.chainID, c.id.contractID.address, @@ -21,5 +32,9 @@ proc collectibleToItem*(c: backend.CollectibleHeader, isPinned: bool = false) : c.collectionName, c.collectionSlug, c.collectionImageUrl, - isPinned + isPinned, + communityId, + communityName, + communityColor, + communityPrivilegesLevel ) diff --git a/src/backend/collectibles_types.nim b/src/backend/collectibles_types.nim index f00eadcc34..7b5e234972 100644 --- a/src/backend/collectibles_types.nim +++ b/src/backend/collectibles_types.nim @@ -1,5 +1,9 @@ import json, strformat -import stint, Tables +import stint, Tables, options +import community_tokens_types + +const communityHeaderField = "community_header" +const communityInfoField = "community_info" type # Mirrors services/wallet/thirdparty/collectible_types.go ContractID @@ -34,6 +38,7 @@ type # Mirrors services/wallet/thirdparty/collectible_types.go CollectibleData CollectibleData* = ref object of RootObj id* : CollectibleUniqueID + communityId*: string name*: string description*: string permalink*: string @@ -45,6 +50,13 @@ type tokenUri*: string collectionData*: CollectionData + # Mirrors services/wallet/collectibles/types.go CommunityHeader + CollectibleCommunityHeader* = ref object of RootObj + communityId*: string + communityName*: string + communityColor*: string + privilegesLevel*: PrivilegesLevel + # Mirrors services/wallet/collectibles/types.go CollectibleHeader CollectibleHeader* = ref object of RootObj id* : CollectibleUniqueID @@ -56,6 +68,15 @@ type collectionName*: string collectionSlug*: string collectionImageUrl*: string + communityHeader*: Option[CollectibleCommunityHeader] + + # Mirrors services/wallet/thirdparty/collectible_types.go CollectiblesCommunityInfo + CollectibleCommunityInfo* = ref object of RootObj + communityId*: string + communityName*: string + communityColor*: string + communityImage*: string + privilegesLevel*: PrivilegesLevel # Mirrors services/wallet/collectibles/types.go CollectibleDetails CollectibleDetails* = ref object of RootObj @@ -71,6 +92,7 @@ type collectionName*: string collectionSlug*: string collectionImageUrl*: string + communityInfo*: Option[CollectibleCommunityInfo] # Mirrors services/wallet/thirdparty/collectible_types.go TokenBalance CollectibleBalance* = ref object @@ -209,6 +231,7 @@ proc fromJson*(t: JsonNode, T: typedesc[ref CollectionData]): ref CollectionData proc `$`*(self: CollectibleData): string = return fmt"""CollectibleData( id:{self.id}, + communityId:{self.communityId}, name:{self.name}, description:{self.description}, permalink:{self.permalink}, @@ -229,6 +252,7 @@ proc getCollectibleTraits*(t: JsonNode): seq[CollectibleTrait] = proc fromJson*(t: JsonNode, T: typedesc[CollectibleData]): CollectibleData {.inline.} = result = CollectibleData() result.id = fromJson(t["id"], CollectibleUniqueID) + result.communityId = t["community_id"].getStr() result.name = t["name"].getStr() result.description = t["description"].getStr() result.permalink = t["permalink"].getStr() @@ -243,6 +267,26 @@ proc fromJson*(t: JsonNode, T: typedesc[ref CollectibleData]): ref CollectibleDa result = new(CollectibleData) result[] = fromJson(t, CollectibleData) +# CollectibleCommunityHeader +proc `$`*(self: CollectibleCommunityHeader): string = + return fmt"""CollectibleCommunityHeader( + communityId:{self.communityId}, + communityName:{self.communityName}, + communityColor:{self.communityColor}, + privilegesLevel:{self.privilegesLevel} + )""" + +proc fromJson*(t: JsonNode, T: typedesc[CollectibleCommunityHeader]): CollectibleCommunityHeader {.inline.} = + result = CollectibleCommunityHeader() + result.communityId = t["community_id"].getStr + result.communityName = t["community_name"].getStr + result.communityColor = t["community_color"].getStr + result.privilegesLevel = PrivilegesLevel(t["privileges_level"].getInt) + +proc fromJson*(t: JsonNode, T: typedesc[ref CollectibleCommunityHeader]): ref CollectibleCommunityHeader {.inline.} = + result = new(CollectibleCommunityHeader) + result[] = fromJson(t, CollectibleCommunityHeader) + # CollectibleHeader proc `$`*(self: CollectibleHeader): string = return fmt"""CollectibleHeader( @@ -254,7 +298,8 @@ proc `$`*(self: CollectibleHeader): string = backgroundColor:{self.backgroundColor}, collectionName:{self.collectionName}, collectionSlug:{self.collectionSlug}, - collectionImageUrl:{self.collectionImageUrl} + collectionImageUrl:{self.collectionImageUrl}, + communityHeader:{self.communityHeader} )""" proc fromJson*(t: JsonNode, T: typedesc[CollectibleHeader]): CollectibleHeader {.inline.} = @@ -268,6 +313,30 @@ proc fromJson*(t: JsonNode, T: typedesc[CollectibleHeader]): CollectibleHeader { result.collectionName = t["collection_name"].getStr() result.collectionSlug = t["collection_slug"].getStr() result.collectionImageUrl = t["collection_image_url"].getStr() + if t.contains(communityHeaderField) and t[communityHeaderField].kind != JNull: + result.communityHeader = some(fromJson(t[communityHeaderField], CollectibleCommunityHeader)) + +# CollectibleCommunityInfo +proc `$`*(self: CollectibleCommunityInfo): string = + return fmt"""CollectibleCommunityInfo( + communityId:{self.communityId}, + communityName:{self.communityName}, + communityColor:{self.communityColor}, + communityImage:{self.communityImage}, + privilegesLevel:{self.privilegesLevel} + )""" + +proc fromJson*(t: JsonNode, T: typedesc[CollectibleCommunityInfo]): CollectibleCommunityInfo {.inline.} = + result = CollectibleCommunityInfo() + result.communityId = t["community_id"].getStr + result.communityName = t["community_name"].getStr + result.communityColor = t["community_color"].getStr + result.communityImage = t["community_image"].getStr + result.privilegesLevel = PrivilegesLevel(t["privileges_level"].getInt) + +proc fromJson*(t: JsonNode, T: typedesc[ref CollectibleCommunityInfo]): ref CollectibleCommunityInfo {.inline.} = + result = new(CollectibleCommunityInfo) + result[] = fromJson(t, CollectibleCommunityInfo) # CollectibleDetails proc `$`*(self: CollectibleDetails): string = @@ -282,7 +351,8 @@ proc `$`*(self: CollectibleDetails): string = backgroundColor:{self.backgroundColor}, collectionName:{self.collectionName}, collectionSlug:{self.collectionSlug}, - collectionImageUrl:{self.collectionImageUrl} + collectionImageUrl:{self.collectionImageUrl}, + communityInfo:{self.communityInfo} )""" proc fromJson*(t: JsonNode, T: typedesc[CollectibleDetails]): CollectibleDetails {.inline.} = @@ -298,6 +368,8 @@ proc fromJson*(t: JsonNode, T: typedesc[CollectibleDetails]): CollectibleDetails result.collectionName = t["collection_name"].getStr() result.collectionSlug = t["collection_slug"].getStr() result.collectionImageUrl = t["collection_image_url"].getStr() + if t.contains(communityInfoField) and t[communityInfoField].kind != JNull: + result.communityInfo = some(fromJson(t[communityInfoField], CollectibleCommunityInfo)) proc fromJson*(t: JsonNode, T: typedesc[ref CollectibleDetails]): ref CollectibleDetails {.inline.} = result = new(CollectibleDetails) diff --git a/src/backend/community_tokens_types.nim b/src/backend/community_tokens_types.nim new file mode 100644 index 0000000000..1300bba85a --- /dev/null +++ b/src/backend/community_tokens_types.nim @@ -0,0 +1,4 @@ +type + # see protocol/communities/token/community_token.go PrivilegesLevel + PrivilegesLevel* {.pure.} = enum + Owner, Master, Community diff --git a/vendor/status-go b/vendor/status-go index 0f065a9f07..ba5cd9c1a4 160000 --- a/vendor/status-go +++ b/vendor/status-go @@ -1 +1 @@ -Subproject commit 0f065a9f07aebcb25fdad8ff6a153cc3444ecf0d +Subproject commit ba5cd9c1a462ef57431dd69ccfd88b9dafd7d744