From 16a8383e72044e04a7364e4affe9c9a784cf1e22 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Tue, 25 Jun 2024 09:28:31 -0400 Subject: [PATCH] added language dropdown to space analytics list and made timespan dropdown functional, updated fetching of space analytics --- .../message_analytics_controller.dart | 77 +++++++++---------- .../pages/analytics/analytics_list_tile.dart | 12 ++- .../analytics/space_list/space_list.dart | 42 ++++------ .../analytics/space_list/space_list_view.dart | 16 +++- 4 files changed, 73 insertions(+), 74 deletions(-) diff --git a/lib/pangea/controllers/message_analytics_controller.dart b/lib/pangea/controllers/message_analytics_controller.dart index 25dcaf2d5..7083efbfd 100644 --- a/lib/pangea/controllers/message_analytics_controller.dart +++ b/lib/pangea/controllers/message_analytics_controller.dart @@ -160,11 +160,21 @@ class AnalyticsController extends BaseController { // private chat analytics to determine which children are already visible // in the chat list final Map> _lastFetchedHierarchies = {}; + void setLatestHierarchy(String spaceId, GetSpaceHierarchyResponse resp) { final List roomIds = resp.rooms.map((room) => room.roomId).toList(); _lastFetchedHierarchies[spaceId] = roomIds; } + Future> getLatestSpaceHierarchy(String spaceId) async { + if (!_lastFetchedHierarchies.containsKey(spaceId)) { + final resp = + await _pangeaController.matrixState.client.getSpaceHierarchy(spaceId); + setLatestHierarchy(spaceId, resp); + } + return _lastFetchedHierarchies[spaceId] ?? []; + } + //////////////////////////// MESSAGE SUMMARY ANALYTICS //////////////////////////// Future> mySummaryAnalytics() async { @@ -294,16 +304,16 @@ class AnalyticsController extends BaseController { return filtered; } - List filterRoomAnalytics( + Future> filterRoomAnalytics( List unfiltered, String? roomID, - ) { + ) async { List filtered = [...unfiltered]; Room? room; if (roomID != null) { room = _pangeaController.matrixState.client.getRoomById(roomID); if (room?.isSpace == true) { - return filterSpaceAnalytics(unfiltered, roomID); + return await filterSpaceAnalytics(unfiltered, roomID); } } @@ -322,16 +332,10 @@ class AnalyticsController extends BaseController { Future> filterPrivateChatAnalytics( List unfiltered, - Room? space, + Room space, ) async { - if (space != null && !_lastFetchedHierarchies.containsKey(space.id)) { - final resp = await _pangeaController.matrixState.client - .getSpaceHierarchy(space.id); - setLatestHierarchy(space.id, resp); - } - - final List privateChatIds = space?.allSpaceChildRoomIds ?? []; - final List lastFetched = _lastFetchedHierarchies[space!.id] ?? []; + final List privateChatIds = space.allSpaceChildRoomIds; + final List lastFetched = await getLatestSpaceHierarchy(space.id); for (final id in lastFetched) { privateChatIds.removeWhere((e) => e == id); } @@ -351,19 +355,11 @@ class AnalyticsController extends BaseController { return filtered; } - List filterSpaceAnalytics( + Future> filterSpaceAnalytics( List unfiltered, String spaceId, - ) { - final selectedSpace = - _pangeaController.matrixState.client.getRoomById(spaceId); - final List chatIds = selectedSpace?.spaceChildren - .map((e) => e.roomId) - .where((e) => e != null) - .cast() - .toList() ?? - []; - + ) async { + final List chatIds = await getLatestSpaceHierarchy(spaceId); List filtered = List.from(unfiltered); @@ -411,12 +407,15 @@ class AnalyticsController extends BaseController { if (defaultSelected.type == AnalyticsEntryType.student) { throw "private chat filtering not available for my analytics"; } + if (space == null) { + throw "space is null in filterAnalytics with selected type privateChats"; + } return await filterPrivateChatAnalytics( unfilteredAnalytics, space, ); case AnalyticsEntryType.space: - return filterSpaceAnalytics(unfilteredAnalytics, selected!.id); + return await filterSpaceAnalytics(unfilteredAnalytics, selected!.id); default: throw Exception("invalid filter type - ${selected?.type}"); } @@ -428,7 +427,6 @@ class AnalyticsController extends BaseController { bool forceUpdate = false, }) async { try { - debugPrint("getting analytics"); await _pangeaController.matrixState.client.roomsLoading; // if the user is looking at space analytics, then fetch the space @@ -612,31 +610,30 @@ class AnalyticsController extends BaseController { return filtered; } - List filterPrivateChatConstructs( + Future> filterPrivateChatConstructs( List unfilteredConstructs, - Room parentSpace, - ) { - final List directChatIds = []; + Room space, + ) async { + final List privateChatIds = space.allSpaceChildRoomIds; + final List lastFetched = await getLatestSpaceHierarchy(space.id); + for (final id in lastFetched) { + privateChatIds.removeWhere((e) => e == id); + } final List filtered = List.from(unfilteredConstructs); for (final construct in filtered) { construct.content.uses.removeWhere( - (use) => !directChatIds.contains(use.chatId), + (use) => !privateChatIds.contains(use.chatId), ); } return filtered; } - List filterSpaceConstructs( + Future> filterSpaceConstructs( List unfilteredConstructs, Room space, - ) { - final List chatIds = space.spaceChildren - .map((e) => e.roomId) - .where((e) => e != null) - .cast() - .toList(); - + ) async { + final List chatIds = await getLatestSpaceHierarchy(space.id); final List filtered = List.from(unfilteredConstructs); @@ -769,9 +766,9 @@ class AnalyticsController extends BaseController { case AnalyticsEntryType.privateChats: return defaultSelected.type == AnalyticsEntryType.student ? throw "private chat filtering not available for my analytics" - : filterPrivateChatConstructs(unfilteredConstructs, space!); + : await filterPrivateChatConstructs(unfilteredConstructs, space!); case AnalyticsEntryType.space: - return filterSpaceConstructs(unfilteredConstructs, space!); + return await filterSpaceConstructs(unfilteredConstructs, space!); default: throw Exception("invalid filter type - ${selected?.type}"); } diff --git a/lib/pangea/pages/analytics/analytics_list_tile.dart b/lib/pangea/pages/analytics/analytics_list_tile.dart index bfc19eb43..8b1e1ba49 100644 --- a/lib/pangea/pages/analytics/analytics_list_tile.dart +++ b/lib/pangea/pages/analytics/analytics_list_tile.dart @@ -26,8 +26,6 @@ class AnalyticsListTile extends StatefulWidget { required this.onTap, required this.pangeaController, this.controller, - // this.isEnabled = true, - // this.showSpaceAnalytics = true, this.refreshStream, }); @@ -40,8 +38,6 @@ class AnalyticsListTile extends StatefulWidget { final bool allowNavigateOnSelect; final bool isSelected; - // final bool isEnabled; - // final bool showSpaceAnalytics; final PangeaController pangeaController; final BaseAnalyticsController? controller; @@ -64,6 +60,14 @@ class AnalyticsListTileState extends State { }); } + @override + void didUpdateWidget(covariant AnalyticsListTile oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.selected != widget.selected) { + setTileData(); + } + } + @override void dispose() { refreshSubscription?.cancel(); diff --git a/lib/pangea/pages/analytics/space_list/space_list.dart b/lib/pangea/pages/analytics/space_list/space_list.dart index e6158525d..058d54e63 100644 --- a/lib/pangea/pages/analytics/space_list/space_list.dart +++ b/lib/pangea/pages/analytics/space_list/space_list.dart @@ -2,14 +2,13 @@ import 'dart:async'; import 'package:fluffychat/pangea/enum/time_span.dart'; import 'package:fluffychat/pangea/extensions/client_extension/client_extension.dart'; -import 'package:fluffychat/pangea/pages/analytics/base_analytics.dart'; +import 'package:fluffychat/pangea/models/language_model.dart'; import 'package:fluffychat/pangea/pages/analytics/space_list/space_list_view.dart'; import 'package:flutter/material.dart'; import 'package:matrix/matrix.dart'; import '../../../../widgets/matrix.dart'; import '../../../controllers/pangea_controller.dart'; -import '../../../models/analytics/chart_analytics_model.dart'; import '../../../utils/sync_status_util_v2.dart'; import '../../../widgets/common/list_placeholder.dart'; @@ -22,7 +21,6 @@ class AnalyticsSpaceList extends StatefulWidget { class AnalyticsSpaceListController extends State { PangeaController pangeaController = MatrixState.pangeaController; - List models = []; List spaces = []; @override @@ -42,6 +40,20 @@ class AnalyticsSpaceListController extends State { }); } + StreamController refreshStream = StreamController.broadcast(); + + void toggleTimeSpan(BuildContext context, TimeSpan timeSpan) { + pangeaController.analytics.setCurrentAnalyticsTimeSpan(timeSpan); + refreshStream.add(false); + setState(() {}); + } + + Future toggleSpaceLang(LanguageModel lang) async { + await pangeaController.analytics.setCurrentAnalyticsSpaceLang(lang); + refreshStream.add(false); + setState(() {}); + } + @override Widget build(BuildContext context) { return PLoadingStatusV2( @@ -52,28 +64,4 @@ class AnalyticsSpaceListController extends State { }, ); } - - Future updateSpaceAnalytics( - Room? space, - ) async { - if (space == null) { - return null; - } - - final data = await pangeaController.analytics.getAnalytics( - defaultSelected: AnalyticsSelected( - space.id, - AnalyticsEntryType.space, - space.name, - ), - forceUpdate: true, - ); - setState(() {}); - return data; - } - - void toggleTimeSpan(BuildContext context, TimeSpan timeSpan) { - pangeaController.analytics.setCurrentAnalyticsTimeSpan(timeSpan); - setState(() {}); - } } diff --git a/lib/pangea/pages/analytics/space_list/space_list_view.dart b/lib/pangea/pages/analytics/space_list/space_list_view.dart index 4c6f72b71..5f5bf22da 100644 --- a/lib/pangea/pages/analytics/space_list/space_list_view.dart +++ b/lib/pangea/pages/analytics/space_list/space_list_view.dart @@ -1,3 +1,4 @@ +import 'package:fluffychat/pangea/pages/analytics/analytics_language_button.dart'; import 'package:fluffychat/pangea/pages/analytics/analytics_list_tile.dart'; import 'package:fluffychat/pangea/pages/analytics/time_span_menu_button.dart'; import 'package:flutter/material.dart'; @@ -35,8 +36,16 @@ class AnalyticsSpaceListView extends StatelessWidget { TimeSpanMenuButton( value: controller.pangeaController.analytics.currentAnalyticsTimeSpan, - onChange: (TimeSpan value) => - controller.toggleTimeSpan(context, value), + onChange: (TimeSpan value) => controller.toggleTimeSpan( + context, + value, + ), + ), + AnalyticsLanguageButton( + value: + controller.pangeaController.analytics.currentAnalyticsSpaceLang, + onChange: (lang) => controller.toggleSpaceLang(lang), + languages: controller.pangeaController.pLanguageStore.targetOptions, ), ], ), @@ -49,7 +58,7 @@ class AnalyticsSpaceListView extends StatelessWidget { defaultSelected: AnalyticsSelected( controller.spaces[i].id, AnalyticsEntryType.space, - "", + controller.spaces[i].name, ), avatar: controller.spaces[i].avatar, selected: AnalyticsSelected( @@ -65,6 +74,7 @@ class AnalyticsSpaceListView extends StatelessWidget { allowNavigateOnSelect: true, isSelected: false, pangeaController: controller.pangeaController, + refreshStream: controller.refreshStream, ), ), ),