diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index fa1d779ca..6d1228d06 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -42,6 +42,7 @@ import '../../widgets/matrix.dart'; import 'package:fluffychat/utils/tor_stub.dart' if (dart.library.html) 'package:tor_detector_web/tor_detector_web.dart'; + enum PopupMenuAction { settings, invite, @@ -565,8 +566,10 @@ class ChatListController extends State _checkTorBrowser(); //#Pangea - _invitedSpaceSubscription = MatrixState - .pangeaController.matrixState.client.onSync.stream + _invitedSpaceSubscription = Matrix.of(context) + .client + .onSync + .stream .where((event) => event.rooms?.invite != null) .listen((event) async { for (final inviteEntry in event.rooms!.invite!.entries) { @@ -584,10 +587,9 @@ class ChatListController extends State if (isSpace) { final spaceId = inviteEntry.key; - final space = - MatrixState.pangeaController.matrixState.client.getRoomById( - spaceId, - ); + final space = Matrix.of(context).client.getRoomById( + spaceId, + ); if (space?.classCode?.toLowerCase() == SpaceCodeRepo.recentCode?.toLowerCase()) { @@ -603,8 +605,8 @@ class ChatListController extends State } if (isAnalytics) { - final analyticsRoom = MatrixState.pangeaController.matrixState.client - .getRoomById(inviteEntry.key); + final analyticsRoom = + Matrix.of(context).client.getRoomById(inviteEntry.key); try { await analyticsRoom?.join(); } catch (err, s) { @@ -626,7 +628,7 @@ class ChatListController extends State // listen for space child updates for any space that is not the active space // so that when the user navigates to the space that was updated, it will // reload any rooms that have been added / removed - final client = MatrixState.pangeaController.matrixState.client; + final client = Matrix.of(context).client; // listen for room join events and leave room if over capacity _roomCapacitySubscription ??= client.onSync.stream diff --git a/lib/pages/login/login.dart b/lib/pages/login/login.dart index 185753e49..e737655bf 100644 --- a/lib/pages/login/login.dart +++ b/lib/pages/login/login.dart @@ -2,12 +2,12 @@ import 'package:flutter/material.dart'; import 'package:matrix/matrix.dart'; +import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/pangea/common/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/login/pages/login_options_view.dart'; import 'package:fluffychat/pangea/login/pages/pangea_login_view.dart'; import 'package:fluffychat/pangea/login/widgets/p_sso_button.dart'; -import 'package:fluffychat/pangea/user/utils/p_login.dart'; +import 'package:fluffychat/pangea/user/p_login.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; @@ -46,7 +46,6 @@ class LoginController extends State { bool loadingAppleSSO = false; bool loadingGoogleSSO = false; - final PangeaController pangeaController = MatrixState.pangeaController; final GlobalKey formKey = GlobalKey(); Client? client; @@ -61,7 +60,7 @@ class LoginController extends State { // TODO: implement initState super.initState(); loadingSignIn = true; - pangeaController.checkHomeServerAction().then((client) { + checkHomeServerAction().then((client) { if (mounted) { setState(() { loadingSignIn = false; @@ -234,6 +233,30 @@ class LoginController extends State { // if (mounted) setState(() {}); // } // } + + Future checkHomeServerAction() async { + final client = await Matrix.of(context).getLoginClient(); + if (client.homeserver != null) { + await Future.delayed(Duration.zero); + return client; + } + + final String homeServer = + AppConfig.defaultHomeserver.trim().toLowerCase().replaceAll(' ', '-'); + var homeserver = Uri.parse(homeServer); + if (homeserver.scheme.isEmpty) { + homeserver = Uri.https(homeServer, ''); + } + + try { + await client.register(); + Matrix.of(context).loginRegistrationSupported = true; + } on MatrixException catch (e) { + Matrix.of(context).loginRegistrationSupported = + e.requireAdditionalAuthentication; + } + return client; + } // Pangea# void passwordForgotten() async { diff --git a/lib/pages/settings/settings.dart b/lib/pages/settings/settings.dart index cc58dab88..e6da2c762 100644 --- a/lib/pages/settings/settings.dart +++ b/lib/pages/settings/settings.dart @@ -5,7 +5,7 @@ import 'package:image_picker/image_picker.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/pangea/user/utils/p_logout.dart'; +import 'package:fluffychat/pangea/user/p_logout.dart'; import 'package:fluffychat/utils/file_selector.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; diff --git a/lib/pangea/analytics_downloads/analytics_dowload_dialog.dart b/lib/pangea/analytics_downloads/analytics_dowload_dialog.dart index b18cb3f8c..8674e0060 100644 --- a/lib/pangea/analytics_downloads/analytics_dowload_dialog.dart +++ b/lib/pangea/analytics_downloads/analytics_dowload_dialog.dart @@ -83,6 +83,7 @@ class AnalyticsDownloadDialogState extends State { return; } + final client = Matrix.of(context).client; try { if (_downloadType == DownloadType.csv) { final vocabContent = _getCSVFileContent( @@ -96,10 +97,10 @@ class AnalyticsDownloadDialogState extends State { ); final vocabFileName = - "analytics_vocab_${MatrixState.pangeaController.matrixState.client.userID?.localpart}_${DateFormat('yyyy-MM-dd-hh:mm:ss').format(DateTime.now())}.csv"; + "analytics_vocab_${client.userID?.localpart}_${DateFormat('yyyy-MM-dd-hh:mm:ss').format(DateTime.now())}.csv"; final morphFileName = - "analytics_morph_${MatrixState.pangeaController.matrixState.client.userID?.localpart}_${DateFormat('yyyy-MM-dd-hh:mm:ss').format(DateTime.now())}.csv"; + "analytics_morph_${client.userID?.localpart}_${DateFormat('yyyy-MM-dd-hh:mm:ss').format(DateTime.now())}.csv"; final futures = [ DownloadUtil.downloadFile( @@ -122,7 +123,7 @@ class AnalyticsDownloadDialogState extends State { }); final fileName = - "analytics_${MatrixState.pangeaController.matrixState.client.userID?.localpart}_${DateFormat('yyyy-MM-dd-hh:mm:ss').format(DateTime.now())}.xlsx'}"; + "analytics_${client.userID?.localpart}_${DateFormat('yyyy-MM-dd-hh:mm:ss').format(DateTime.now())}.xlsx'}"; await DownloadUtil.downloadFile( content, @@ -263,8 +264,8 @@ class AnalyticsDownloadDialogState extends State { final List examples = []; for (final OneConstructUse use in allUses) { if (use.metadata.roomId == null) continue; - final Room? room = MatrixState.pangeaController.matrixState.client - .getRoomById(use.metadata.roomId!); + final client = Matrix.of(context).client; + final Room? room = client.getRoomById(use.metadata.roomId!); if (room == null) continue; if (use.useType.skillsEnumType != LearningSkillsEnum.writing || @@ -287,12 +288,11 @@ class AnalyticsDownloadDialogState extends State { final Event? event = await room.getEventById(use.metadata.eventId!); - if (event == null || event.senderId != room.client.userID) continue; + if (event == null || event.senderId != client.userID) continue; final PangeaMessageEvent pangeaMessageEvent = PangeaMessageEvent( event: event, timeline: timeline!, - ownMessage: event.senderId == - MatrixState.pangeaController.matrixState.client.userID, + ownMessage: event.senderId == client.userID, ); examples.add(pangeaMessageEvent); if (examples.length >= 5) break; diff --git a/lib/pangea/analytics_misc/get_analytics_controller.dart b/lib/pangea/analytics_misc/get_analytics_controller.dart index b79c6cd4a..1e1b59742 100644 --- a/lib/pangea/analytics_misc/get_analytics_controller.dart +++ b/lib/pangea/analytics_misc/get_analytics_controller.dart @@ -379,8 +379,8 @@ class GetAnalyticsController extends BaseController { // this function gets called soon after login, so first // make sure that the user's l2 is loaded, if the user has set their l2 if (_client.userID != null && _l2 == null) { - if (_pangeaController.matrixState.client.prevBatch == null) { - await _pangeaController.matrixState.client.onSync.stream.first; + if (_client.prevBatch == null) { + await _client.onSync.stream.first; } if (_l2 == null) return null; } diff --git a/lib/pangea/analytics_misc/level_up/level_up_banner.dart b/lib/pangea/analytics_misc/level_up/level_up_banner.dart index 7947a5794..f9cb8c449 100644 --- a/lib/pangea/analytics_misc/level_up/level_up_banner.dart +++ b/lib/pangea/analytics_misc/level_up/level_up_banner.dart @@ -106,7 +106,6 @@ class LevelUpBannerState extends State _loadConstructSummary(); LevelUpManager.instance.preloadAnalytics( - context, widget.level, widget.prevLevel, ); diff --git a/lib/pangea/analytics_misc/level_up/level_up_manager.dart b/lib/pangea/analytics_misc/level_up/level_up_manager.dart index f446f24a3..d124e399d 100644 --- a/lib/pangea/analytics_misc/level_up/level_up_manager.dart +++ b/lib/pangea/analytics_misc/level_up/level_up_manager.dart @@ -1,5 +1,3 @@ -import 'package:flutter/material.dart'; - import 'package:matrix/matrix.dart'; import 'package:fluffychat/pangea/analytics_misc/client_analytics_extension.dart'; @@ -27,7 +25,6 @@ class LevelUpManager { bool shouldAutoPopup = false; Future preloadAnalytics( - BuildContext context, int level, int prevLevel, ) async { diff --git a/lib/pangea/analytics_misc/put_analytics_controller.dart b/lib/pangea/analytics_misc/put_analytics_controller.dart index 5b354793d..d504a86f9 100644 --- a/lib/pangea/analytics_misc/put_analytics_controller.dart +++ b/lib/pangea/analytics_misc/put_analytics_controller.dart @@ -83,7 +83,7 @@ class PutAnalyticsController extends BaseController { /// If analytics haven't been updated in the last day, update them Future _refreshAnalyticsIfOutdated() async { // don't set anything is the user is not logged in - if (_pangeaController.matrixState.client.userID == null) return; + if (_client.userID == null) return; try { // if lastUpdated hasn't been set yet, set it lastUpdated ??= @@ -359,7 +359,7 @@ class PutAnalyticsController extends BaseController { onLogout = false, LanguageModel? l2Override, }) async { - if (_pangeaController.matrixState.client.userID == null) return; + if (_client.userID == null) return; if (_pangeaController.getAnalytics.messagesSinceUpdate.isEmpty) return; if (!(_updateCompleter?.isCompleted ?? true)) { @@ -417,7 +417,7 @@ class PutAnalyticsController extends BaseController { } Future sendActivityAnalytics(String roomId) async { - if (_pangeaController.matrixState.client.userID == null) return; + if (_client.userID == null) return; if (_pangeaController.userController.userL2 == null) return; final Room? analyticsRoom = await _client.getMyAnalyticsRoom( @@ -435,7 +435,7 @@ class PutAnalyticsController extends BaseController { } Future removeActivityAnalytics(String roomId) async { - if (_pangeaController.matrixState.client.userID == null) return; + if (_client.userID == null) return; if (_pangeaController.userController.userL2 == null) return; final Room? analyticsRoom = await _client.getMyAnalyticsRoom( diff --git a/lib/pangea/chat_settings/utils/bot_client_extension.dart b/lib/pangea/chat_settings/utils/bot_client_extension.dart index 407f40f6b..e4094c827 100644 --- a/lib/pangea/chat_settings/utils/bot_client_extension.dart +++ b/lib/pangea/chat_settings/utils/bot_client_extension.dart @@ -53,4 +53,23 @@ extension BotClientExtension on Client { ), ], ); + + Future updateBotOptions() async { + if (!isLogged() || botDM == null) return; + + final targetLanguage = + MatrixState.pangeaController.userController.userL2?.langCode; + final cefrLevel = MatrixState + .pangeaController.userController.profile.userSettings.cefrLevel; + final updateBotOptions = botDM!.botOptions ?? BotOptionsModel(); + + if (updateBotOptions.targetLanguage == targetLanguage && + updateBotOptions.languageLevel == cefrLevel) { + return; + } + + updateBotOptions.targetLanguage = targetLanguage; + updateBotOptions.languageLevel = cefrLevel; + await botDM!.setBotOptions(updateBotOptions); + } } diff --git a/lib/pangea/common/controllers/pangea_controller.dart b/lib/pangea/common/controllers/pangea_controller.dart index f92013bfb..200eaff66 100644 --- a/lib/pangea/common/controllers/pangea_controller.dart +++ b/lib/pangea/common/controllers/pangea_controller.dart @@ -7,20 +7,16 @@ import 'package:matrix/matrix.dart'; import 'package:provider/provider.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; -import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/analytics_misc/get_analytics_controller.dart'; import 'package:fluffychat/pangea/analytics_misc/put_analytics_controller.dart'; -import 'package:fluffychat/pangea/bot/utils/bot_room_extension.dart'; -import 'package:fluffychat/pangea/chat_settings/models/bot_options_model.dart'; import 'package:fluffychat/pangea/chat_settings/utils/bot_client_extension.dart'; -import 'package:fluffychat/pangea/events/constants/pangea_event_types.dart'; -import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; import 'package:fluffychat/pangea/guard/p_vguard.dart'; import 'package:fluffychat/pangea/languages/locale_provider.dart'; import 'package:fluffychat/pangea/languages/p_language_store.dart'; import 'package:fluffychat/pangea/subscription/controllers/subscription_controller.dart'; import 'package:fluffychat/pangea/text_to_speech/tts_controller.dart'; -import 'package:fluffychat/pangea/user/controllers/user_controller.dart'; +import 'package:fluffychat/pangea/user/pangea_push_rules_extension.dart'; +import 'package:fluffychat/pangea/user/user_controller.dart'; import 'package:fluffychat/widgets/matrix.dart'; import '../utils/firebase_analytics.dart'; @@ -38,16 +34,15 @@ class PangeaController { StreamSubscription? _settingsSubscription; ///Matrix Variables - MatrixState matrixState; - Matrix matrix; + final MatrixState matrixState; - PangeaController({required this.matrix, required this.matrixState}) { + PangeaController({required this.matrixState}) { userController = UserController(this); getAnalytics = GetAnalyticsController(this); putAnalytics = PutAnalyticsController(this); subscriptionController = SubscriptionController(this); PAuthGaurd.pController = this; - _setSettingsSubscriptions(); + _registerSubscriptions(); } /// Initializes various controllers and settings. @@ -57,17 +52,115 @@ class PangeaController { void initControllers() { _initAnalyticsControllers(); subscriptionController.initialize(); - setPangeaPushRules(); + matrixState.client.setPangeaPushRules(); TtsController.setAvailableLanguages(); } - void _logOutfromPangea(BuildContext context) { - debugPrint("Pangea logout"); + void _onLogin(BuildContext context) { + initControllers(); + _registerSubscriptions(); + + userController.reinitialize().then((_) { + final l1 = userController.profile.userSettings.sourceLanguage; + Provider.of(context, listen: false).setLocale(l1); + }); + subscriptionController.reinitialize(); + } + + void _onLogout(BuildContext context) { + _disposeAnalyticsControllers(); + userController.clear(); + _languageSubscription?.cancel(); + _settingsSubscription?.cancel(); + _languageSubscription = null; + _settingsSubscription = null; + GoogleAnalytics.logout(); - clearCache(); + _clearCache(); Provider.of(context, listen: false).setLocale(null); } + void handleLoginStateChange( + LoginState state, + String? userID, + BuildContext context, + ) { + switch (state) { + case LoginState.loggedOut: + case LoginState.softLoggedOut: + _onLogout(context); + break; + case LoginState.loggedIn: + _onLogin(context); + break; + } + + Sentry.configureScope( + (scope) => scope.setUser( + SentryUser( + id: userID, + name: userID, + ), + ), + ); + GoogleAnalytics.analyticsUserUpdate(userID); + } + + void _disposeAnalyticsControllers() { + putAnalytics.dispose(); + getAnalytics.dispose(); + } + + void _registerSubscriptions() { + _languageSubscription?.cancel(); + _languageSubscription = + userController.languageStream.stream.listen(_onLanguageUpdate); + + _settingsSubscription?.cancel(); + _settingsSubscription = userController.settingsUpdateStream.stream + .listen((_) => matrixState.client.updateBotOptions()); + } + + Future _clearCache({List exclude = const []}) async { + final List> futures = []; + for (final key in _storageKeys) { + if (exclude.contains(key)) continue; + futures.add(GetStorage(key).erase()); + } + await Future.wait(futures); + } + + Future _initAnalyticsControllers() async { + putAnalytics.initialize(); + await getAnalytics.initialize(); + } + + Future resetAnalytics() async { + _disposeAnalyticsControllers(); + await _initAnalyticsControllers(); + } + + Future _onLanguageUpdate(LanguageUpdate update) async { + final exclude = [ + 'analytics_storage', + 'course_location_media_storage', + 'course_location_storage', + 'course_media_storage', + ]; + + // only clear course data if the base language has changed + if (update.prevBaseLang == update.baseLang) { + exclude.addAll([ + 'course_storage', + 'course_topic_storage', + 'course_activity_storage', + ]); + } + + _clearCache(exclude: exclude); + matrixState.client.updateBotOptions(); + } + static final List _storageKeys = [ 'mode_list_storage', 'activity_plan_storage', @@ -96,186 +189,4 @@ class PangeaController { 'course_location_media_storage', 'language_mismatch', ]; - - Future clearCache({List exclude = const []}) async { - final List> futures = []; - for (final key in _storageKeys) { - if (exclude.contains(key)) continue; - futures.add(GetStorage(key).erase()); - } - await Future.wait(futures); - } - - Future checkHomeServerAction() async { - final client = await matrixState.getLoginClient(); - if (client.homeserver != null) { - await Future.delayed(Duration.zero); - return client; - } - - final String homeServer = - AppConfig.defaultHomeserver.trim().toLowerCase().replaceAll(' ', '-'); - var homeserver = Uri.parse(homeServer); - if (homeserver.scheme.isEmpty) { - homeserver = Uri.https(homeServer, ''); - } - - try { - await client.register(); - matrixState.loginRegistrationSupported = true; - } on MatrixException catch (e) { - matrixState.loginRegistrationSupported = - e.requireAdditionalAuthentication; - } - return client; - } - - /// check user information if not found then redirect to Date of birth page - void handleLoginStateChange( - LoginState state, - String? userID, - BuildContext context, - ) { - switch (state) { - case LoginState.loggedOut: - case LoginState.softLoggedOut: - // Reset cached analytics data - _disposeAnalyticsControllers(); - userController.clear(); - _languageSubscription?.cancel(); - _settingsSubscription?.cancel(); - _languageSubscription = null; - _settingsSubscription = null; - _logOutfromPangea(context); - break; - case LoginState.loggedIn: - // Initialize analytics data - initControllers(); - _setSettingsSubscriptions(); - - userController.reinitialize().then((_) { - final l1 = userController.profile.userSettings.sourceLanguage; - Provider.of(context, listen: false).setLocale(l1); - }); - subscriptionController.reinitialize(); - break; - } - - Sentry.configureScope( - (scope) => scope.setUser( - SentryUser( - id: userID, - name: userID, - ), - ), - ); - GoogleAnalytics.analyticsUserUpdate(userID); - } - - Future _initAnalyticsControllers() async { - putAnalytics.initialize(); - await getAnalytics.initialize(); - } - - void _disposeAnalyticsControllers() { - putAnalytics.dispose(); - getAnalytics.dispose(); - } - - Future resetAnalytics() async { - _disposeAnalyticsControllers(); - await _initAnalyticsControllers(); - } - - void _setSettingsSubscriptions() { - _languageSubscription?.cancel(); - _languageSubscription = - userController.languageStream.stream.listen(_onLanguageUpdate); - _settingsSubscription?.cancel(); - _settingsSubscription = userController.settingsUpdateStream.stream - .listen((_) => _updateBotOptions()); - } - - Future _onLanguageUpdate(LanguageUpdate update) async { - final exclude = [ - 'analytics_storage', - 'course_location_media_storage', - 'course_location_storage', - 'course_media_storage', - ]; - - // only clear course data if the base language has changed - if (update.prevBaseLang == update.baseLang) { - exclude.addAll([ - 'course_storage', - 'course_topic_storage', - 'course_activity_storage', - ]); - } - - clearCache(exclude: exclude); - _updateBotOptions(); - } - - Future _updateBotOptions() async { - if (!matrixState.client.isLogged()) return; - final botDM = matrixState.client.botDM; - if (botDM == null) { - return; - } - - final targetLanguage = userController.userL2?.langCode; - final cefrLevel = userController.profile.userSettings.cefrLevel; - final updateBotOptions = botDM.botOptions ?? BotOptionsModel(); - - if (updateBotOptions.targetLanguage == targetLanguage && - updateBotOptions.languageLevel == cefrLevel) { - return; - } - - updateBotOptions.targetLanguage = targetLanguage; - updateBotOptions.languageLevel = cefrLevel; - await botDM.setBotOptions(updateBotOptions); - } - - Future setPangeaPushRules() async { - if (!matrixState.client.isLogged()) return; - final List analyticsRooms = - matrixState.client.rooms.where((room) => room.isAnalyticsRoom).toList(); - - for (final Room room in analyticsRooms) { - final pushRule = room.pushRuleState; - if (pushRule != PushRuleState.dontNotify) { - await room.setPushRuleState(PushRuleState.dontNotify); - } - } - - if (!(matrixState.client.globalPushRules?.override?.any( - (element) => element.ruleId == PangeaEventTypes.textToSpeechRule, - ) ?? - false)) { - await matrixState.client.setPushRule( - PushRuleKind.override, - PangeaEventTypes.textToSpeechRule, - [PushRuleAction.dontNotify], - conditions: [ - PushCondition( - kind: 'event_match', - key: 'content.msgtype', - pattern: MessageTypes.Audio, - ), - PushCondition( - kind: 'event_match', - key: 'content.transcription.lang_code', - pattern: '*', - ), - PushCondition( - kind: 'event_match', - key: 'content.transcription.text', - pattern: '*', - ), - ], - ); - } - } } diff --git a/lib/pangea/learning_settings/settings_learning.dart b/lib/pangea/learning_settings/settings_learning.dart index 5c5369003..6297bbab4 100644 --- a/lib/pangea/learning_settings/settings_learning.dart +++ b/lib/pangea/learning_settings/settings_learning.dart @@ -19,7 +19,7 @@ import 'package:fluffychat/pangea/learning_settings/language_level_type_enum.dar import 'package:fluffychat/pangea/learning_settings/settings_learning_view.dart'; import 'package:fluffychat/pangea/learning_settings/tool_settings_enum.dart'; import 'package:fluffychat/pangea/text_to_speech/tts_controller.dart'; -import 'package:fluffychat/pangea/user/models/user_model.dart'; +import 'package:fluffychat/pangea/user/user_model.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; diff --git a/lib/pangea/space_analytics/space_analytics.dart b/lib/pangea/space_analytics/space_analytics.dart index 1f007d196..d131d070c 100644 --- a/lib/pangea/space_analytics/space_analytics.dart +++ b/lib/pangea/space_analytics/space_analytics.dart @@ -19,7 +19,7 @@ import 'package:fluffychat/pangea/space_analytics/space_analytics_download_enum. import 'package:fluffychat/pangea/space_analytics/space_analytics_inactive_dialog.dart'; import 'package:fluffychat/pangea/space_analytics/space_analytics_request_dialog.dart'; import 'package:fluffychat/pangea/space_analytics/space_analytics_view.dart'; -import 'package:fluffychat/pangea/user/models/analytics_profile_model.dart'; +import 'package:fluffychat/pangea/user/analytics_profile_model.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; diff --git a/lib/pangea/spaces/widgets/load_participants_builder.dart b/lib/pangea/spaces/widgets/load_participants_builder.dart index 709f1557b..1ba9ee35a 100644 --- a/lib/pangea/spaces/widgets/load_participants_builder.dart +++ b/lib/pangea/spaces/widgets/load_participants_builder.dart @@ -5,7 +5,7 @@ import 'package:matrix/matrix.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/bot/utils/bot_name.dart'; import 'package:fluffychat/pangea/common/utils/error_handler.dart'; -import 'package:fluffychat/pangea/user/models/analytics_profile_model.dart'; +import 'package:fluffychat/pangea/user/analytics_profile_model.dart'; import 'package:fluffychat/widgets/matrix.dart'; class LoadParticipantsBuilder extends StatefulWidget { diff --git a/lib/pangea/subscription/controllers/subscription_controller.dart b/lib/pangea/subscription/controllers/subscription_controller.dart index 832e49422..69d9c5276 100644 --- a/lib/pangea/subscription/controllers/subscription_controller.dart +++ b/lib/pangea/subscription/controllers/subscription_controller.dart @@ -24,7 +24,7 @@ import 'package:fluffychat/pangea/subscription/repo/subscription_management_repo import 'package:fluffychat/pangea/subscription/repo/subscription_repo.dart'; import 'package:fluffychat/pangea/subscription/utils/subscription_app_id.dart'; import 'package:fluffychat/pangea/subscription/widgets/subscription_paywall.dart'; -import 'package:fluffychat/pangea/user/controllers/user_controller.dart'; +import 'package:fluffychat/pangea/user/user_controller.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/matrix.dart'; diff --git a/lib/pangea/subscription/widgets/subscription_paywall.dart b/lib/pangea/subscription/widgets/subscription_paywall.dart index b76712f3d..ee4e0b344 100644 --- a/lib/pangea/subscription/widgets/subscription_paywall.dart +++ b/lib/pangea/subscription/widgets/subscription_paywall.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pangea/common/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/subscription/widgets/subscription_options.dart'; +import 'package:fluffychat/widgets/matrix.dart'; class SubscriptionPaywall extends StatelessWidget { final PangeaController pangeaController; @@ -30,7 +31,7 @@ class SubscriptionPaywall extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - if (pangeaController.matrixState.client.rooms.length > 1) ...[ + if (Matrix.of(context).client.rooms.length > 1) ...[ Text( L10n.of(context).welcomeBack, textAlign: TextAlign.center, diff --git a/lib/pangea/toolbar/widgets/message_selection_positioner.dart b/lib/pangea/toolbar/widgets/message_selection_positioner.dart index c1bf6cb26..88ce53576 100644 --- a/lib/pangea/toolbar/widgets/message_selection_positioner.dart +++ b/lib/pangea/toolbar/widgets/message_selection_positioner.dart @@ -109,7 +109,7 @@ class MessageSelectionPositionerState extends State _reactionSubscription?.cancel(); _contentChangedSubscription?.cancel(); scrollController?.dispose(); - MatrixState.pangeaController.matrixState.audioPlayer + Matrix.of(context).audioPlayer ?..stop() ..dispose(); super.dispose(); diff --git a/lib/pangea/user/models/activities_profile_model.dart b/lib/pangea/user/activities_profile_model.dart similarity index 100% rename from lib/pangea/user/models/activities_profile_model.dart rename to lib/pangea/user/activities_profile_model.dart diff --git a/lib/pangea/user/models/analytics_profile_model.dart b/lib/pangea/user/analytics_profile_model.dart similarity index 100% rename from lib/pangea/user/models/analytics_profile_model.dart rename to lib/pangea/user/analytics_profile_model.dart diff --git a/lib/pangea/user/utils/p_login.dart b/lib/pangea/user/p_login.dart similarity index 100% rename from lib/pangea/user/utils/p_login.dart rename to lib/pangea/user/p_login.dart diff --git a/lib/pangea/user/utils/p_logout.dart b/lib/pangea/user/p_logout.dart similarity index 100% rename from lib/pangea/user/utils/p_logout.dart rename to lib/pangea/user/p_logout.dart diff --git a/lib/pangea/user/pangea_push_rules_extension.dart b/lib/pangea/user/pangea_push_rules_extension.dart new file mode 100644 index 000000000..ca670f69b --- /dev/null +++ b/lib/pangea/user/pangea_push_rules_extension.dart @@ -0,0 +1,47 @@ +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pangea/events/constants/pangea_event_types.dart'; +import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; + +extension PangeaPushRulesExtension on Client { + Future setPangeaPushRules() async { + if (!isLogged()) return; + final List analyticsRooms = + rooms.where((room) => room.isAnalyticsRoom).toList(); + + for (final Room room in analyticsRooms) { + final pushRule = room.pushRuleState; + if (pushRule != PushRuleState.dontNotify) { + await room.setPushRuleState(PushRuleState.dontNotify); + } + } + + if (!(globalPushRules?.override?.any( + (element) => element.ruleId == PangeaEventTypes.textToSpeechRule, + ) ?? + false)) { + await setPushRule( + PushRuleKind.override, + PangeaEventTypes.textToSpeechRule, + [PushRuleAction.dontNotify], + conditions: [ + PushCondition( + kind: 'event_match', + key: 'content.msgtype', + pattern: MessageTypes.Audio, + ), + PushCondition( + kind: 'event_match', + key: 'content.transcription.lang_code', + pattern: '*', + ), + PushCondition( + kind: 'event_match', + key: 'content.transcription.text', + pattern: '*', + ), + ], + ); + } + } +} diff --git a/lib/pangea/user/controllers/user_controller.dart b/lib/pangea/user/user_controller.dart similarity index 97% rename from lib/pangea/user/controllers/user_controller.dart rename to lib/pangea/user/user_controller.dart index 7143226f0..bc93190e5 100644 --- a/lib/pangea/user/controllers/user_controller.dart +++ b/lib/pangea/user/user_controller.dart @@ -17,9 +17,9 @@ import 'package:fluffychat/pangea/languages/language_model.dart'; import 'package:fluffychat/pangea/languages/language_service.dart'; import 'package:fluffychat/pangea/languages/p_language_store.dart'; import 'package:fluffychat/pangea/learning_settings/tool_settings_enum.dart'; -import 'package:fluffychat/pangea/user/models/activities_profile_model.dart'; -import 'package:fluffychat/pangea/user/models/analytics_profile_model.dart'; -import '../models/user_model.dart'; +import 'package:fluffychat/pangea/user/activities_profile_model.dart'; +import 'package:fluffychat/pangea/user/analytics_profile_model.dart'; +import 'user_model.dart'; class LanguageUpdate { final LanguageModel? prevBaseLang; @@ -370,8 +370,7 @@ class UserController { baseLanguage ??= _pangeaController.userController.userL1; if (targetLanguage == null || analyticsProfile == null) return; - final analyticsRoom = - _pangeaController.matrixState.client.analyticsRoomLocal(targetLanguage); + final analyticsRoom = client.analyticsRoomLocal(targetLanguage); if (analyticsProfile!.targetLanguage == targetLanguage && analyticsProfile!.baseLanguage == baseLanguage && @@ -396,8 +395,7 @@ class UserController { Future _addAnalyticsRoomIdsToPublicProfile() async { if (analyticsProfile?.languageAnalytics == null) return; - final analyticsRooms = - _pangeaController.matrixState.client.allMyAnalyticsRooms; + final analyticsRooms = client.allMyAnalyticsRooms; if (analyticsRooms.isEmpty) return; for (final analyticsRoom in analyticsRooms) { @@ -434,9 +432,7 @@ class UserController { analyticsProfile!.addXPOffset( targetLanguage, offset, - _pangeaController.matrixState.client - .analyticsRoomLocal(targetLanguage) - ?.id, + client.analyticsRoomLocal(targetLanguage)?.id, ); await _savePublicProfileUpdate( PangeaEventTypes.profileAnalytics, diff --git a/lib/pangea/user/models/user_model.dart b/lib/pangea/user/user_model.dart similarity index 99% rename from lib/pangea/user/models/user_model.dart rename to lib/pangea/user/user_model.dart index ee2f9557c..fae12f67b 100644 --- a/lib/pangea/user/models/user_model.dart +++ b/lib/pangea/user/user_model.dart @@ -6,7 +6,7 @@ import 'package:fluffychat/pangea/instructions/instruction_settings.dart'; import 'package:fluffychat/pangea/learning_settings/language_level_type_enum.dart'; import 'package:fluffychat/pangea/learning_settings/tool_settings_enum.dart'; import 'package:fluffychat/widgets/matrix.dart'; -import '../../languages/language_model.dart'; +import '../languages/language_model.dart'; /// The user's settings learning settings. class UserSettings { diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index 408747c54..7411a8694 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -273,7 +273,7 @@ class MatrixState extends State with WidgetsBindingObserver { ), ), ); - pangeaController = PangeaController(matrix: widget, matrixState: this); + pangeaController = PangeaController(matrixState: this); WidgetsBinding.instance.addPostFrameCallback((_) { _setAppLanguage(); _setLanguageListener();