diff --git a/lib/pangea/analytics_summary/learning_progress_indicators.dart b/lib/pangea/analytics_summary/learning_progress_indicators.dart index 8fe454216..ed83a22ca 100644 --- a/lib/pangea/analytics_summary/learning_progress_indicators.dart +++ b/lib/pangea/analytics_summary/learning_progress_indicators.dart @@ -37,6 +37,7 @@ class LearningProgressIndicatorsState bool _loading = true; StreamSubscription? _analyticsSubscription; + StreamSubscription? _languageSubscription; @override void initState() { @@ -50,12 +51,20 @@ class LearningProgressIndicatorsState _analyticsSubscription = MatrixState .pangeaController.getAnalytics.analyticsStream.stream .listen(updateData); + + // rebuild when target language changes + _languageSubscription = + MatrixState.pangeaController.userController.stateStream.listen((_) { + if (mounted) setState(() {}); + }); } @override void dispose() { _analyticsSubscription?.cancel(); _analyticsSubscription = null; + _languageSubscription?.cancel(); + _languageSubscription = null; super.dispose(); } diff --git a/lib/pangea/learning_settings/utils/language_list_util.dart b/lib/pangea/learning_settings/utils/language_list_util.dart index df21714f8..c958dc65d 100644 --- a/lib/pangea/learning_settings/utils/language_list_util.dart +++ b/lib/pangea/learning_settings/utils/language_list_util.dart @@ -23,10 +23,11 @@ class PangeaLanguage { List get baseOptions => _langList.toList(); - static Future initialize() async { + static Future initialize({forceRefresh = false}) async { try { _langList = await _getCachedLanguages(); - if (await _shouldFetch || + if (forceRefresh || + await _shouldFetch || _langList.isEmpty || _langList.every((lang) => !lang.l2)) { _langList = await LanguageRepo.fetchLanguages(); @@ -66,7 +67,7 @@ class PangeaLanguage { } // return true; final DateTime lastFetchedDate = DateTime.parse(dateString); - final DateTime targetDate = DateTime(2025, 2, 12); + final DateTime targetDate = DateTime(2025, 2, 26); if (lastFetchedDate.isBefore(targetDate)) { return true; } diff --git a/lib/pangea/toolbar/controllers/tts_controller.dart b/lib/pangea/toolbar/controllers/tts_controller.dart index 0544b6ed4..476ba26a5 100644 --- a/lib/pangea/toolbar/controllers/tts_controller.dart +++ b/lib/pangea/toolbar/controllers/tts_controller.dart @@ -4,6 +4,7 @@ import 'dart:developer'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:collection/collection.dart'; import 'package:flutter_tts/flutter_tts.dart' as flutter_tts; import 'package:matrix/matrix_api_lite/utils/logs.dart'; import 'package:text_to_speech/text_to_speech.dart'; @@ -80,20 +81,21 @@ class TtsController { _availableLangCodes = languages.toSet().toList(); } - void _setLanguage() { + Future _setLanguage() async { + String? langCode; if (l2LangCode != null && _availableLangCodes.contains(l2LangCode)) { - _useAlternativeTTS - ? _alternativeTTS.setLanguage(l2LangCode!) - : _tts.setLanguage(l2LangCode!); + langCode = l2LangCode; } else if (l2LangCodeShort != null) { final langCodeShort = l2LangCodeShort!; - final langCode = _availableLangCodes.firstWhere( + langCode = _availableLangCodes.firstWhereOrNull( (code) => code.startsWith(langCodeShort), - orElse: () => "en", ); - _useAlternativeTTS + } + + if (langCode != null) { + await (_useAlternativeTTS ? _alternativeTTS.setLanguage(langCode) - : _tts.setLanguage(langCode); + : _tts.setLanguage(langCode)); } } @@ -108,8 +110,6 @@ class TtsController { await _tts.awaitSpeakCompletion(true); await _setAvailableLanguages(); } - - _setLanguage(); } catch (e, s) { debugger(when: kDebugMode); ErrorHandler.logError( @@ -181,6 +181,7 @@ class TtsController { // Target ID for where to show warning popup String? targetID, }) async { + await _setLanguage(); final enableTTS = MatrixState .pangeaController.userController.profile.toolSettings.enableTTS; diff --git a/lib/pangea/user/controllers/user_controller.dart b/lib/pangea/user/controllers/user_controller.dart index 68cc8cebd..f7dd2b949 100644 --- a/lib/pangea/user/controllers/user_controller.dart +++ b/lib/pangea/user/controllers/user_controller.dart @@ -12,6 +12,7 @@ import 'package:fluffychat/pangea/common/utils/error_handler.dart'; import 'package:fluffychat/pangea/events/constants/pangea_event_types.dart'; import 'package:fluffychat/pangea/learning_settings/constants/language_constants.dart'; import 'package:fluffychat/pangea/learning_settings/models/language_model.dart'; +import 'package:fluffychat/pangea/learning_settings/utils/language_list_util.dart'; import 'package:fluffychat/pangea/user/models/profile_model.dart'; import '../models/user_model.dart'; @@ -113,6 +114,13 @@ class UserController extends BaseController { try { await _initialize(); addProfileListener(); + if (profile.userSettings.targetLanguage != null && + profile.userSettings.targetLanguage!.isNotEmpty && + _pangeaController.languageController.userL2 == null) { + // update the language list and send an update to refresh analytics summary + await PangeaLanguage.initialize(forceRefresh: true); + setState(null); + } } catch (err, s) { ErrorHandler.logError( e: err,