diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 9ad418e36..19eb99149 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -7,7 +7,6 @@ import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/chat/send_file_dialog.dart'; import 'package:fluffychat/pages/chat_list/chat_list_view.dart'; import 'package:fluffychat/pangea/constants/pangea_room_types.dart'; -import 'package:fluffychat/pangea/controllers/pangea_controller.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/utils/chat_list_handle_space_tap.dart'; @@ -1016,7 +1015,7 @@ class ChatListController extends State } // #Pangea - await _initPangeaControllers(client); + _initPangeaControllers(client); // Pangea# if (!mounted) return; setState(() { @@ -1025,22 +1024,12 @@ class ChatListController extends State } // #Pangea - Future _initPangeaControllers(Client client) async { - MatrixState.pangeaController.putAnalytics.initialize(); - MatrixState.pangeaController.getAnalytics.initialize(); + void _initPangeaControllers(Client client) { + GoogleAnalytics.analyticsUserUpdate(client.userID); + client.migrateAnalyticsRooms(); + MatrixState.pangeaController.initControllers(); if (mounted) { - final PangeaController pangeaController = MatrixState.pangeaController; - GoogleAnalytics.analyticsUserUpdate(client.userID); - pangeaController.startChatWithBotIfNotPresent(); - await pangeaController.subscriptionController.initialize(); - pangeaController.afterSyncAndFirstLoginInitialization(context); - await pangeaController.inviteBotToExistingSpaces(); - await pangeaController.setPangeaPushRules(); - client.migrateAnalyticsRooms(); - } else { - ErrorHandler.logError( - m: "didn't run afterSyncAndFirstLoginInitialization because not mounted", - ); + MatrixState.pangeaController.classController.joinCachedSpaceCode(context); } } // Pangea# diff --git a/lib/pangea/controllers/class_controller.dart b/lib/pangea/controllers/class_controller.dart index 0e51e700c..df0a699bc 100644 --- a/lib/pangea/controllers/class_controller.dart +++ b/lib/pangea/controllers/class_controller.dart @@ -42,7 +42,7 @@ class ClassController extends BaseController { ); } - Future checkForClassCodeAndSubscription(BuildContext context) async { + Future joinCachedSpaceCode(BuildContext context) async { final String? classCode = _pangeaController.pStoreService.read( PLocalKey.cachedClassCodeToJoin, isAccountData: false, @@ -53,6 +53,7 @@ class ClassController extends BaseController { context, classCode, ); + await _pangeaController.pStoreService.delete( PLocalKey.cachedClassCodeToJoin, isAccountData: false, diff --git a/lib/pangea/controllers/get_analytics_controller.dart b/lib/pangea/controllers/get_analytics_controller.dart index ed4568b65..49ed77e1f 100644 --- a/lib/pangea/controllers/get_analytics_controller.dart +++ b/lib/pangea/controllers/get_analytics_controller.dart @@ -25,6 +25,7 @@ class GetAnalyticsController { StreamController.broadcast(); ConstructListModel constructListModel = ConstructListModel(uses: []); + Completer? initCompleter; GetAnalyticsController(PangeaController pangeaController) { _pangeaController = pangeaController; @@ -50,20 +51,23 @@ class GetAnalyticsController { return progress >= 0 ? progress : 0; } - void initialize() { + Future initialize() async { + if (initCompleter != null) return; + initCompleter = Completer(); + _analyticsUpdateSubscription ??= _pangeaController .putAnalytics.analyticsUpdateStream.stream .listen(_onAnalyticsUpdate); - _pangeaController.putAnalytics.lastUpdatedCompleter.future.then((_) { - _getConstructs().then((_) { - constructListModel.updateConstructs([ - ...(_getConstructsLocal() ?? []), - ..._locallyCachedConstructs, - ]); - _updateAnalyticsStream(); - }); - }); + await _pangeaController.putAnalytics.lastUpdatedCompleter.future; + await _getConstructs(); + constructListModel.updateConstructs([ + ...(_getConstructsLocal() ?? []), + ..._locallyCachedConstructs, + ]); + _updateAnalyticsStream(); + + initCompleter!.complete(); } /// Clear all cached analytics data. @@ -71,6 +75,8 @@ class GetAnalyticsController { constructListModel.dispose(); _analyticsUpdateSubscription?.cancel(); _analyticsUpdateSubscription = null; + analyticsStream.close(); + initCompleter = null; _cache.clear(); } diff --git a/lib/pangea/controllers/pangea_controller.dart b/lib/pangea/controllers/pangea_controller.dart index 9962e96e4..f09457d34 100644 --- a/lib/pangea/controllers/pangea_controller.dart +++ b/lib/pangea/controllers/pangea_controller.dart @@ -28,7 +28,6 @@ import 'package:fluffychat/pangea/utils/bot_name.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:fluffychat/pangea/utils/instructions.dart'; import 'package:fluffychat/widgets/matrix.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:matrix/matrix.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; @@ -80,11 +79,19 @@ class PangeaController { _addRefInObjects(); } - Future afterSyncAndFirstLoginInitialization( - BuildContext context, - ) async { - await classController.checkForClassCodeAndSubscription(context); + /// Initializes various controllers and settings. + /// While many of these functions are asynchronous, they are not awaited here, + /// because of order of execution does not matter, + /// and running them at the same times speeds them up. + void initControllers() { + putAnalytics.initialize(); + getAnalytics.initialize(); + subscriptionController.initialize(); classController.fixClassPowerLevels(); + + startChatWithBotIfNotPresent(); + inviteBotToExistingSpaces(); + setPangeaPushRules(); } /// Initialize controllers diff --git a/lib/pangea/widgets/chat_list/analytics_summary/learning_progress_indicators.dart b/lib/pangea/widgets/chat_list/analytics_summary/learning_progress_indicators.dart index 29ce30078..a96df6f91 100644 --- a/lib/pangea/widgets/chat_list/analytics_summary/learning_progress_indicators.dart +++ b/lib/pangea/widgets/chat_list/analytics_summary/learning_progress_indicators.dart @@ -36,6 +36,13 @@ class LearningProgressIndicatorsState @override void initState() { super.initState(); + + // if getAnalytics has already finished initializing, + // the data is loaded and should be displayed. + if (MatrixState.pangeaController.getAnalytics.initCompleter?.isCompleted ?? + false) { + updateData(null); + } _analyticsSubscription = MatrixState .pangeaController.getAnalytics.analyticsStream.stream .listen(updateData); @@ -48,7 +55,7 @@ class LearningProgressIndicatorsState super.dispose(); } - void updateData(AnalyticsStreamUpdate _) { + void updateData(AnalyticsStreamUpdate? _) { if (_loading) _loading = false; if (mounted) setState(() {}); }