feat: show translation option for messages outside of user L2

This commit is contained in:
ggurdin 2025-12-02 15:48:01 -05:00
parent 895654b2b5
commit b6d4db9d08
No known key found for this signature in database
GPG key ID: A01CB41737CBB478
3 changed files with 35 additions and 57 deletions

View file

@ -134,16 +134,9 @@ class MessageOverlayController extends State<MessageSelectionOverlay>
}
}
/// Decides whether an _initialSelectedToken should be used
/// for a first practice activity on the word meaning
Future<void> _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<MessageSelectionOverlay>
?.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<TTSToken> ttsTokens) {
final List<TTSToken> textToSelect = [];
@ -302,22 +282,8 @@ class MessageOverlayController extends State<MessageSelectionOverlay>
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) {

View file

@ -146,17 +146,6 @@ class SelectModeButtonsState extends State<SelectModeButtons> {
StreamSubscription? _playerStateSub;
StreamSubscription? _audioSub;
static List<SelectMode> get textModes => [
SelectMode.audio,
SelectMode.translate,
SelectMode.practice,
SelectMode.emoji,
];
static List<SelectMode> get audioModes => [
SelectMode.speechTranslation,
];
MatrixState? matrix;
@override
@ -309,13 +298,7 @@ class SelectModeButtonsState extends State<SelectModeButtons> {
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
final List<SelectMode> modes =
widget.overlayController.showLanguageAssistance
? messageEvent.isAudioMessage == true
? audioModes
: textModes
: [];
final modes = controller.readingAssistanceModes;
return Material(
type: MaterialType.transparency,
child: SizedBox(

View file

@ -113,6 +113,17 @@ class SelectModeController {
contentChangedStream.close();
}
static List<SelectMode> get textModes => [
SelectMode.audio,
SelectMode.translate,
SelectMode.practice,
SelectMode.emoji,
];
static List<SelectMode> get audioModes => [
SelectMode.speechTranslation,
];
ValueNotifier<AsyncState<String>> get translationState =>
_translationLoader.state;
@ -124,6 +135,24 @@ class SelectModeController {
(PangeaAudioFile, File?)? get audioFile => _audioLoader.value;
List<SelectMode> 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 =>