From 8bac7b8c5168c5873b4d69c44d1271197d916666 Mon Sep 17 00:00:00 2001 From: ggurdin <46800240+ggurdin@users.noreply.github.com> Date: Thu, 15 May 2025 09:52:01 -0400 Subject: [PATCH] chore: if user L2 and system language match in user settings page, show base language dropdown (#2810) --- .../pages/settings_learning.dart | 30 ++++++++++------ .../pages/settings_learning_view.dart | 33 +++++++++++++++++ .../widgets/p_language_dropdown.dart | 1 - lib/pangea/login/pages/user_settings.dart | 35 ++++++++++++++++++- .../login/pages/user_settings_view.dart | 16 +++++++++ 5 files changed, 103 insertions(+), 12 deletions(-) diff --git a/lib/pangea/learning_settings/pages/settings_learning.dart b/lib/pangea/learning_settings/pages/settings_learning.dart index 1275c180b..92845f6d4 100644 --- a/lib/pangea/learning_settings/pages/settings_learning.dart +++ b/lib/pangea/learning_settings/pages/settings_learning.dart @@ -97,9 +97,12 @@ class SettingsLearningController extends State { } } + bool get hasIdenticalLanguages => + selectedSourceLanguage?.langCodeShort == + selectedTargetLanguage?.langCodeShort; + Future submit() async { - if (selectedSourceLanguage?.langCodeShort == - selectedTargetLanguage?.langCodeShort) { + if (hasIdenticalLanguages) { setState(() { languageMatchError = L10n.of(context).noIdenticalLanguages; }); @@ -247,22 +250,29 @@ class SettingsLearningController extends State { _profile.userSettings.targetLanguage != null && _targetLanguage != null; LanguageModel? get selectedSourceLanguage { - return userL1 ?? pangeaController.languageController.systemLanguage; + return _selectedBaseLanguage ?? + pangeaController.languageController.systemLanguage; } LanguageModel? get selectedTargetLanguage { - return userL2 ?? + return _selectedTargetLanguage ?? ((selectedSourceLanguage?.langCode != 'en') ? PLanguageStore.byLangCode('en') : PLanguageStore.byLangCode('es')); } - LanguageModel? get userL1 => _profile.userSettings.sourceLanguage != null - ? PLanguageStore.byLangCode(_profile.userSettings.sourceLanguage!) - : null; - LanguageModel? get userL2 => _profile.userSettings.targetLanguage != null - ? PLanguageStore.byLangCode(_profile.userSettings.targetLanguage!) - : null; + LanguageModel? get _selectedBaseLanguage => + _profile.userSettings.sourceLanguage != null + ? PLanguageStore.byLangCode(_profile.userSettings.sourceLanguage!) + : null; + + LanguageModel? get _selectedTargetLanguage => + _profile.userSettings.targetLanguage != null + ? PLanguageStore.byLangCode(_profile.userSettings.targetLanguage!) + : null; + + LanguageModel? get userL1 => pangeaController.languageController.userL1; + LanguageModel? get userL2 => pangeaController.languageController.userL2; bool get publicProfile => _profile.userSettings.publicProfile ?? true; diff --git a/lib/pangea/learning_settings/pages/settings_learning_view.dart b/lib/pangea/learning_settings/pages/settings_learning_view.dart index 1609b3e1b..5edfbe0a8 100644 --- a/lib/pangea/learning_settings/pages/settings_learning_view.dart +++ b/lib/pangea/learning_settings/pages/settings_learning_view.dart @@ -8,6 +8,7 @@ import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:url_launcher/url_launcher_string.dart'; import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pangea/chat_settings/widgets/language_level_dropdown.dart'; import 'package:fluffychat/pangea/common/constants/model_keys.dart'; import 'package:fluffychat/pangea/common/widgets/full_width_dialog.dart'; @@ -173,6 +174,38 @@ class SettingsLearningView extends StatelessWidget { .colorScheme .surfaceContainerHigh, ), + AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: controller.userL1?.langCodeShort == + controller.userL2?.langCodeShort + ? Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, + ), + child: Row( + spacing: 8.0, + children: [ + Icon( + Icons.info_outlined, + color: Theme.of(context) + .colorScheme + .error, + ), + Text( + L10n.of(context) + .noIdenticalLanguages, + style: TextStyle( + color: Theme.of(context) + .colorScheme + .error, + ), + ), + ], + ), + ) + : const SizedBox.shrink(), + ), CountryPickerDropdown(controller), LanguageLevelDropdown( initialLevel: controller.cefrLevel, diff --git a/lib/pangea/learning_settings/widgets/p_language_dropdown.dart b/lib/pangea/learning_settings/widgets/p_language_dropdown.dart index 433d04270..462eaf650 100644 --- a/lib/pangea/learning_settings/widgets/p_language_dropdown.dart +++ b/lib/pangea/learning_settings/widgets/p_language_dropdown.dart @@ -195,7 +195,6 @@ class PLanguageDropdownState extends State { ? const SizedBox.shrink() : Padding( padding: const EdgeInsets.symmetric( - horizontal: 30, vertical: 5, ), child: Text( diff --git a/lib/pangea/login/pages/user_settings.dart b/lib/pangea/login/pages/user_settings.dart index 9056c963d..b403f81ff 100644 --- a/lib/pangea/login/pages/user_settings.dart +++ b/lib/pangea/login/pages/user_settings.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -28,6 +29,9 @@ class UserSettingsState extends State { PangeaController get _pangeaController => MatrixState.pangeaController; LanguageModel? selectedTargetLanguage; + LanguageModel? selectedBaseLanguage; + bool showBaseLanguageDropdown = false; + LanguageLevelTypeEnum selectedCefrLevel = LanguageLevelTypeEnum.a1; String? selectedLanguageError; @@ -62,11 +66,16 @@ class UserSettingsState extends State { @override void initState() { super.initState(); + selectedBaseLanguage = + _pangeaController.languageController.userL1 ?? _systemLanguage; selectedTargetLanguage = _pangeaController.languageController.userL2; - selectedAvatarPath = avatarPaths.first; + displayNameController.text = Matrix.of(context).client.userID?.localpart ?? Matrix.of(context).client.userID ?? ""; + + final random = Random(); + selectedAvatarPath = avatarPaths[random.nextInt(avatarPaths.length)]; } @override @@ -79,10 +88,20 @@ class UserSettingsState extends State { super.dispose(); } + void setSelectedBaseLanguage(LanguageModel? language) { + setState(() { + selectedBaseLanguage = language; + selectedLanguageError = null; + }); + } + void setSelectedTargetLanguage(LanguageModel? language) { setState(() { selectedTargetLanguage = language; selectedLanguageError = null; + if (!showBaseLanguageDropdown && _hasIdenticalLanguages) { + showBaseLanguageDropdown = true; + } }); } @@ -174,6 +193,13 @@ class UserSettingsState extends State { return; } + if (_hasIdenticalLanguages) { + setState(() { + selectedLanguageError = L10n.of(context).noIdenticalLanguages; + }); + return; + } + if (!formKey.currentState!.validate()) return; setState(() => loading = true); @@ -229,6 +255,13 @@ class UserSettingsState extends State { List get targetOptions => _pangeaController.pLanguageStore.targetOptions; + List get baseOptions => + MatrixState.pangeaController.pLanguageStore.baseOptions; + + bool get _hasIdenticalLanguages => + _systemLanguage != null && + _systemLanguage?.langCodeShort == selectedTargetLanguage?.langCodeShort; + @override Widget build(BuildContext context) => UserSettingsView(controller: this); } diff --git a/lib/pangea/login/pages/user_settings_view.dart b/lib/pangea/login/pages/user_settings_view.dart index 2ebf9c28c..a53f7e8b2 100644 --- a/lib/pangea/login/pages/user_settings_view.dart +++ b/lib/pangea/login/pages/user_settings_view.dart @@ -4,6 +4,7 @@ import 'package:collection/collection.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pangea/chat_settings/widgets/language_level_dropdown.dart'; import 'package:fluffychat/pangea/learning_settings/widgets/p_language_dropdown.dart'; import 'package:fluffychat/pangea/login/pages/pangea_login_scaffold.dart'; @@ -106,6 +107,21 @@ class UserSettingsView extends StatelessWidget { }, controller: controller.displayNameController, ), + AnimatedSize( + duration: FluffyThemes.animationDuration, + child: controller.showBaseLanguageDropdown + ? Padding( + padding: const EdgeInsets.all(8), + child: PLanguageDropdown( + languages: controller.baseOptions, + onChange: controller.setSelectedBaseLanguage, + initialLanguage: controller.selectedBaseLanguage, + hasError: controller.selectedLanguageError != null, + decorationText: L10n.of(context).myBaseLanguage, + ), + ) + : const SizedBox(), + ), Padding( padding: const EdgeInsets.all(8), child: PLanguageDropdown(