diff --git a/lib/main.dart b/lib/main.dart index 847b012b2..9f5e656bd 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -23,7 +23,7 @@ void main() async { // #Pangea try { - await dotenv.load(fileName: ".env.local_choreo"); + await dotenv.load(fileName: ".env"); } catch (e) { Logs().e('Failed to load .env file', e); } diff --git a/lib/pangea/models/analytics/construct_list_model.dart b/lib/pangea/models/analytics/construct_list_model.dart index eeb3696bb..bcf676db3 100644 --- a/lib/pangea/models/analytics/construct_list_model.dart +++ b/lib/pangea/models/analytics/construct_list_model.dart @@ -1,5 +1,6 @@ import 'dart:math'; +import 'package:collection/collection.dart'; import 'package:fluffychat/pangea/enum/construct_type_enum.dart'; import 'package:fluffychat/pangea/models/analytics/construct_use_model.dart'; import 'package:fluffychat/pangea/models/analytics/constructs_model.dart'; @@ -127,7 +128,28 @@ class ConstructListModel { } ConstructUses? getConstructUses(ConstructIdentifier identifier) { - return _constructMap[identifier.string]; + final partialKey = "${identifier.lemma}-${identifier.type.string}"; + + if (_constructMap.containsKey(identifier.string)) { + // try to get construct use entry with full ID key + return _constructMap[identifier.string]; + } else if (identifier.category.toLowerCase() == "other") { + // if the category passed to this function is "other", return the first + // construct use entry that starts with the partial key + return _constructMap.entries + .firstWhereOrNull((entry) => entry.key.startsWith(partialKey)) + ?.value; + } else { + // if the category passed to this function is not "other", return the first + // construct use entry that starts with the partial key and ends with "other" + return _constructMap.entries + .firstWhereOrNull( + (entry) => + entry.key.startsWith(partialKey) && + entry.key.toLowerCase().endsWith("other"), + ) + ?.value; + } } List constructList({ConstructTypeEnum? type}) => _constructList diff --git a/lib/pangea/models/analytics/constructs_model.dart b/lib/pangea/models/analytics/constructs_model.dart index 3fd2feaa0..d26cd0e89 100644 --- a/lib/pangea/models/analytics/constructs_model.dart +++ b/lib/pangea/models/analytics/constructs_model.dart @@ -94,9 +94,7 @@ class OneConstructUse { useType: ConstructUseTypeUtil.fromString(json['useType']), lemma: json['lemma'], form: json['form'], - category: constructType == ConstructTypeEnum.morph - ? getCategory(json) - : "Other", + category: getCategory(json), constructType: constructType, id: json['id'], metadata: ConstructUseMetaData( diff --git a/lib/pangea/models/pangea_token_model.dart b/lib/pangea/models/pangea_token_model.dart index 20d9743f4..01061832c 100644 --- a/lib/pangea/models/pangea_token_model.dart +++ b/lib/pangea/models/pangea_token_model.dart @@ -324,16 +324,11 @@ class PangeaToken { List get constructs => _constructIDs .map( - (id) => - MatrixState.pangeaController.getAnalytics.constructListModel - .getConstructUses(id) ?? - ConstructUses( - lemma: id.lemma, - constructType: id.type, - category: id.category, - uses: [], - ), + (id) => MatrixState.pangeaController.getAnalytics.constructListModel + .getConstructUses(id), ) + .where((construct) => construct != null) + .cast() .toList(); Map toServerChoiceTokenWithXP() { diff --git a/lib/pangea/models/practice_activities.dart/practice_activity_model.dart b/lib/pangea/models/practice_activities.dart/practice_activity_model.dart index 13fdcf6c8..d871e0836 100644 --- a/lib/pangea/models/practice_activities.dart/practice_activity_model.dart +++ b/lib/pangea/models/practice_activities.dart/practice_activity_model.dart @@ -61,7 +61,10 @@ class ConstructIdentifier { return other is ConstructIdentifier && other.lemma == lemma && - other.type == type; + other.type == type && + (category == other.category || + category.toLowerCase() == "other" || + other.category.toLowerCase() == "other"); } @override diff --git a/lib/pangea/widgets/chat/message_selection_overlay.dart b/lib/pangea/widgets/chat/message_selection_overlay.dart index 790145f98..fc5d47d37 100644 --- a/lib/pangea/widgets/chat/message_selection_overlay.dart +++ b/lib/pangea/widgets/chat/message_selection_overlay.dart @@ -33,7 +33,7 @@ class MessageSelectionOverlay extends StatefulWidget { final Event? _nextEvent; final Event? _prevEvent; final PangeaMessageEvent _pangeaMessageEvent; - final PangeaToken? _selectedTokenOnInitialization; + final PangeaToken? _initialSelectedToken; const MessageSelectionOverlay({ required this.chatController, @@ -43,7 +43,7 @@ class MessageSelectionOverlay extends StatefulWidget { required Event? nextEvent, required Event? prevEvent, super.key, - }) : _selectedTokenOnInitialization = selectedTokenOnInitialization, + }) : _initialSelectedToken = selectedTokenOnInitialization, _pangeaMessageEvent = pangeaMessageEvent, _nextEvent = nextEvent, _prevEvent = prevEvent, @@ -78,16 +78,22 @@ class MessageOverlayController extends State bool get showToolbarButtons => !widget._pangeaMessageEvent.isAudioMessage; - PangeaToken? get selectedTargetTokenForWordMeaning => - widget._selectedTokenOnInitialization != null && - !(messageAnalyticsEntry?.isTokenInHiddenWordActivity( - widget._selectedTokenOnInitialization!, - ) ?? - false) && - widget._selectedTokenOnInitialization! - .shouldDoActivity(ActivityTypeEnum.wordMeaning) - ? widget._selectedTokenOnInitialization - : null; + PangeaToken? get selectedTargetTokenForWordMeaning { + if (widget._initialSelectedToken == null || messageAnalyticsEntry == null) { + return null; + } + + final isInActivity = messageAnalyticsEntry!.isTokenInHiddenWordActivity( + widget._initialSelectedToken!, + ); + + final shouldDoActivity = widget._initialSelectedToken! + .shouldDoActivity(ActivityTypeEnum.wordMeaning); + + return isInActivity && shouldDoActivity + ? widget._initialSelectedToken + : null; + } List? tokens;