From 05ec2b4bcbedb7bd4d7e94a1b1b04376e436cc24 Mon Sep 17 00:00:00 2001 From: MishkaRogachev Date: Thu, 27 Jul 2023 13:34:15 +0400 Subject: [PATCH 1/5] feat(Community): Community messaging statistics chart Close 11152 - Use se `collectCommunityMessageMetrics` for messaging statistics chart in community overview --- .../modules/main/communities/controller.nim | 3 ++ .../modules/main/communities/io_interface.nim | 3 ++ src/app/modules/main/communities/module.nim | 3 ++ src/app/modules/main/communities/view.nim | 14 +++++++ .../service/community/async_tasks.nim | 23 +++++++++++ src/app_service/service/community/service.nim | 38 +++++++++++++++++++ src/backend/communities.nim | 12 ++++++ ui/app/AppLayouts/Chat/stores/RootStore.qml | 7 ++++ .../panels/OverviewSettingsChart.qml | 15 ++++++++ .../panels/OverviewSettingsPanel.qml | 9 +++++ .../views/CommunitySettingsView.qml | 5 +++ vendor/status-go | 2 +- 12 files changed, 133 insertions(+), 1 deletion(-) diff --git a/src/app/modules/main/communities/controller.nim b/src/app/modules/main/communities/controller.nim index c8fb3d894db..f78ae25ae72 100644 --- a/src/app/modules/main/communities/controller.nim +++ b/src/app/modules/main/communities/controller.nim @@ -269,6 +269,9 @@ proc reorderCommunityChat*( proc getChatDetailsByIds*(self: Controller, chatIds: seq[string]): seq[ChatDto] = return self.chatService.getChatsByIds(chatIds) +proc collectCommunityMetricsMessagesTimestamps*(self: Controller, communityId: string, intervals: string) = + self.communityService.collectCommunityMetricsMessagesTimestamps(communityId, intervals) + proc requestCommunityInfo*(self: Controller, communityId: string, importing: bool) = self.communityService.requestCommunityInfo(communityId, importing) diff --git a/src/app/modules/main/communities/io_interface.nim b/src/app/modules/main/communities/io_interface.nim index c1e9f436f46..33900e4b840 100644 --- a/src/app/modules/main/communities/io_interface.nim +++ b/src/app/modules/main/communities/io_interface.nim @@ -61,6 +61,9 @@ method isCommunityRequestPending*(self: AccessInterface, communityId: string): b method cancelRequestToJoinCommunity*(self: AccessInterface, communityId: string) {.base.} = raise newException(ValueError, "No implementation available") +method collectCommunityMetricsMessagesTimestamps*(self: AccessInterface, communityId: string, intervals: string) = + raise newException(ValueError, "No implementation available") + method requestCommunityInfo*(self: AccessInterface, communityId: string, importing: bool) {.base.} = raise newException(ValueError, "No implementation available") diff --git a/src/app/modules/main/communities/module.nim b/src/app/modules/main/communities/module.nim index 0ed3b73ef32..a089324d6bc 100644 --- a/src/app/modules/main/communities/module.nim +++ b/src/app/modules/main/communities/module.nim @@ -317,6 +317,9 @@ method discordCategoriesAndChannelsExtracted*(self: Module, categories: seq[Disc method cancelRequestToJoinCommunity*(self: Module, communityId: string) = self.controller.cancelRequestToJoinCommunity(communityId) +method collectCommunityMetricsMessagesTimestamps*(self: Module, communityId: string, intervals: string) = + self.controller.collectCommunityMetricsMessagesTimestamps(communityId, intervals) + method requestCommunityInfo*(self: Module, communityId: string, importing: bool) = self.controller.requestCommunityInfo(communityId, importing) diff --git a/src/app/modules/main/communities/view.nim b/src/app/modules/main/communities/view.nim index c0f7dc1f398..5e24d6c391b 100644 --- a/src/app/modules/main/communities/view.nim +++ b/src/app/modules/main/communities/view.nim @@ -481,6 +481,20 @@ QtObject: proc cancelRequestToJoinCommunity*(self: View, communityId: string) {.slot.} = self.delegate.cancelRequestToJoinCommunity(communityId) + + proc getOverviewChartData*(self: View): QVariant {.slot.} = + echo "----------------> getOverviewChartData" + return newQVariant() + + proc overviewChartDataChanged*(self: View) {.signal.} + + QtProperty[QVariant] overviewChartData: + read = getOverviewChartData + notify = overviewChartDataChanged + + proc collectCommunityMetricsMessagesTimestamps*(self: View, communityId: string, intervals: string) {.slot.} = + self.delegate.collectCommunityMetricsMessagesTimestamps(communityId, intervals) + proc requestCommunityInfo*(self: View, communityId: string, importing: bool) {.slot.} = self.delegate.requestCommunityInfo(communityId, importing) diff --git a/src/app_service/service/community/async_tasks.nim b/src/app_service/service/community/async_tasks.nim index 95ce7f44660..57c68f9b1e7 100644 --- a/src/app_service/service/community/async_tasks.nim +++ b/src/app_service/service/community/async_tasks.nim @@ -24,6 +24,29 @@ const asyncLoadCommunitiesDataTask: Task = proc(argEncoded: string) {.gcsafe, ni "error": e.msg, }) +type + AsyncCollectCommunityMetricsTaskArg = ref object of QObjectTaskArg + communityId: string + metricsType: CommunityMetricsType + intervals: JsonNode + +const asyncCollectCommunityMetricsTask: Task = proc(argEncoded: string) {.gcsafe, nimcall.} = + let arg = decode[AsyncCollectCommunityMetricsTaskArg](argEncoded) + try: + let response = status_go.collectCommunityMetrics(arg.communityId, arg.metricsType, arg.intervals) + arg.finish(%* { + "communityId": arg.communityId, + "metricsType": arg.metricsType, + "response": response, + "error": "", + }) + except Exception as e: + arg.finish(%* { + "communityId": arg.communityId, + "metricsType": arg.metricsType, + "error": e.msg, + }) + type AsyncRequestCommunityInfoTaskArg = ref object of QObjectTaskArg communityId: string diff --git a/src/app_service/service/community/service.nim b/src/app_service/service/community/service.nim index 3ae8e26f26c..c965011b22b 100644 --- a/src/app_service/service/community/service.nim +++ b/src/app_service/service/community/service.nim @@ -1359,6 +1359,21 @@ QtObject: except Exception as e: error "Error reordering category channel", msg = e.msg, communityId, categoryId, position + proc asyncCommunityMetricsLoaded*(self: Service, rpcResponse: string) {.slot.} = + echo "-------------> asyncCommunityMetricsLoaded, rpcResponse: ", rpcResponse + + let rpcResponseObj = rpcResponse.parseJson + if rpcResponseObj{"error"}.kind != JNull and rpcResponseObj{"error"}.getStr != "": + error "Error collecting community metrics", msg = rpcResponseObj{"error"} + return + + let communityId = rpcResponseObj{"communityId"}.getStr() + let metricsType = rpcResponseObj{"metricsType"}.getInt() + let result = rpcResponseObj["response"]["result"] + + # NOTE: this part in progress + echo "================> communityId: ", communityId, ", metricsType: ", metricsType, ", result: ", result + proc asyncCommunityInfoLoaded*(self: Service, communityIdAndRpcResponse: string) {.slot.} = let rpcResponseObj = communityIdAndRpcResponse.parseJson @@ -1551,6 +1566,29 @@ QtObject: error "error loading curated communities: ", errMsg self.events.emit(SIGNAL_CURATED_COMMUNITIES_LOADING_FAILED, Args()) + proc collectCommunityMetricsMessagesTimestamps*(self: Service, communityId: string, intervals: string) = + echo "-------------> collectCommunityMetricsMessagesTimestamps, itervals: ", intervals + let arg = AsyncCollectCommunityMetricsTaskArg( + tptr: cast[ByteAddress](asyncCollectCommunityMetricsTask), + vptr: cast[ByteAddress](self.vptr), + slot: "asyncCommunityMetricsLoaded", + communityId: communityId, + metricsType: CommunityMetricsType.MessagesTimestamps, + intervals: parseJson(intervals) + ) + self.threadpool.start(arg) + + proc collectCommunityMetricsMessagesCount*(self: Service, communityId: string, intervals: string) = + let arg = AsyncCollectCommunityMetricsTaskArg( + tptr: cast[ByteAddress](asyncCollectCommunityMetricsTask), + vptr: cast[ByteAddress](self.vptr), + slot: "asyncCommunityMetricsLoaded", + communityId: communityId, + metricsType: CommunityMetricsType.MessagesCount, + intervals: parseJson(intervals) + ) + self.threadpool.start(arg) + proc requestCommunityInfo*(self: Service, communityId: string, importing = false) = if communityId in self.requestedCommunityIds: diff --git a/src/backend/communities.nim b/src/backend/communities.nim index 7ccd540bf2a..cda7a0a9dc6 100644 --- a/src/backend/communities.nim +++ b/src/backend/communities.nim @@ -6,6 +6,10 @@ import interpret/cropped_image export response_type +type + CommunityMetricsType* {.pure.} = enum + MessagesTimestamps, MessagesCount, Members, ControlNodeUptime + proc getCommunityTags*(): RpcResponse[JsonNode] {.raises: [Exception].} = result = callPrivateRPC("communityTags".prefix) @@ -352,6 +356,14 @@ proc deleteCommunityCategory*( "categoryId": categoryId }]) +proc collectCommunityMetrics*(communityId: string, metricsType: CommunityMetricsType, intervals: JsonNode): RpcResponse[JsonNode] {.raises: [Exception].} = + result = callPrivateRPC("collectCommunityMetrics".prefix, %*[ + { + "communityId": communityId, + "type": metricsType.int, + "intervals": intervals + }]) + proc requestCommunityInfo*(communityId: string): RpcResponse[JsonNode] {.raises: [Exception].} = result = callPrivateRPC("requestCommunityInfoFromMailserver".prefix, %*[communityId]) diff --git a/ui/app/AppLayouts/Chat/stores/RootStore.qml b/ui/app/AppLayouts/Chat/stores/RootStore.qml index e5188c46185..dc8ac067127 100644 --- a/ui/app/AppLayouts/Chat/stores/RootStore.qml +++ b/ui/app/AppLayouts/Chat/stores/RootStore.qml @@ -56,6 +56,8 @@ QtObject { } } + readonly property var overviewChartData: chatCommunitySectionModule.overviewChartData + readonly property bool isUserAllowedToSendMessage: _d.isUserAllowedToSendMessage readonly property string chatInputPlaceHolderText: _d.chatInputPlaceHolderText readonly property var oneToOneChatContact: _d.oneToOneChatContact @@ -416,6 +418,11 @@ QtObject { return communitiesList.getSectionByIdJson(id) } + // intervals is a string containing json array [{startTimestamp: 1690548852, startTimestamp: 1690547684}, {...}] + function collectCommunityMetricsMessagesTimestamps(communityId, intervals) { + communitiesModuleInst.collectCommunityMetricsMessagesTimestamps(id, intervals) + } + function requestCommunityInfo(id, importing = false) { communitiesModuleInst.requestCommunityInfo(id, importing) } diff --git a/ui/app/AppLayouts/Communities/panels/OverviewSettingsChart.qml b/ui/app/AppLayouts/Communities/panels/OverviewSettingsChart.qml index 3fdee7a843e..16ea2e0849f 100644 --- a/ui/app/AppLayouts/Communities/panels/OverviewSettingsChart.qml +++ b/ui/app/AppLayouts/Communities/panels/OverviewSettingsChart.qml @@ -20,6 +20,21 @@ StatusChartPanel { */ property var model: [] + signal collectCommunityMetricsMessagesTimestamps(var intervals) + + function requestCommunityMetrics() { + let intervals = d.selectedTabInfo.modelItems.map(item => { + return { + startTimestamp: item.start, + endTimestamp: item.end + } + }) + collectCommunityMetricsMessagesTimestamps(JSON.stringify(intervals)) + } + + onTimeRangeTabBarIndexChanged: requestCommunityMetrics() + Component.onCompleted: requestCommunityMetrics() + QtObject { id: d diff --git a/ui/app/AppLayouts/Communities/panels/OverviewSettingsPanel.qml b/ui/app/AppLayouts/Communities/panels/OverviewSettingsPanel.qml index ecac138703e..d399eb69514 100644 --- a/ui/app/AppLayouts/Communities/panels/OverviewSettingsPanel.qml +++ b/ui/app/AppLayouts/Communities/panels/OverviewSettingsPanel.qml @@ -40,6 +40,8 @@ StackLayout { property int loginType: Constants.LoginType.Password property bool communitySettingsDisabled + property var overviewChartData: [] + function navigateBack() { if (editSettingsPanelLoader.item.dirty) settingsDirtyToastMessage.notifyDirty() @@ -47,6 +49,8 @@ StackLayout { root.currentIndex = 0 } + signal collectCommunityMetricsMessagesTimestamps(var intervals) + signal edited(Item item) // item containing edited fields (name, description, logoImagePath, color, options, etc..) signal inviteNewPeopleClicked @@ -113,11 +117,16 @@ StackLayout { } OverviewSettingsChart { + data: root.overviewChartData + onCollectCommunityMetricsMessagesTimestamps: { + root.collectCommunityMetricsMessagesTimestamps(intervals) + } Layout.topMargin: 16 Layout.fillWidth: true Layout.fillHeight: true Layout.bottomMargin: 16 } + Rectangle { Layout.fillWidth: true diff --git a/ui/app/AppLayouts/Communities/views/CommunitySettingsView.qml b/ui/app/AppLayouts/Communities/views/CommunitySettingsView.qml index 154a0398c0d..5182dfb5299 100644 --- a/ui/app/AppLayouts/Communities/views/CommunitySettingsView.qml +++ b/ui/app/AppLayouts/Communities/views/CommunitySettingsView.qml @@ -176,6 +176,11 @@ StatusSectionLayout { loginType: root.rootStore.loginType isControlNode: root.isControlNode communitySettingsDisabled: root.communitySettingsDisabled + overviewChartData: rootStore.overviewChartData + + onCollectCommunityMetricsMessagesTimestamps: { + rootStore.collectCommunityMetricsMessagesTimestamps(root.community.id, intervals) + } onEdited: { const error = root.chatCommunitySectionModule.editCommunity( diff --git a/vendor/status-go b/vendor/status-go index 0ae7aa44f00..4ad84d80cc7 160000 --- a/vendor/status-go +++ b/vendor/status-go @@ -1 +1 @@ -Subproject commit 0ae7aa44f00bff345539c1e288705057e7e4574c +Subproject commit 4ad84d80cc7b0363f3c8da589d7bb8930fb8a629 From d7feada4563fd5d7f199dd60543c81e0c0eefdea Mon Sep 17 00:00:00 2001 From: MishkaRogachev Date: Mon, 31 Jul 2023 17:43:34 +0400 Subject: [PATCH 2/5] feat(Community): Transfer community metrics with dto objects --- .../service/community/async_tasks.nim | 2 +- .../service/community/dto/community.nim | 46 +++++++++++++++++++ src/app_service/service/community/service.nim | 24 ++++++---- src/backend/communities.nim | 9 ++-- 4 files changed, 66 insertions(+), 15 deletions(-) diff --git a/src/app_service/service/community/async_tasks.nim b/src/app_service/service/community/async_tasks.nim index 57c68f9b1e7..14334c20bbc 100644 --- a/src/app_service/service/community/async_tasks.nim +++ b/src/app_service/service/community/async_tasks.nim @@ -33,7 +33,7 @@ type const asyncCollectCommunityMetricsTask: Task = proc(argEncoded: string) {.gcsafe, nimcall.} = let arg = decode[AsyncCollectCommunityMetricsTaskArg](argEncoded) try: - let response = status_go.collectCommunityMetrics(arg.communityId, arg.metricsType, arg.intervals) + let response = status_go.collectCommunityMetrics(arg.communityId, arg.metricsType.int, arg.intervals) arg.finish(%* { "communityId": arg.communityId, "metricsType": arg.metricsType, diff --git a/src/app_service/service/community/dto/community.nim b/src/app_service/service/community/dto/community.nim index b4b49d6bd88..ea96da471ff 100644 --- a/src/app_service/service/community/dto/community.nim +++ b/src/app_service/service/community/dto/community.nim @@ -25,6 +25,13 @@ type MutedType* {.pure.}= enum For1min = 6, Unmuted = 7 +type + CommunityMetricsType* {.pure.} = enum + MessagesTimestamps = 0, + MessagesCount, + Members, + ControlNodeUptime + type CommunityMembershipRequestDto* = object id*: string publicKey*: string @@ -88,6 +95,17 @@ type CheckPermissionsToJoinResponseDto* = object permissions*: Table[string, CheckPermissionsResultDto] validCombinations*: seq[AccountChainIDsCombinationDto] +type MetricsIntervalDto* = object + startTimestamp: string + endTimestamp: string + timestamps: seq[string] + count: int + +type CommunityMetricsDto* = object + communityId*: string + metricsType*: CommunityMetricsType + intervals*: seq[MetricsIntervalDto] + type CommunityDto* = object id*: string memberRole*: MemberRole @@ -301,6 +319,34 @@ proc toCheckAllChannelsPermissionsResponseDto*(jsonObj: JsonNode): CheckAllChann for channelId, permissionResponse in channelsObj: result.channels[channelId] = permissionResponse.toCheckChannelPermissionsResponseDto() +proc toMetricsIntervalDto*(jsonObj: JsonNode): MetricsIntervalDto = + result = MetricsIntervalDto() + discard jsonObj.getProp("startTimestamp", result.startTimestamp) + discard jsonObj.getProp("endTimestamp", result.endTimestamp) + + var timestampsObj: JsonNode + if (jsonObj.getProp("timestamps", timestampsObj) and timestampsObj.kind == JArray): + for timestamps in timestampsObj: + result.timestamps.add(timestamps.getStr) + + discard jsonObj.getProp("count", result.count) + +proc toCommunityMetricsDto*(jsonObj: JsonNode): CommunityMetricsDto = + result = CommunityMetricsDto() + + discard jsonObj.getProp("communityId", result.communityId) + + result.metricsType = CommunityMetricsType.MessagesTimestamps + var metricsTypeInt: int + if (jsonObj.getProp("metricsType", metricsTypeInt) and (metricsTypeInt >= ord(low(CommunityMetricsType)) and + metricsTypeInt <= ord(high(CommunityMetricsType)))): + result.metricsType = CommunityMetricsType(metricsTypeInt) + + var intervalsObj: JsonNode + if (jsonObj.getProp("intervals", intervalsObj) and intervalsObj.kind == JArray): + for interval in intervalsObj: + result.intervals.add(interval.toMetricsIntervalDto()) + proc toCommunityDto*(jsonObj: JsonNode): CommunityDto = result = CommunityDto() discard jsonObj.getProp("id", result.id) diff --git a/src/app_service/service/community/service.nim b/src/app_service/service/community/service.nim index c965011b22b..8ae7ccbcba5 100644 --- a/src/app_service/service/community/service.nim +++ b/src/app_service/service/community/service.nim @@ -121,6 +121,10 @@ type communityId*: string checkPermissionsToJoinResponse*: CheckPermissionsToJoinResponseDto + CommunityMetricsArgs* = ref object of Args + communityId*: string + metricsType*: CommunityMetricsType + # Signals which may be emitted by this service: const SIGNAL_COMMUNITY_DATA_LOADED* = "communityDataLoaded" const SIGNAL_COMMUNITY_JOINED* = "communityJoined" @@ -189,6 +193,8 @@ const SIGNAL_CHECK_PERMISSIONS_TO_JOIN_RESPONSE* = "checkPermissionsToJoinRespon const SIGNAL_COMMUNITY_PRIVATE_KEY_REMOVED* = "communityPrivateKeyRemoved" +const SIGNAL_COMMUNITY_METRICS_UPDATED* = "communityMetricsUpdated" + QtObject: type Service* = ref object of QObject @@ -202,6 +208,7 @@ QtObject: myCommunityRequests*: seq[CommunityMembershipRequestDto] historyArchiveDownloadTaskCommunityIds*: HashSet[string] requestedCommunityIds*: HashSet[string] + communityMetrics: Table[string, CommunityMetricsDto] # Forward declaration proc asyncLoadCuratedCommunities*(self: Service) @@ -237,6 +244,7 @@ QtObject: result.myCommunityRequests = @[] result.historyArchiveDownloadTaskCommunityIds = initHashSet[string]() result.requestedCommunityIds = initHashSet[string]() + result.communityMetrics = initTable[string, CommunityMetricsDto]() proc getFilteredJoinedCommunities(self: Service): Table[string, CommunityDto] = result = initTable[string, CommunityDto]() @@ -1360,19 +1368,20 @@ QtObject: error "Error reordering category channel", msg = e.msg, communityId, categoryId, position proc asyncCommunityMetricsLoaded*(self: Service, rpcResponse: string) {.slot.} = - echo "-------------> asyncCommunityMetricsLoaded, rpcResponse: ", rpcResponse - let rpcResponseObj = rpcResponse.parseJson if rpcResponseObj{"error"}.kind != JNull and rpcResponseObj{"error"}.getStr != "": error "Error collecting community metrics", msg = rpcResponseObj{"error"} return - let communityId = rpcResponseObj{"communityId"}.getStr() - let metricsType = rpcResponseObj{"metricsType"}.getInt() - let result = rpcResponseObj["response"]["result"] + let communityId = rpcResponseObj{"communityId"}.getStr() + let metricsType = rpcResponseObj{"metricsType"}.getInt() + + var metrics = rpcResponseObj{"response"}{"result"}.toCommunityMetricsDto() + self.communityMetrics[communityId] = metrics + echo "------------> metrics: ", metrics + + self.events.emit(SIGNAL_COMMUNITY_METRICS_UPDATED, CommunityMetricsArgs(communityId: communityId, metricsType: metrics.metricsType)) - # NOTE: this part in progress - echo "================> communityId: ", communityId, ", metricsType: ", metricsType, ", result: ", result proc asyncCommunityInfoLoaded*(self: Service, communityIdAndRpcResponse: string) {.slot.} = @@ -1567,7 +1576,6 @@ QtObject: self.events.emit(SIGNAL_CURATED_COMMUNITIES_LOADING_FAILED, Args()) proc collectCommunityMetricsMessagesTimestamps*(self: Service, communityId: string, intervals: string) = - echo "-------------> collectCommunityMetricsMessagesTimestamps, itervals: ", intervals let arg = AsyncCollectCommunityMetricsTaskArg( tptr: cast[ByteAddress](asyncCollectCommunityMetricsTask), vptr: cast[ByteAddress](self.vptr), diff --git a/src/backend/communities.nim b/src/backend/communities.nim index cda7a0a9dc6..3eae86cb9a8 100644 --- a/src/backend/communities.nim +++ b/src/backend/communities.nim @@ -6,10 +6,6 @@ import interpret/cropped_image export response_type -type - CommunityMetricsType* {.pure.} = enum - MessagesTimestamps, MessagesCount, Members, ControlNodeUptime - proc getCommunityTags*(): RpcResponse[JsonNode] {.raises: [Exception].} = result = callPrivateRPC("communityTags".prefix) @@ -356,11 +352,12 @@ proc deleteCommunityCategory*( "categoryId": categoryId }]) -proc collectCommunityMetrics*(communityId: string, metricsType: CommunityMetricsType, intervals: JsonNode): RpcResponse[JsonNode] {.raises: [Exception].} = +proc collectCommunityMetrics*(communityId: string, metricsType: int, intervals: JsonNode + ):RpcResponse[JsonNode] {.raises: [Exception].} = result = callPrivateRPC("collectCommunityMetrics".prefix, %*[ { "communityId": communityId, - "type": metricsType.int, + "type": metricsType, "intervals": intervals }]) From 8ed7e041a1691cced8eda0bf9b5d587980443a9b Mon Sep 17 00:00:00 2001 From: MishkaRogachev Date: Tue, 1 Aug 2023 14:52:24 +0400 Subject: [PATCH 3/5] feat: impl simple string-based model for community metrics --- src/app/modules/main/communities/controller.nim | 11 ++++++++++- src/app/modules/main/communities/io_interface.nim | 5 ++++- src/app/modules/main/communities/module.nim | 3 +++ src/app/modules/main/communities/view.nim | 10 +++++++--- .../service/community/dto/community.nim | 14 +++++++------- src/app_service/service/community/service.nim | 10 ++++++---- ui/app/AppLayouts/Chat/stores/RootStore.qml | 2 +- .../Communities/panels/OverviewSettingsPanel.qml | 8 ++++++-- 8 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/app/modules/main/communities/controller.nim b/src/app/modules/main/communities/controller.nim index f78ae25ae72..b617e9f7c65 100644 --- a/src/app/modules/main/communities/controller.nim +++ b/src/app/modules/main/communities/controller.nim @@ -1,4 +1,4 @@ -import stint +import stint, std/strutils import ./io_interface import ../../../core/signals/types @@ -181,6 +181,15 @@ proc init*(self: Controller) = self.delegate.callbackFromAuthentication(authenticated) self.tmpAuthenticationWithCallbackInProgress = false + self.events.on(SIGNAL_COMMUNITY_METRICS_UPDATED) do(e: Args): + let args = CommunityMetricsArgs(e) + let metrics = self.communityService.getCommunityMetrics(args.communityId, args.metricsType) + var strings: seq[string] + for interval in metrics.intervals: + for timestamp in interval.timestamps: + strings.add($timestamp) + self.delegate.setOverviewChartData("[" & join(strings, ", ") & "]") + proc getCommunityTags*(self: Controller): string = result = self.communityService.getCommunityTags() diff --git a/src/app/modules/main/communities/io_interface.nim b/src/app/modules/main/communities/io_interface.nim index 33900e4b840..42bf11e6003 100644 --- a/src/app/modules/main/communities/io_interface.nim +++ b/src/app/modules/main/communities/io_interface.nim @@ -61,7 +61,10 @@ method isCommunityRequestPending*(self: AccessInterface, communityId: string): b method cancelRequestToJoinCommunity*(self: AccessInterface, communityId: string) {.base.} = raise newException(ValueError, "No implementation available") -method collectCommunityMetricsMessagesTimestamps*(self: AccessInterface, communityId: string, intervals: string) = +method collectCommunityMetricsMessagesTimestamps*(self: AccessInterface, communityId: string, intervals: string) {.base.} = + raise newException(ValueError, "No implementation available") + +method setOverviewChartData*(self: AccessInterface, metrics: string) {.base.} = raise newException(ValueError, "No implementation available") method requestCommunityInfo*(self: AccessInterface, communityId: string, importing: bool) {.base.} = diff --git a/src/app/modules/main/communities/module.nim b/src/app/modules/main/communities/module.nim index a089324d6bc..e279918e413 100644 --- a/src/app/modules/main/communities/module.nim +++ b/src/app/modules/main/communities/module.nim @@ -320,6 +320,9 @@ method cancelRequestToJoinCommunity*(self: Module, communityId: string) = method collectCommunityMetricsMessagesTimestamps*(self: Module, communityId: string, intervals: string) = self.controller.collectCommunityMetricsMessagesTimestamps(communityId, intervals) +method setOverviewChartData*(self: Module, metrics: string) = + self.view.setOverviewChartData(metrics) + method requestCommunityInfo*(self: Module, communityId: string, importing: bool) = self.controller.requestCommunityInfo(communityId, importing) diff --git a/src/app/modules/main/communities/view.nim b/src/app/modules/main/communities/view.nim index 5e24d6c391b..1a9037dfc55 100644 --- a/src/app/modules/main/communities/view.nim +++ b/src/app/modules/main/communities/view.nim @@ -47,6 +47,7 @@ QtObject: discordImportCommunityImage: string discordImportHasCommunityImage: bool downloadingCommunityHistoryArchives: bool + communityMetrics: string # NOTE: later this should be replaced with QAbstractListModel-based model proc delete*(self: View) = self.model.delete @@ -100,6 +101,7 @@ QtObject: result.tokenListModelVariant = newQVariant(result.tokenListModel) result.collectiblesListModel = newTokenListModel() result.collectiblesListModelVariant = newQVariant(result.collectiblesListModel) + result.communityMetrics = "[]" proc load*(self: View) = self.delegate.viewDidLoad() @@ -481,10 +483,8 @@ QtObject: proc cancelRequestToJoinCommunity*(self: View, communityId: string) {.slot.} = self.delegate.cancelRequestToJoinCommunity(communityId) - proc getOverviewChartData*(self: View): QVariant {.slot.} = - echo "----------------> getOverviewChartData" - return newQVariant() + return newQVariant(self.communityMetrics) proc overviewChartDataChanged*(self: View) {.signal.} @@ -492,6 +492,10 @@ QtObject: read = getOverviewChartData notify = overviewChartDataChanged + proc setOverviewChartData*(self: View, communityMetrics: string) = + self.communityMetrics = communityMetrics + self.overviewChartDataChanged() + proc collectCommunityMetricsMessagesTimestamps*(self: View, communityId: string, intervals: string) {.slot.} = self.delegate.collectCommunityMetricsMessagesTimestamps(communityId, intervals) diff --git a/src/app_service/service/community/dto/community.nim b/src/app_service/service/community/dto/community.nim index ea96da471ff..2cc7af2ca96 100644 --- a/src/app_service/service/community/dto/community.nim +++ b/src/app_service/service/community/dto/community.nim @@ -96,10 +96,10 @@ type CheckPermissionsToJoinResponseDto* = object validCombinations*: seq[AccountChainIDsCombinationDto] type MetricsIntervalDto* = object - startTimestamp: string - endTimestamp: string - timestamps: seq[string] - count: int + startTimestamp*: uint64 + endTimestamp*: uint64 + timestamps*: seq[uint64] + count*: int type CommunityMetricsDto* = object communityId*: string @@ -326,8 +326,8 @@ proc toMetricsIntervalDto*(jsonObj: JsonNode): MetricsIntervalDto = var timestampsObj: JsonNode if (jsonObj.getProp("timestamps", timestampsObj) and timestampsObj.kind == JArray): - for timestamps in timestampsObj: - result.timestamps.add(timestamps.getStr) + for timestamp in timestampsObj: + result.timestamps.add(uint64(timestamp.getInt)) discard jsonObj.getProp("count", result.count) @@ -345,7 +345,7 @@ proc toCommunityMetricsDto*(jsonObj: JsonNode): CommunityMetricsDto = var intervalsObj: JsonNode if (jsonObj.getProp("intervals", intervalsObj) and intervalsObj.kind == JArray): for interval in intervalsObj: - result.intervals.add(interval.toMetricsIntervalDto()) + result.intervals.add(interval.toMetricsIntervalDto) proc toCommunityDto*(jsonObj: JsonNode): CommunityDto = result = CommunityDto() diff --git a/src/app_service/service/community/service.nim b/src/app_service/service/community/service.nim index 8ae7ccbcba5..4d5d5fae88b 100644 --- a/src/app_service/service/community/service.nim +++ b/src/app_service/service/community/service.nim @@ -1378,12 +1378,8 @@ QtObject: var metrics = rpcResponseObj{"response"}{"result"}.toCommunityMetricsDto() self.communityMetrics[communityId] = metrics - echo "------------> metrics: ", metrics - self.events.emit(SIGNAL_COMMUNITY_METRICS_UPDATED, CommunityMetricsArgs(communityId: communityId, metricsType: metrics.metricsType)) - - proc asyncCommunityInfoLoaded*(self: Service, communityIdAndRpcResponse: string) {.slot.} = let rpcResponseObj = communityIdAndRpcResponse.parseJson if rpcResponseObj{"error"}.kind != JNull and rpcResponseObj{"error"}.getStr != "": @@ -1575,6 +1571,12 @@ QtObject: error "error loading curated communities: ", errMsg self.events.emit(SIGNAL_CURATED_COMMUNITIES_LOADING_FAILED, Args()) + proc getCommunityMetrics*(self: Service, communityId: string, metricsType: CommunityMetricsType): CommunityMetricsDto = + # NOTE: use metricsType when other metrics types added + if self.communityMetrics.hasKey(communityId): + return self.communityMetrics[communityId] + return CommunityMetricsDto() + proc collectCommunityMetricsMessagesTimestamps*(self: Service, communityId: string, intervals: string) = let arg = AsyncCollectCommunityMetricsTaskArg( tptr: cast[ByteAddress](asyncCollectCommunityMetricsTask), diff --git a/ui/app/AppLayouts/Chat/stores/RootStore.qml b/ui/app/AppLayouts/Chat/stores/RootStore.qml index dc8ac067127..ceb3d8bc841 100644 --- a/ui/app/AppLayouts/Chat/stores/RootStore.qml +++ b/ui/app/AppLayouts/Chat/stores/RootStore.qml @@ -56,7 +56,7 @@ QtObject { } } - readonly property var overviewChartData: chatCommunitySectionModule.overviewChartData + readonly property string overviewChartData: communitiesModuleInst.overviewChartData readonly property bool isUserAllowedToSendMessage: _d.isUserAllowedToSendMessage readonly property string chatInputPlaceHolderText: _d.chatInputPlaceHolderText diff --git a/ui/app/AppLayouts/Communities/panels/OverviewSettingsPanel.qml b/ui/app/AppLayouts/Communities/panels/OverviewSettingsPanel.qml index d399eb69514..5f6bf53931f 100644 --- a/ui/app/AppLayouts/Communities/panels/OverviewSettingsPanel.qml +++ b/ui/app/AppLayouts/Communities/panels/OverviewSettingsPanel.qml @@ -40,7 +40,7 @@ StackLayout { property int loginType: Constants.LoginType.Password property bool communitySettingsDisabled - property var overviewChartData: [] + property string overviewChartData: "" function navigateBack() { if (editSettingsPanelLoader.item.dirty) @@ -117,7 +117,11 @@ StackLayout { } OverviewSettingsChart { - data: root.overviewChartData + model: { + var newModel = JSON.parse(root.overviewChartData) + // TODO: time conversion by locale may be required + return newModel + } onCollectCommunityMetricsMessagesTimestamps: { root.collectCommunityMetricsMessagesTimestamps(intervals) } From 20313df9b893c7f4ec8ccc3628ace831ae8a7ffa Mon Sep 17 00:00:00 2001 From: MishkaRogachev Date: Wed, 2 Aug 2023 14:11:30 +0400 Subject: [PATCH 4/5] fix(Community): Review fixes and fix for changing community when chat is open --- .../modules/main/chat_section/controller.nim | 12 ++++++++++++ .../main/chat_section/io_interface.nim | 6 ++++++ src/app/modules/main/chat_section/module.nim | 6 ++++++ src/app/modules/main/chat_section/view.nim | 19 +++++++++++++++++++ .../modules/main/communities/controller.nim | 12 ------------ .../modules/main/communities/io_interface.nim | 6 ------ src/app/modules/main/communities/module.nim | 6 ------ src/app/modules/main/communities/view.nim | 18 ------------------ ui/app/AppLayouts/Chat/stores/RootStore.qml | 6 +++--- .../panels/OverviewSettingsChart.qml | 5 +++-- .../panels/OverviewSettingsPanel.qml | 11 ++++++----- .../views/CommunitySettingsView.qml | 2 +- 12 files changed, 56 insertions(+), 53 deletions(-) diff --git a/src/app/modules/main/chat_section/controller.nim b/src/app/modules/main/chat_section/controller.nim index d7cc46bcf50..5e91d5364b5 100644 --- a/src/app/modules/main/chat_section/controller.nim +++ b/src/app/modules/main/chat_section/controller.nim @@ -168,6 +168,15 @@ proc init*(self: Controller) = discard self.delegate.addOrUpdateChat(args.chat, belongsToCommunity, self.events, self.settingsService, self.nodeConfigurationService, self.contactService, self.chatService, self.communityService, self.messageService, self.gifService, self.mailserversService, setChatAsActive = true) + self.events.on(SIGNAL_COMMUNITY_METRICS_UPDATED) do(e: Args): + let args = CommunityMetricsArgs(e) + if args.communityId == self.sectionId: + let metrics = self.communityService.getCommunityMetrics(args.communityId, args.metricsType) + var strings: seq[string] + for interval in metrics.intervals: + for timestamp in interval.timestamps: + strings.add($timestamp) + self.delegate.setOverviewChartData("[" & join(strings, ", ") & "]") self.events.on(SIGNAL_COMMUNITY_CHANNEL_DELETED) do(e:Args): let args = CommunityChatIdArgs(e) @@ -652,3 +661,6 @@ proc getContractAddressesForToken*(self: Controller, symbol: string): Table[int, proc getCommunityTokenList*(self: Controller): seq[CommunityTokenDto] = return self.communityTokensService.getCommunityTokens(self.getMySectionId()) + +proc collectCommunityMetricsMessagesTimestamps*(self: Controller, intervals: string) = + self.communityService.collectCommunityMetricsMessagesTimestamps(self.getMySectionId(), intervals) \ No newline at end of file diff --git a/src/app/modules/main/chat_section/io_interface.nim b/src/app/modules/main/chat_section/io_interface.nim index 04507e89436..25ce6b55ea5 100644 --- a/src/app/modules/main/chat_section/io_interface.nim +++ b/src/app/modules/main/chat_section/io_interface.nim @@ -349,6 +349,12 @@ method createOrEditCommunityTokenPermission*(self: AccessInterface, communityId: method deleteCommunityTokenPermission*(self: AccessInterface, communityId: string, permissionId: string) {.base.} = raise newException(ValueError, "No implementation available") +method collectCommunityMetricsMessagesTimestamps*(self: AccessInterface, intervals: string) {.base.} = + raise newException(ValueError, "No implementation available") + +method setOverviewChartData*(self: AccessInterface, metrics: string) {.base.} = + raise newException(ValueError, "No implementation available") + method onCommunityTokenPermissionCreated*(self: AccessInterface, communityId: string, tokenPermission: CommunityTokenPermissionDto) {.base.} = raise newException(ValueError, "No implementation available") diff --git a/src/app/modules/main/chat_section/module.nim b/src/app/modules/main/chat_section/module.nim index 840ed5190f2..c0408004c93 100644 --- a/src/app/modules/main/chat_section/module.nim +++ b/src/app/modules/main/chat_section/module.nim @@ -1322,3 +1322,9 @@ method deleteCommunityTokenPermission*(self: Module, communityId: string, permis method onDeactivateChatLoader*(self: Module, chatId: string) = self.view.chatsModel().disableChatLoader(chatId) + +method collectCommunityMetricsMessagesTimestamps*(self: Module, intervals: string) = + self.controller.collectCommunityMetricsMessagesTimestamps(intervals) + +method setOverviewChartData*(self: Module, metrics: string) = + self.view.setOverviewChartData(metrics) diff --git a/src/app/modules/main/chat_section/view.nim b/src/app/modules/main/chat_section/view.nim index 2d20ac710ec..328ee218b08 100644 --- a/src/app/modules/main/chat_section/view.nim +++ b/src/app/modules/main/chat_section/view.nim @@ -27,6 +27,8 @@ QtObject: requiresTokenPermissionToJoin: bool amIMember: bool chatsLoaded: bool + communityMetrics: string # NOTE: later this should be replaced with QAbstractListModel-based model + proc delete*(self: View) = self.model.delete @@ -64,6 +66,7 @@ QtObject: result.amIMember = false result.requiresTokenPermissionToJoin = false result.chatsLoaded = false + result.communityMetrics = "[]" proc load*(self: View) = self.delegate.viewDidLoad() @@ -409,3 +412,19 @@ QtObject: QtProperty[bool] allTokenRequirementsMet: read = getAllTokenRequirementsMet notify = allTokenRequirementsMetChanged + + proc getOverviewChartData*(self: View): QVariant {.slot.} = + return newQVariant(self.communityMetrics) + + proc overviewChartDataChanged*(self: View) {.signal.} + + QtProperty[QVariant] overviewChartData: + read = getOverviewChartData + notify = overviewChartDataChanged + + proc setOverviewChartData*(self: View, communityMetrics: string) = + self.communityMetrics = communityMetrics + self.overviewChartDataChanged() + + proc collectCommunityMetricsMessagesTimestamps*(self: View, intervals: string) {.slot.} = + self.delegate.collectCommunityMetricsMessagesTimestamps(intervals) diff --git a/src/app/modules/main/communities/controller.nim b/src/app/modules/main/communities/controller.nim index b617e9f7c65..b580e49be2c 100644 --- a/src/app/modules/main/communities/controller.nim +++ b/src/app/modules/main/communities/controller.nim @@ -181,15 +181,6 @@ proc init*(self: Controller) = self.delegate.callbackFromAuthentication(authenticated) self.tmpAuthenticationWithCallbackInProgress = false - self.events.on(SIGNAL_COMMUNITY_METRICS_UPDATED) do(e: Args): - let args = CommunityMetricsArgs(e) - let metrics = self.communityService.getCommunityMetrics(args.communityId, args.metricsType) - var strings: seq[string] - for interval in metrics.intervals: - for timestamp in interval.timestamps: - strings.add($timestamp) - self.delegate.setOverviewChartData("[" & join(strings, ", ") & "]") - proc getCommunityTags*(self: Controller): string = result = self.communityService.getCommunityTags() @@ -278,9 +269,6 @@ proc reorderCommunityChat*( proc getChatDetailsByIds*(self: Controller, chatIds: seq[string]): seq[ChatDto] = return self.chatService.getChatsByIds(chatIds) -proc collectCommunityMetricsMessagesTimestamps*(self: Controller, communityId: string, intervals: string) = - self.communityService.collectCommunityMetricsMessagesTimestamps(communityId, intervals) - proc requestCommunityInfo*(self: Controller, communityId: string, importing: bool) = self.communityService.requestCommunityInfo(communityId, importing) diff --git a/src/app/modules/main/communities/io_interface.nim b/src/app/modules/main/communities/io_interface.nim index 42bf11e6003..c1e9f436f46 100644 --- a/src/app/modules/main/communities/io_interface.nim +++ b/src/app/modules/main/communities/io_interface.nim @@ -61,12 +61,6 @@ method isCommunityRequestPending*(self: AccessInterface, communityId: string): b method cancelRequestToJoinCommunity*(self: AccessInterface, communityId: string) {.base.} = raise newException(ValueError, "No implementation available") -method collectCommunityMetricsMessagesTimestamps*(self: AccessInterface, communityId: string, intervals: string) {.base.} = - raise newException(ValueError, "No implementation available") - -method setOverviewChartData*(self: AccessInterface, metrics: string) {.base.} = - raise newException(ValueError, "No implementation available") - method requestCommunityInfo*(self: AccessInterface, communityId: string, importing: bool) {.base.} = raise newException(ValueError, "No implementation available") diff --git a/src/app/modules/main/communities/module.nim b/src/app/modules/main/communities/module.nim index e279918e413..0ed3b73ef32 100644 --- a/src/app/modules/main/communities/module.nim +++ b/src/app/modules/main/communities/module.nim @@ -317,12 +317,6 @@ method discordCategoriesAndChannelsExtracted*(self: Module, categories: seq[Disc method cancelRequestToJoinCommunity*(self: Module, communityId: string) = self.controller.cancelRequestToJoinCommunity(communityId) -method collectCommunityMetricsMessagesTimestamps*(self: Module, communityId: string, intervals: string) = - self.controller.collectCommunityMetricsMessagesTimestamps(communityId, intervals) - -method setOverviewChartData*(self: Module, metrics: string) = - self.view.setOverviewChartData(metrics) - method requestCommunityInfo*(self: Module, communityId: string, importing: bool) = self.controller.requestCommunityInfo(communityId, importing) diff --git a/src/app/modules/main/communities/view.nim b/src/app/modules/main/communities/view.nim index 1a9037dfc55..c0f7dc1f398 100644 --- a/src/app/modules/main/communities/view.nim +++ b/src/app/modules/main/communities/view.nim @@ -47,7 +47,6 @@ QtObject: discordImportCommunityImage: string discordImportHasCommunityImage: bool downloadingCommunityHistoryArchives: bool - communityMetrics: string # NOTE: later this should be replaced with QAbstractListModel-based model proc delete*(self: View) = self.model.delete @@ -101,7 +100,6 @@ QtObject: result.tokenListModelVariant = newQVariant(result.tokenListModel) result.collectiblesListModel = newTokenListModel() result.collectiblesListModelVariant = newQVariant(result.collectiblesListModel) - result.communityMetrics = "[]" proc load*(self: View) = self.delegate.viewDidLoad() @@ -483,22 +481,6 @@ QtObject: proc cancelRequestToJoinCommunity*(self: View, communityId: string) {.slot.} = self.delegate.cancelRequestToJoinCommunity(communityId) - proc getOverviewChartData*(self: View): QVariant {.slot.} = - return newQVariant(self.communityMetrics) - - proc overviewChartDataChanged*(self: View) {.signal.} - - QtProperty[QVariant] overviewChartData: - read = getOverviewChartData - notify = overviewChartDataChanged - - proc setOverviewChartData*(self: View, communityMetrics: string) = - self.communityMetrics = communityMetrics - self.overviewChartDataChanged() - - proc collectCommunityMetricsMessagesTimestamps*(self: View, communityId: string, intervals: string) {.slot.} = - self.delegate.collectCommunityMetricsMessagesTimestamps(communityId, intervals) - proc requestCommunityInfo*(self: View, communityId: string, importing: bool) {.slot.} = self.delegate.requestCommunityInfo(communityId, importing) diff --git a/ui/app/AppLayouts/Chat/stores/RootStore.qml b/ui/app/AppLayouts/Chat/stores/RootStore.qml index ceb3d8bc841..bcf093cdda4 100644 --- a/ui/app/AppLayouts/Chat/stores/RootStore.qml +++ b/ui/app/AppLayouts/Chat/stores/RootStore.qml @@ -56,7 +56,7 @@ QtObject { } } - readonly property string overviewChartData: communitiesModuleInst.overviewChartData + readonly property string overviewChartData: chatCommunitySectionModule.overviewChartData readonly property bool isUserAllowedToSendMessage: _d.isUserAllowedToSendMessage readonly property string chatInputPlaceHolderText: _d.chatInputPlaceHolderText @@ -419,8 +419,8 @@ QtObject { } // intervals is a string containing json array [{startTimestamp: 1690548852, startTimestamp: 1690547684}, {...}] - function collectCommunityMetricsMessagesTimestamps(communityId, intervals) { - communitiesModuleInst.collectCommunityMetricsMessagesTimestamps(id, intervals) + function collectCommunityMetricsMessagesTimestamps(intervals) { + chatCommunitySectionModule.collectCommunityMetricsMessagesTimestamps(intervals) } function requestCommunityInfo(id, importing = false) { diff --git a/ui/app/AppLayouts/Communities/panels/OverviewSettingsChart.qml b/ui/app/AppLayouts/Communities/panels/OverviewSettingsChart.qml index 16ea2e0849f..bfe6878e61a 100644 --- a/ui/app/AppLayouts/Communities/panels/OverviewSettingsChart.qml +++ b/ui/app/AppLayouts/Communities/panels/OverviewSettingsChart.qml @@ -32,8 +32,7 @@ StatusChartPanel { collectCommunityMetricsMessagesTimestamps(JSON.stringify(intervals)) } - onTimeRangeTabBarIndexChanged: requestCommunityMetrics() - Component.onCompleted: requestCommunityMetrics() + onVisibleChanged: if (visible) requestCommunityMetrics() QtObject { id: d @@ -234,6 +233,8 @@ StatusChartPanel { return leftPositon ? Qt.point(relativeMousePoint.x - toolTip.width - 15, relativeMousePoint.y - 5) : Qt.point(relativeMousePoint.x + 15, relativeMousePoint.y - 5) } + + onSelectedTabInfoChanged: root.requestCommunityMetrics() } headerLeftPadding: 0 headerBottomPadding: Style.current.bigPadding diff --git a/ui/app/AppLayouts/Communities/panels/OverviewSettingsPanel.qml b/ui/app/AppLayouts/Communities/panels/OverviewSettingsPanel.qml index 5f6bf53931f..d74d2b43fde 100644 --- a/ui/app/AppLayouts/Communities/panels/OverviewSettingsPanel.qml +++ b/ui/app/AppLayouts/Communities/panels/OverviewSettingsPanel.qml @@ -117,11 +117,7 @@ StackLayout { } OverviewSettingsChart { - model: { - var newModel = JSON.parse(root.overviewChartData) - // TODO: time conversion by locale may be required - return newModel - } + model: JSON.parse(root.overviewChartData) onCollectCommunityMetricsMessagesTimestamps: { root.collectCommunityMetricsMessagesTimestamps(intervals) } @@ -129,6 +125,11 @@ StackLayout { Layout.fillWidth: true Layout.fillHeight: true Layout.bottomMargin: 16 + + Connections { + target: root + onCommunityIdChanged: requestCommunityMetrics() + } } Rectangle { diff --git a/ui/app/AppLayouts/Communities/views/CommunitySettingsView.qml b/ui/app/AppLayouts/Communities/views/CommunitySettingsView.qml index 5182dfb5299..013a8c094d6 100644 --- a/ui/app/AppLayouts/Communities/views/CommunitySettingsView.qml +++ b/ui/app/AppLayouts/Communities/views/CommunitySettingsView.qml @@ -179,7 +179,7 @@ StatusSectionLayout { overviewChartData: rootStore.overviewChartData onCollectCommunityMetricsMessagesTimestamps: { - rootStore.collectCommunityMetricsMessagesTimestamps(root.community.id, intervals) + rootStore.collectCommunityMetricsMessagesTimestamps(intervals) } onEdited: { From d0ab1882856c534684716967829bf488f7528655 Mon Sep 17 00:00:00 2001 From: Mikhail Rogachev Date: Wed, 2 Aug 2023 19:14:07 +0400 Subject: [PATCH 5/5] Update src/app/modules/main/chat_section/controller.nim Co-authored-by: Jonathan Rainville --- src/app/modules/main/chat_section/controller.nim | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/modules/main/chat_section/controller.nim b/src/app/modules/main/chat_section/controller.nim index 5e91d5364b5..74ab8492803 100644 --- a/src/app/modules/main/chat_section/controller.nim +++ b/src/app/modules/main/chat_section/controller.nim @@ -168,6 +168,7 @@ proc init*(self: Controller) = discard self.delegate.addOrUpdateChat(args.chat, belongsToCommunity, self.events, self.settingsService, self.nodeConfigurationService, self.contactService, self.chatService, self.communityService, self.messageService, self.gifService, self.mailserversService, setChatAsActive = true) + self.events.on(SIGNAL_COMMUNITY_METRICS_UPDATED) do(e: Args): let args = CommunityMetricsArgs(e) if args.communityId == self.sectionId: