added language dropdown to space analytics list and made timespan dropdown functional, updated fetching of space analytics
This commit is contained in:
parent
f6572d3127
commit
16a8383e72
4 changed files with 73 additions and 74 deletions
|
|
@ -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…
Add table
Reference in a new issue