diff --git a/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart b/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart index 6219c62d2..b8dae7ab3 100644 --- a/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart @@ -4,14 +4,17 @@ import 'dart:developer'; import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:collection/collection.dart'; import 'package:fluffychat/pangea/constants/class_default_values.dart'; +import 'package:fluffychat/pangea/constants/language_keys.dart'; import 'package:fluffychat/pangea/constants/model_keys.dart'; import 'package:fluffychat/pangea/constants/pangea_room_types.dart'; +import 'package:fluffychat/pangea/controllers/language_list_controller.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/models/analytics/analytics_event.dart'; import 'package:fluffychat/pangea/models/analytics/constructs_event.dart'; import 'package:fluffychat/pangea/models/analytics/summary_analytics_event.dart'; import 'package:fluffychat/pangea/models/analytics/summary_analytics_model.dart'; import 'package:fluffychat/pangea/models/bot_options_model.dart'; +import 'package:fluffychat/pangea/models/language_model.dart'; import 'package:fluffychat/pangea/models/space_model.dart'; import 'package:fluffychat/pangea/models/tokens_event_content_model.dart'; import 'package:fluffychat/pangea/utils/bot_name.dart'; @@ -129,6 +132,9 @@ extension PangeaRoom on Room { Event? get pangeaRoomRulesStateEvent => _pangeaRoomRulesStateEvent; + Future> targetLanguages() async => + await _targetLanguages(); + // events Future leaveIfFull() async => await _leaveIfFull(); diff --git a/lib/pangea/extensions/pangea_room_extension/space_settings_extension.dart b/lib/pangea/extensions/pangea_room_extension/space_settings_extension.dart index 00efb6773..5799631b1 100644 --- a/lib/pangea/extensions/pangea_room_extension/space_settings_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/space_settings_extension.dart @@ -92,6 +92,34 @@ extension SpaceRoomExtension on Room { return null; } + Future> _targetLanguages() async { + await requestParticipants(); + final students = _students; + + final Map langCounts = {}; + final List allRooms = client.rooms; + for (final User student in students) { + for (final Room room in allRooms) { + if (!room.isAnalyticsRoomOfUser(student.id)) continue; + final String? langCode = room.madeForLang; + if (langCode == null || + langCode.isEmpty || + langCode == LanguageKeys.unknownLanguage) { + continue; + } + final LanguageModel lang = PangeaLanguage.byLangCode(langCode); + langCounts[lang] ??= 0; + langCounts[lang] = langCounts[lang]! + 1; + } + } + // get a list of language models, sorted + // by the number of students who are learning that language + return langCounts.entries.map((entry) => entry.key).toList() + ..sort( + (a, b) => langCounts[b]!.compareTo(langCounts[a]!), + ); + } + // DateTime? get _languageSettingsUpdatedAt { // if (!isSpace) return null; // return languageSettingsStateEvent?.originServerTs ?? creationTime; diff --git a/lib/pangea/pages/analytics/base_analytics.dart b/lib/pangea/pages/analytics/base_analytics.dart index f62e5f6b5..3ab8fa0f2 100644 --- a/lib/pangea/pages/analytics/base_analytics.dart +++ b/lib/pangea/pages/analytics/base_analytics.dart @@ -25,8 +25,9 @@ class BaseAnalyticsPage extends StatefulWidget { final AnalyticsSelected defaultSelected; final AnalyticsSelected? alwaysSelected; final StudentAnalyticsController? myAnalyticsController; + final List targetLanguages; - const BaseAnalyticsPage({ + BaseAnalyticsPage({ super.key, required this.pageTitle, required this.tabs, @@ -34,7 +35,10 @@ class BaseAnalyticsPage extends StatefulWidget { required this.defaultSelected, this.selectedView, this.myAnalyticsController, - }); + targetLanguages, + }) : targetLanguages = (targetLanguages?.isNotEmpty ?? false) + ? targetLanguages + : MatrixState.pangeaController.pLanguageStore.targetOptions; @override State createState() => BaseAnalyticsController(); diff --git a/lib/pangea/pages/analytics/base_analytics_view.dart b/lib/pangea/pages/analytics/base_analytics_view.dart index 1c0445d5a..8cab95396 100644 --- a/lib/pangea/pages/analytics/base_analytics_view.dart +++ b/lib/pangea/pages/analytics/base_analytics_view.dart @@ -128,8 +128,7 @@ class BaseAnalyticsView extends StatelessWidget { value: controller.pangeaController.analytics .currentAnalyticsSpaceLang, onChange: (lang) => controller.toggleSpaceLang(lang), - languages: controller - .pangeaController.pLanguageStore.targetOptions, + languages: controller.widget.targetLanguages, ), ], ), diff --git a/lib/pangea/pages/analytics/space_analytics/space_analytics.dart b/lib/pangea/pages/analytics/space_analytics/space_analytics.dart index 64875bfba..b32780761 100644 --- a/lib/pangea/pages/analytics/space_analytics/space_analytics.dart +++ b/lib/pangea/pages/analytics/space_analytics/space_analytics.dart @@ -4,6 +4,7 @@ import 'dart:developer'; import 'package:fluffychat/pangea/constants/pangea_room_types.dart'; import 'package:fluffychat/pangea/enum/bar_chart_view_enum.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart'; +import 'package:fluffychat/pangea/models/language_model.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:fluffychat/pangea/widgets/common/list_placeholder.dart'; import 'package:fluffychat/pangea/widgets/common/p_circular_loader.dart'; @@ -33,6 +34,18 @@ class SpaceAnalyticsV2Controller extends State { List students = []; String? get spaceId => GoRouterState.of(context).pathParameters['spaceid']; Room? _spaceRoom; + List targetLanguages = []; + + @override + void initState() { + super.initState(); + Future.delayed(Duration.zero, () async { + if (spaceRoom == null || (!(spaceRoom?.isSpace ?? false))) { + context.go('/rooms'); + } + getChatAndStudents(); + }); + } Room? get spaceRoom { if (_spaceRoom == null || _spaceRoom!.id != spaceId) { @@ -44,23 +57,11 @@ class SpaceAnalyticsV2Controller extends State { context.go('/rooms/analytics'); return null; } - getChatAndStudents(); + getChatAndStudents().then((_) => setTargetLanguages()); } return _spaceRoom; } - @override - void initState() { - super.initState(); - debugPrint("init space analytics"); - Future.delayed(Duration.zero, () async { - if (spaceRoom == null || (!(spaceRoom?.isSpace ?? false))) { - context.go('/rooms'); - } - getChatAndStudents(); - }); - } - Future getChatAndStudents() async { try { await spaceRoom?.postLoad(); @@ -97,12 +98,12 @@ class SpaceAnalyticsV2Controller extends State { } } - // @override - // void dispose() { - // super.dispose(); - // refreshTimer?.cancel(); - // stateSub?.cancel(); - // } + Future setTargetLanguages() async { + // get a list of language models, sorted by the + // number of students who are learning that language + targetLanguages = await spaceRoom?.targetLanguages() ?? []; + setState(() {}); + } @override Widget build(BuildContext context) { diff --git a/lib/pangea/pages/analytics/space_analytics/space_analytics_view.dart b/lib/pangea/pages/analytics/space_analytics/space_analytics_view.dart index 5e0008555..c72ec3c26 100644 --- a/lib/pangea/pages/analytics/space_analytics/space_analytics_view.dart +++ b/lib/pangea/pages/analytics/space_analytics/space_analytics_view.dart @@ -59,6 +59,7 @@ class SpaceAnalyticsView extends StatelessWidget { AnalyticsEntryType.space, controller.spaceRoom?.name ?? "", ), + targetLanguages: controller.targetLanguages, ) : const SizedBox(); } diff --git a/lib/pangea/pages/analytics/space_list/space_list.dart b/lib/pangea/pages/analytics/space_list/space_list.dart index 058d54e63..e325e1e94 100644 --- a/lib/pangea/pages/analytics/space_list/space_list.dart +++ b/lib/pangea/pages/analytics/space_list/space_list.dart @@ -2,6 +2,7 @@ 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/extensions/pangea_room_extension/pangea_room_extension.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'; @@ -22,26 +23,47 @@ class AnalyticsSpaceList extends StatefulWidget { class AnalyticsSpaceListController extends State { PangeaController pangeaController = MatrixState.pangeaController; List spaces = []; + List targetLanguages = []; @override void initState() { super.initState(); - Matrix.of(context).client.spacesImTeaching.then((spaceList) { - spaceList = spaceList - .where( - (space) => !spaceList.any( - (parentSpace) => parentSpace.spaceChildren - .any((child) => child.roomId == space.id), - ), - ) - .toList(); - spaces = spaceList; - setState(() {}); - }); + + setSpaceList().then((_) => setTargetLanguages()); } StreamController refreshStream = StreamController.broadcast(); + Future setSpaceList() async { + final spaceList = await Matrix.of(context).client.spacesImTeaching; + spaces = spaceList + .where( + (space) => !spaceList.any( + (parentSpace) => parentSpace.spaceChildren + .any((child) => child.roomId == space.id), + ), + ) + .toList(); + setState(() {}); + } + + Future setTargetLanguages() async { + if (spaces.isEmpty) return; + final Map langCounts = {}; + for (final Room space in spaces) { + final List targetLangs = await space.targetLanguages(); + for (final LanguageModel lang in targetLangs) { + langCounts[lang] ??= 0; + langCounts[lang] = langCounts[lang]! + 1; + } + } + targetLanguages = langCounts.entries.map((entry) => entry.key).toList() + ..sort( + (a, b) => langCounts[b]!.compareTo(langCounts[a]!), + ); + setState(() {}); + } + void toggleTimeSpan(BuildContext context, TimeSpan timeSpan) { pangeaController.analytics.setCurrentAnalyticsTimeSpan(timeSpan); refreshStream.add(false); 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 5f5bf22da..1837d35f2 100644 --- a/lib/pangea/pages/analytics/space_list/space_list_view.dart +++ b/lib/pangea/pages/analytics/space_list/space_list_view.dart @@ -45,7 +45,9 @@ class AnalyticsSpaceListView extends StatelessWidget { value: controller.pangeaController.analytics.currentAnalyticsSpaceLang, onChange: (lang) => controller.toggleSpaceLang(lang), - languages: controller.pangeaController.pLanguageStore.targetOptions, + languages: controller.targetLanguages.isEmpty + ? controller.pangeaController.pLanguageStore.targetOptions + : controller.targetLanguages, ), ], ),