refactor(language levels): Removed Language Levels class converted it… (#1580)

* refactor(language levels): Removed Language Levels class converted it to it's own enum file

* refactor(lanugage levels): cleaned up code by removing unused varible and setting initial values to class instances

* refactor(language level): Fixed some loose ends to explicitly take a LanguageLevelTypeEnum

* refactor(language level): implemented changes after testing.

---------

Co-authored-by: ggurdin <ggurdin@gmail.com>
This commit is contained in:
sienna-sterling 2025-01-27 16:47:14 -05:00 committed by GitHub
parent cb98328adf
commit 2754bff62e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
15 changed files with 165 additions and 85 deletions

View file

@ -1,11 +1,12 @@
import 'package:fluffychat/pangea/activity_planner/media_enum.dart';
import 'package:fluffychat/pangea/learning_settings/enums/language_level_type_enum.dart';
class ActivityPlanRequest {
final String topic;
final String mode;
final String objective;
final MediaEnum media;
final int cefrLevel;
final LanguageLevelTypeEnum cefrLevel;
final String languageOfInstructions;
final String targetLanguage;
final int count;
@ -29,7 +30,7 @@ class ActivityPlanRequest {
'mode': mode,
'objective': objective,
'media': media.string,
'cefr_level': cefrLanguageLevel,
'cefr_level': cefrLevel,
'language_of_instructions': languageOfInstructions,
'target_language': targetLanguage,
'count': count,
@ -38,28 +39,28 @@ class ActivityPlanRequest {
}
factory ActivityPlanRequest.fromJson(Map<String, dynamic> json) {
int cefrLevel = 0;
LanguageLevelTypeEnum cefrLevel = LanguageLevelTypeEnum.a1;
switch (json['cefr_level']) {
case 'Pre-A1':
cefrLevel = 0;
cefrLevel = LanguageLevelTypeEnum.preA1;
break;
case 'A1':
cefrLevel = 1;
cefrLevel = LanguageLevelTypeEnum.a1;
break;
case 'A2':
cefrLevel = 2;
cefrLevel = LanguageLevelTypeEnum.a2;
break;
case 'B1':
cefrLevel = 3;
cefrLevel = LanguageLevelTypeEnum.b1;
break;
case 'B2':
cefrLevel = 4;
cefrLevel = LanguageLevelTypeEnum.b2;
break;
case 'C1':
cefrLevel = 5;
cefrLevel = LanguageLevelTypeEnum.c1;
break;
case 'C2':
cefrLevel = 6;
cefrLevel = LanguageLevelTypeEnum.c2;
break;
}
return ActivityPlanRequest(
@ -77,25 +78,4 @@ class ActivityPlanRequest {
String get storageKey =>
'$topic-$mode-$objective-${media.string}-$cefrLevel-$languageOfInstructions-$targetLanguage-$numberOfParticipants';
String get cefrLanguageLevel {
switch (cefrLevel) {
case 0:
return 'Pre-A1';
case 1:
return 'A1';
case 2:
return 'A2';
case 3:
return 'B1';
case 4:
return 'B2';
case 5:
return 'C1';
case 6:
return 'C2';
default:
return 'Pre-A1';
}
}
}

View file

@ -18,6 +18,7 @@ import 'package:fluffychat/pangea/chat_settings/widgets/language_level_dropdown.
import 'package:fluffychat/pangea/instructions/instructions_enum.dart';
import 'package:fluffychat/pangea/instructions/instructions_inline_tooltip.dart';
import 'package:fluffychat/pangea/learning_settings/constants/language_constants.dart';
import 'package:fluffychat/pangea/learning_settings/enums/language_level_type_enum.dart';
import 'package:fluffychat/pangea/learning_settings/widgets/p_language_dropdown.dart';
import 'package:fluffychat/widgets/matrix.dart';
@ -48,7 +49,7 @@ class ActivityPlannerPageState extends State<ActivityPlannerPage> {
MediaEnum _selectedMedia = MediaEnum.nan;
String? _selectedLanguageOfInstructions;
String? _selectedTargetLanguage;
int? _selectedCefrLevel;
LanguageLevelTypeEnum? _selectedCefrLevel;
int? _selectedNumberOfParticipants;
List<String> activities = [];
@ -67,7 +68,7 @@ class ActivityPlannerPageState extends State<ActivityPlannerPage> {
MatrixState.pangeaController.languageController.userL1?.langCode;
_selectedTargetLanguage =
MatrixState.pangeaController.languageController.userL2?.langCode;
_selectedCefrLevel = 0;
_selectedCefrLevel = LanguageLevelTypeEnum.a1;
_selectedNumberOfParticipants = max(room?.getParticipants().length ?? 1, 1);
}
@ -278,7 +279,7 @@ class ActivityPlannerPageState extends State<ActivityPlannerPage> {
),
const SizedBox(height: 24),
LanguageLevelDropdown(
initialLevel: 0,
initialLevel: _selectedCefrLevel,
onChanged: (val) => _selectedCefrLevel = val,
),
const SizedBox(height: 24),

View file

@ -8,9 +8,10 @@ import 'package:fluffychat/pangea/chat_settings/constants/bot_mode.dart';
import 'package:fluffychat/pangea/common/constants/model_keys.dart';
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/enums/language_level_type_enum.dart';
class BotOptionsModel {
int? languageLevel;
LanguageLevelTypeEnum languageLevel;
String topic;
List<String> keywords;
bool safetyModeration;
@ -30,7 +31,7 @@ class BotOptionsModel {
////////////////////////////////////////////////////////////////////////////
// General Bot Options
////////////////////////////////////////////////////////////////////////////
this.languageLevel,
this.languageLevel = LanguageLevelTypeEnum.a1,
this.topic = "General Conversation",
this.keywords = const [],
this.safetyModeration = true,
@ -65,10 +66,12 @@ class BotOptionsModel {
// General Bot Options
//////////////////////////////////////////////////////////////////////////
languageLevel: json[ModelKey.languageLevel] is int
? json[ModelKey.languageLevel]
: json[ModelKey] == "PREA1"
? 0
: null,
? LanguageLevelTypeEnumExtension.fromInt(json[ModelKey.languageLevel])
: json[ModelKey.languageLevel] is String
? LanguageLevelTypeEnumExtension.fromString(
json[ModelKey.languageLevel],
)
: LanguageLevelTypeEnum.a1,
safetyModeration: json[ModelKey.safetyModeration] ?? true,
mode: json[ModelKey.mode] ?? BotMode.discussion,
targetLanguage: json[ModelKey.targetLanguage],
@ -104,7 +107,7 @@ class BotOptionsModel {
final data = <String, dynamic>{};
try {
// data[ModelKey.isConversationBotChat] = isConversationBotChat;
data[ModelKey.languageLevel] = languageLevel;
data[ModelKey.languageLevel] = languageLevel.storageInt;
data[ModelKey.safetyModeration] = safetyModeration;
data[ModelKey.mode] = mode;
data[ModelKey.targetLanguage] = targetLanguage;

View file

@ -2,26 +2,29 @@ import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:fluffychat/pangea/learning_settings/enums/language_level_type_enum.dart';
class LanguageLevelTextPicker {
static String languageLevelText(BuildContext context, int languageLevel) {
static String languageLevelText(
BuildContext context,
LanguageLevelTypeEnum languageLevel,
) {
final L10n copy = L10n.of(context);
switch (languageLevel) {
case 0:
case LanguageLevelTypeEnum.preA1:
return copy.languageLevelPreA1;
case 1:
case LanguageLevelTypeEnum.a1:
return copy.languageLevelA1;
case 2:
case LanguageLevelTypeEnum.a2:
return copy.languageLevelA2;
case 3:
case LanguageLevelTypeEnum.b1:
return copy.languageLevelB1;
case 4:
case LanguageLevelTypeEnum.b2:
return copy.languageLevelB2;
case 5:
case LanguageLevelTypeEnum.c1:
return copy.languageLevelC1;
case 6:
case LanguageLevelTypeEnum.c2:
return copy.languageLevelC2;
default:
return "undefined level";
}
}
}

View file

@ -17,6 +17,7 @@ import 'package:fluffychat/pangea/common/utils/error_handler.dart';
import 'package:fluffychat/pangea/common/widgets/full_width_dialog.dart';
import 'package:fluffychat/pangea/events/constants/pangea_event_types.dart';
import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart';
import 'package:fluffychat/pangea/learning_settings/enums/language_level_type_enum.dart';
import 'package:fluffychat/widgets/matrix.dart';
class ConversationBotSettings extends StatefulWidget {
@ -168,8 +169,8 @@ class ConversationBotSettingsDialogState
setState(() => botOptions.targetVoice = voice);
}
void onUpdateBotLanguageLevel(int? level) {
setState(() => botOptions.languageLevel = level);
void onUpdateBotLanguageLevel(LanguageLevelTypeEnum? level) {
setState(() => botOptions.languageLevel = level!);
}
@override

View file

@ -8,6 +8,7 @@ import 'package:fluffychat/pangea/chat_settings/widgets/conversation_bot/convers
import 'package:fluffychat/pangea/chat_settings/widgets/conversation_bot/conversation_bot_mode_select.dart';
import 'package:fluffychat/pangea/chat_settings/widgets/conversation_bot/conversation_bot_no_permission_dialog.dart';
import 'package:fluffychat/pangea/chat_settings/widgets/language_level_dropdown.dart';
import 'package:fluffychat/pangea/learning_settings/enums/language_level_type_enum.dart';
import 'package:fluffychat/widgets/matrix.dart';
class ConversationBotSettingsForm extends StatelessWidget {
@ -24,7 +25,7 @@ class ConversationBotSettingsForm extends StatelessWidget {
final void Function(String?) onUpdateBotMode;
final void Function(String?) onUpdateBotLanguage;
final void Function(String?) onUpdateBotVoice;
final void Function(int?) onUpdateBotLanguageLevel;
final void Function(LanguageLevelTypeEnum?) onUpdateBotLanguageLevel;
const ConversationBotSettingsForm({
super.key,
@ -92,8 +93,10 @@ class ConversationBotSettingsForm extends StatelessWidget {
onTap: hasPermission ? null : () => showNoPermissionDialog(context),
child: LanguageLevelDropdown(
initialLevel: botOptions.languageLevel,
onChanged:
hasPermission && enabled ? onUpdateBotLanguageLevel : null,
onChanged: hasPermission && enabled
? (value) =>
onUpdateBotLanguageLevel(value as LanguageLevelTypeEnum?)
: null,
validator: (value) => enabled && value == null
? L10n.of(context).enterLanguageLevel
: null,

View file

@ -4,17 +4,17 @@ import 'package:dropdown_button2/dropdown_button2.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:fluffychat/pangea/chat_settings/utils/language_level_copy.dart';
import 'package:fluffychat/pangea/learning_settings/constants/language_constants.dart';
import 'package:fluffychat/pangea/learning_settings/enums/language_level_type_enum.dart';
class LanguageLevelDropdown extends StatelessWidget {
final int? initialLevel;
final void Function(int?)? onChanged;
final String? Function(int?)? validator;
final LanguageLevelTypeEnum? initialLevel;
final Function(LanguageLevelTypeEnum)? onChanged;
final FormFieldValidator<Object>? validator;
final bool enabled;
const LanguageLevelDropdown({
super.key,
this.initialLevel,
this.initialLevel = LanguageLevelTypeEnum.a1,
this.onChanged,
this.validator,
this.enabled = true,
@ -22,7 +22,7 @@ class LanguageLevelDropdown extends StatelessWidget {
@override
Widget build(BuildContext context) {
return DropdownButtonFormField2(
return DropdownButtonFormField2<LanguageLevelTypeEnum>(
decoration: InputDecoration(labelText: L10n.of(context).cefrLevelLabel),
hint: Text(
L10n.of(context).selectLanguageLevel,
@ -30,7 +30,8 @@ class LanguageLevelDropdown extends StatelessWidget {
textAlign: TextAlign.center,
),
value: initialLevel,
items: LanguageLevelType.allInts.map((int levelOption) {
items:
LanguageLevelTypeEnum.values.map((LanguageLevelTypeEnum levelOption) {
return DropdownMenuItem(
value: levelOption,
child: Text(
@ -43,7 +44,9 @@ class LanguageLevelDropdown extends StatelessWidget {
),
);
}).toList(),
onChanged: enabled ? onChanged : null,
onChanged: enabled
? (value) => onChanged?.call(value as LanguageLevelTypeEnum)
: null,
validator: validator,
);
}

View file

@ -6,6 +6,7 @@ import 'package:http/http.dart' as http;
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:fluffychat/pangea/common/constants/model_keys.dart';
import 'package:fluffychat/pangea/learning_settings/enums/language_level_type_enum.dart';
import 'package:fluffychat/widgets/matrix.dart';
class Requests {
@ -25,7 +26,7 @@ class Requests {
required Map<dynamic, dynamic> body,
}) async {
body[ModelKey.cefrLevel] = MatrixState
.pangeaController.userController.profile.userSettings.cefrLevel;
.pangeaController.userController.profile.userSettings.cefrLevel.string;
dynamic encoded;
encoded = jsonEncode(body);
@ -47,7 +48,7 @@ class Requests {
required Map<dynamic, dynamic> body,
}) async {
body[ModelKey.cefrLevel] = MatrixState
.pangeaController.userController.profile.userSettings.cefrLevel;
.pangeaController.userController.profile.userSettings.cefrLevel.string;
dynamic encoded;
encoded = jsonEncode(body);

View file

@ -7,10 +7,6 @@ class LanguageKeys {
static const multiLanguage = "multi";
}
class LanguageLevelType {
static List<int> get allInts => [0, 1, 2, 3, 4, 5, 6];
}
class PrefKey {
static const lastFetched = 'p_lang_lastfetched';
static const flags = 'p_lang_flag';

View file

@ -0,0 +1,86 @@
enum LanguageLevelTypeEnum { preA1, a1, a2, b1, b2, c1, c2 }
extension LanguageLevelTypeEnumExtension on LanguageLevelTypeEnum {
// Makes enum a string
String get string {
switch (this) {
case LanguageLevelTypeEnum.preA1:
return 'Pre-A1';
case LanguageLevelTypeEnum.a1:
return 'A1';
case LanguageLevelTypeEnum.a2:
return 'A2';
case LanguageLevelTypeEnum.b1:
return 'B1';
case LanguageLevelTypeEnum.b2:
return 'B2';
case LanguageLevelTypeEnum.c1:
return 'C1';
case LanguageLevelTypeEnum.c2:
return 'C2';
}
}
// Makes enum an int
int get storageInt {
switch (this) {
case LanguageLevelTypeEnum.preA1:
return 0;
case LanguageLevelTypeEnum.a1:
return 1;
case LanguageLevelTypeEnum.a2:
return 2;
case LanguageLevelTypeEnum.b1:
return 3;
case LanguageLevelTypeEnum.b2:
return 4;
case LanguageLevelTypeEnum.c1:
return 5;
case LanguageLevelTypeEnum.c2:
return 6;
}
}
static LanguageLevelTypeEnum fromInt(int? value) {
switch (value) {
case 0:
return LanguageLevelTypeEnum.preA1;
case 1:
return LanguageLevelTypeEnum.a1;
case 2:
return LanguageLevelTypeEnum.a2;
case 3:
return LanguageLevelTypeEnum.b1;
case 4:
return LanguageLevelTypeEnum.b2;
case 5:
return LanguageLevelTypeEnum.c1;
case 6:
return LanguageLevelTypeEnum.c2;
default:
return LanguageLevelTypeEnum.a1;
}
}
static LanguageLevelTypeEnum fromString(String? value) {
switch (value) {
case 'PREA1':
case 'Pre-A1':
return LanguageLevelTypeEnum.preA1;
case 'A1':
return LanguageLevelTypeEnum.a1;
case 'A2':
return LanguageLevelTypeEnum.a2;
case 'B1':
return LanguageLevelTypeEnum.b1;
case 'B2':
return LanguageLevelTypeEnum.b2;
case 'C1':
return LanguageLevelTypeEnum.c1;
case 'C2':
return LanguageLevelTypeEnum.c2;
default:
return LanguageLevelTypeEnum.a1;
}
}
}

View file

@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:country_picker/country_picker.dart';
import 'package:fluffychat/pangea/common/controllers/pangea_controller.dart';
import 'package:fluffychat/pangea/learning_settings/enums/language_level_type_enum.dart';
import 'package:fluffychat/pangea/learning_settings/pages/settings_learning_view.dart';
import 'package:fluffychat/pangea/learning_settings/widgets/p_language_dialog.dart';
import 'package:fluffychat/pangea/spaces/models/space_model.dart';
@ -44,10 +45,10 @@ class SettingsLearningController extends State<SettingsLearning> {
setState(() {});
}
void setCefrLevel(int? cefrLevel) {
void setCefrLevel(LanguageLevelTypeEnum? cefrLevel) {
pangeaController.userController.updateProfile(
(profile) {
profile.userSettings.cefrLevel = cefrLevel;
profile.userSettings.cefrLevel = cefrLevel ?? LanguageLevelTypeEnum.a1;
return profile;
},
);
@ -106,7 +107,7 @@ class SettingsLearningController extends State<SettingsLearning> {
bool get publicProfile =>
pangeaController.userController.profile.userSettings.publicProfile;
int? get cefrLevel =>
LanguageLevelTypeEnum get cefrLevel =>
pangeaController.userController.profile.userSettings.cefrLevel;
@override

View file

@ -10,6 +10,7 @@ import 'package:matrix/matrix.dart';
import 'package:fluffychat/pangea/common/constants/local.key.dart';
import 'package:fluffychat/pangea/common/controllers/pangea_controller.dart';
import 'package:fluffychat/pangea/common/utils/error_handler.dart';
import 'package:fluffychat/pangea/learning_settings/enums/language_level_type_enum.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/login/pages/user_settings_view.dart';
@ -28,7 +29,7 @@ class UserSettingsState extends State<UserSettingsPage> {
PangeaController get _pangeaController => MatrixState.pangeaController;
LanguageModel? selectedTargetLanguage;
int selectedCefrLevel = 0;
LanguageLevelTypeEnum selectedCefrLevel = LanguageLevelTypeEnum.a1;
String? selectedLanguageError;
String? profileCreationError;
@ -98,9 +99,9 @@ class UserSettingsState extends State<UserSettingsPage> {
});
}
void setSelectedCefrLevel(int? cefrLevel) {
void setSelectedCefrLevel(LanguageLevelTypeEnum? cefrLevel) {
setState(() {
selectedCefrLevel = cefrLevel ?? 0;
selectedCefrLevel = cefrLevel ?? LanguageLevelTypeEnum.a1;
});
}

View file

@ -102,7 +102,7 @@ class UserSettingsView extends StatelessWidget {
padding: const EdgeInsets.all(8),
child: LanguageLevelDropdown(
onChanged: controller.setSelectedCefrLevel,
initialLevel: controller.selectedCefrLevel ?? 0,
initialLevel: controller.selectedCefrLevel,
),
),
if (controller.isSSOSignup)

View file

@ -16,14 +16,12 @@ class LanguageSettingsModel {
String? city;
String? country;
String? schoolName;
int? languageLevel;
String dominantLanguage;
String targetLanguage;
LanguageSettingsModel({
this.dominantLanguage = SpaceConstants.defaultDominantLanguage,
this.targetLanguage = SpaceConstants.defaultTargetLanguage,
this.languageLevel,
this.city,
this.country,
this.schoolName,
@ -39,7 +37,6 @@ class LanguageSettingsModel {
targetLanguage: LanguageModel.codeFromNameOrCode(
json['target_language'] ?? LanguageKeys.unknownLanguage,
),
languageLevel: json['language_level'],
schoolName: json['school_name'],
);
}
@ -53,7 +50,6 @@ class LanguageSettingsModel {
data['dominant_language'] = dominantLanguage;
//check for and do "english" => en and "spanish" => es
data['target_language'] = targetLanguage;
data['language_level'] = languageLevel;
data['school_name'] = schoolName;
return data;
} catch (e, s) {

View file

@ -3,6 +3,7 @@ import 'package:matrix/matrix.dart';
import 'package:fluffychat/pangea/common/constants/model_keys.dart';
import 'package:fluffychat/pangea/common/controllers/pangea_controller.dart';
import 'package:fluffychat/pangea/instructions/instruction_settings.dart';
import 'package:fluffychat/pangea/learning_settings/enums/language_level_type_enum.dart';
import 'package:fluffychat/pangea/spaces/models/space_model.dart';
import 'package:fluffychat/widgets/matrix.dart';
import '../../learning_settings/models/language_model.dart';
@ -19,7 +20,7 @@ class UserSettings {
String? sourceLanguage;
String? country;
bool? hasJoinedHelpSpace;
int? cefrLevel;
LanguageLevelTypeEnum cefrLevel;
UserSettings({
this.dateOfBirth,
@ -32,7 +33,7 @@ class UserSettings {
this.sourceLanguage,
this.country,
this.hasJoinedHelpSpace,
this.cefrLevel,
this.cefrLevel = LanguageLevelTypeEnum.a1,
});
factory UserSettings.fromJson(Map<String, dynamic> json) => UserSettings(
@ -50,7 +51,11 @@ class UserSettings {
sourceLanguage: json[ModelKey.l1LanguageKey],
country: json[ModelKey.userCountry],
hasJoinedHelpSpace: json[ModelKey.hasJoinedHelpSpace],
cefrLevel: json[ModelKey.cefrLevel],
cefrLevel: json[ModelKey.cefrLevel] is String
? LanguageLevelTypeEnumExtension.fromString(
json[ModelKey.cefrLevel],
)
: LanguageLevelTypeEnum.a1,
);
Map<String, dynamic> toJson() {
@ -65,7 +70,7 @@ class UserSettings {
data[ModelKey.l1LanguageKey] = sourceLanguage;
data[ModelKey.userCountry] = country;
data[ModelKey.hasJoinedHelpSpace] = hasJoinedHelpSpace;
data[ModelKey.cefrLevel] = cefrLevel;
data[ModelKey.cefrLevel] = cefrLevel.string;
return data;
}