added language dropdown to space analytics list and made timespan dropdown functional, updated fetching of space analytics

pull/1384/head
ggurdin 1 year ago
parent f6572d3127
commit 16a8383e72

@ -160,11 +160,21 @@ class AnalyticsController extends BaseController {
// private chat analytics to determine which children are already visible
// in the chat list
final Map<String, List<String>> _lastFetchedHierarchies = {};
void setLatestHierarchy(String spaceId, GetSpaceHierarchyResponse resp) {
final List<String> roomIds = resp.rooms.map((room) => room.roomId).toList();
_lastFetchedHierarchies[spaceId] = roomIds;
}
Future<List<String>> 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<List<SummaryAnalyticsEvent>> mySummaryAnalytics() async {
@ -294,16 +304,16 @@ class AnalyticsController extends BaseController {
return filtered;
}
List<SummaryAnalyticsEvent> filterRoomAnalytics(
Future<List<SummaryAnalyticsEvent>> filterRoomAnalytics(
List<SummaryAnalyticsEvent> unfiltered,
String? roomID,
) {
) async {
List<SummaryAnalyticsEvent> 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<List<SummaryAnalyticsEvent>> filterPrivateChatAnalytics(
List<SummaryAnalyticsEvent> 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<String> privateChatIds = space?.allSpaceChildRoomIds ?? [];
final List<String> lastFetched = _lastFetchedHierarchies[space!.id] ?? [];
final List<String> privateChatIds = space.allSpaceChildRoomIds;
final List<String> 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<SummaryAnalyticsEvent> filterSpaceAnalytics(
Future<List<SummaryAnalyticsEvent>> filterSpaceAnalytics(
List<SummaryAnalyticsEvent> unfiltered,
String spaceId,
) {
final selectedSpace =
_pangeaController.matrixState.client.getRoomById(spaceId);
final List<String> chatIds = selectedSpace?.spaceChildren
.map((e) => e.roomId)
.where((e) => e != null)
.cast<String>()
.toList() ??
[];
) async {
final List<String> chatIds = await getLatestSpaceHierarchy(spaceId);
List<SummaryAnalyticsEvent> filtered =
List<SummaryAnalyticsEvent>.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<ConstructAnalyticsEvent> filterPrivateChatConstructs(
Future<List<ConstructAnalyticsEvent>> filterPrivateChatConstructs(
List<ConstructAnalyticsEvent> unfilteredConstructs,
Room parentSpace,
) {
final List<String> directChatIds = [];
Room space,
) async {
final List<String> privateChatIds = space.allSpaceChildRoomIds;
final List<String> lastFetched = await getLatestSpaceHierarchy(space.id);
for (final id in lastFetched) {
privateChatIds.removeWhere((e) => e == id);
}
final List<ConstructAnalyticsEvent> filtered =
List<ConstructAnalyticsEvent>.from(unfilteredConstructs);
for (final construct in filtered) {
construct.content.uses.removeWhere(
(use) => !directChatIds.contains(use.chatId),
(use) => !privateChatIds.contains(use.chatId),
);
}
return filtered;
}
List<ConstructAnalyticsEvent> filterSpaceConstructs(
Future<List<ConstructAnalyticsEvent>> filterSpaceConstructs(
List<ConstructAnalyticsEvent> unfilteredConstructs,
Room space,
) {
final List<String> chatIds = space.spaceChildren
.map((e) => e.roomId)
.where((e) => e != null)
.cast<String>()
.toList();
) async {
final List<String> chatIds = await getLatestSpaceHierarchy(space.id);
final List<ConstructAnalyticsEvent> filtered =
List<ConstructAnalyticsEvent>.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}");
}

@ -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<AnalyticsListTile> {
});
}
@override
void didUpdateWidget(covariant AnalyticsListTile oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.selected != widget.selected) {
setTileData();
}
}
@override
void dispose() {
refreshSubscription?.cancel();

@ -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<AnalyticsSpaceList> {
PangeaController pangeaController = MatrixState.pangeaController;
List<ChartAnalyticsModel> models = [];
List<Room> spaces = [];
@override
@ -42,6 +40,20 @@ class AnalyticsSpaceListController extends State<AnalyticsSpaceList> {
});
}
StreamController refreshStream = StreamController.broadcast();
void toggleTimeSpan(BuildContext context, TimeSpan timeSpan) {
pangeaController.analytics.setCurrentAnalyticsTimeSpan(timeSpan);
refreshStream.add(false);
setState(() {});
}
Future<void> 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<AnalyticsSpaceList> {
},
);
}
Future<ChartAnalyticsModel?> 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(() {});
}
}

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

Loading…
Cancel
Save