From b6d4db9d0846181b53d3c86c67a7195bb8426047 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Tue, 2 Dec 2025 15:48:01 -0500 Subject: [PATCH] feat: show translation option for messages outside of user L2 --- .../widgets/message_selection_overlay.dart | 44 +++---------------- .../toolbar/widgets/select_mode_buttons.dart | 19 +------- .../widgets/select_mode_controller.dart | 29 ++++++++++++ 3 files changed, 35 insertions(+), 57 deletions(-) diff --git a/lib/pangea/toolbar/widgets/message_selection_overlay.dart b/lib/pangea/toolbar/widgets/message_selection_overlay.dart index e47b7eabd..9753d9718 100644 --- a/lib/pangea/toolbar/widgets/message_selection_overlay.dart +++ b/lib/pangea/toolbar/widgets/message_selection_overlay.dart @@ -134,16 +134,9 @@ class MessageOverlayController extends State } } - /// Decides whether an _initialSelectedToken should be used - /// for a first practice activity on the word meaning - Future _initializeSelectedToken() async { - // if there is no initial selected token, then we don't need to do anything - if (widget._initialSelectedToken == null) { - return; - } - - updateSelectedSpan(widget._initialSelectedToken!.text); - } + void _initializeSelectedToken() => widget._initialSelectedToken != null + ? updateSelectedSpan(widget._initialSelectedToken!.text) + : null; ///////////////////////////////////// /// State setting @@ -250,19 +243,6 @@ class MessageOverlayController extends State ?.firstWhereOrNull(isTokenSelected); } - bool get showLanguageAssistance { - if (!event.status.isSent || event.type != EventTypes.Message) { - return false; - } - - if (event.messageType == MessageTypes.Text) { - return pangeaMessageEvent.messageDisplayLangCode.split("-").first == - MatrixState.pangeaController.languageController.userL2!.langCodeShort; - } - - return event.messageType == MessageTypes.Audio; - } - /// If sentence TTS is playing a word, highlight that word in message overlay void highlightCurrentText(int currentPosition, List ttsTokens) { final List textToSelect = []; @@ -302,22 +282,8 @@ class MessageOverlayController extends State void onClickOverlayMessageToken( PangeaToken token, - ) { - // /// we don't want to associate the audio with the text in this mode - // if (practiceSelection?.hasActiveActivityByToken( - // ActivityTypeEnum.wordFocusListening, - // token, - // ) == - // false || - // !hideWordCardContent) { - // TtsController.tryToSpeak( - // token.text.content, - // targetID: null, - // langCode: pangeaMessageEvent.messageDisplayLangCode, - // ); - // } - updateSelectedSpan(token.text); - } + ) => + updateSelectedSpan(token.text); /// Whether the given token is currently selected or highlighted bool isTokenSelected(PangeaToken token) { diff --git a/lib/pangea/toolbar/widgets/select_mode_buttons.dart b/lib/pangea/toolbar/widgets/select_mode_buttons.dart index 192a49cc3..5610ecb7b 100644 --- a/lib/pangea/toolbar/widgets/select_mode_buttons.dart +++ b/lib/pangea/toolbar/widgets/select_mode_buttons.dart @@ -146,17 +146,6 @@ class SelectModeButtonsState extends State { StreamSubscription? _playerStateSub; StreamSubscription? _audioSub; - static List get textModes => [ - SelectMode.audio, - SelectMode.translate, - SelectMode.practice, - SelectMode.emoji, - ]; - - static List get audioModes => [ - SelectMode.speechTranslation, - ]; - MatrixState? matrix; @override @@ -309,13 +298,7 @@ class SelectModeButtonsState extends State { @override Widget build(BuildContext context) { final theme = Theme.of(context); - final List modes = - widget.overlayController.showLanguageAssistance - ? messageEvent.isAudioMessage == true - ? audioModes - : textModes - : []; - + final modes = controller.readingAssistanceModes; return Material( type: MaterialType.transparency, child: SizedBox( diff --git a/lib/pangea/toolbar/widgets/select_mode_controller.dart b/lib/pangea/toolbar/widgets/select_mode_controller.dart index ea42548cd..013294b52 100644 --- a/lib/pangea/toolbar/widgets/select_mode_controller.dart +++ b/lib/pangea/toolbar/widgets/select_mode_controller.dart @@ -113,6 +113,17 @@ class SelectModeController { contentChangedStream.close(); } + static List get textModes => [ + SelectMode.audio, + SelectMode.translate, + SelectMode.practice, + SelectMode.emoji, + ]; + + static List get audioModes => [ + SelectMode.speechTranslation, + ]; + ValueNotifier> get translationState => _translationLoader.state; @@ -124,6 +135,24 @@ class SelectModeController { (PangeaAudioFile, File?)? get audioFile => _audioLoader.value; + List get readingAssistanceModes { + final validTypes = {MessageTypes.Text, MessageTypes.Audio}; + if (!messageEvent.event.status.isSent || + messageEvent.event.type != EventTypes.Message || + !validTypes.contains(messageEvent.event.messageType)) { + return []; + } + + if (messageEvent.event.messageType == MessageTypes.Text) { + final matchesL2 = messageEvent.messageDisplayLangCode.split("-").first == + MatrixState.pangeaController.languageController.userL2!.langCodeShort; + + return matchesL2 ? textModes : [SelectMode.translate]; + } + + return audioModes; + } + bool get isLoading => currentModeStateNotifier?.value is AsyncLoading; bool get isShowingExtraContent =>