From ee882d3ea45c938939cf8141dc458dc3ef8159dc Mon Sep 17 00:00:00 2001 From: ggurdin Date: Tue, 20 Jan 2026 14:31:15 -0500 Subject: [PATCH] feat: show audio message transcripts in vocab practice --- .../analytics_misc/example_message_util.dart | 28 ++++++++++++++----- .../analytics_practice_page.dart | 7 +---- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/lib/pangea/analytics_misc/example_message_util.dart b/lib/pangea/analytics_misc/example_message_util.dart index 43a3e659c..10012f75f 100644 --- a/lib/pangea/analytics_misc/example_message_util.dart +++ b/lib/pangea/analytics_misc/example_message_util.dart @@ -6,6 +6,7 @@ import 'package:matrix/matrix.dart'; import 'package:fluffychat/pangea/analytics_misc/client_analytics_extension.dart'; import 'package:fluffychat/pangea/analytics_misc/construct_use_model.dart'; import 'package:fluffychat/pangea/events/event_wrappers/pangea_message_event.dart'; +import 'package:fluffychat/pangea/events/models/pangea_token_model.dart'; class ExampleMessageUtil { static Future?> getExampleMessage( @@ -49,14 +50,27 @@ class ExampleMessageUtil { String? form, PangeaMessageEvent messageEvent, ) { - final tokens = messageEvent.messageDisplayRepresentation?.tokens; - if (tokens == null || tokens.isEmpty) return null; - final token = tokens.firstWhereOrNull( - (token) => token.text.content == form, - ); - if (token == null) return null; + PangeaToken? token; + String? text; - final text = messageEvent.messageDisplayText; + if (messageEvent.isAudioMessage) { + final stt = messageEvent.getSpeechToTextLocal(); + if (stt == null) return null; + final tokens = stt.transcript.sttTokens.map((t) => t.token).toList(); + token = tokens.firstWhereOrNull( + (token) => token.text.content == form, + ); + text = stt.transcript.text; + } else { + final tokens = messageEvent.messageDisplayRepresentation?.tokens; + if (tokens == null || tokens.isEmpty) return null; + token = tokens.firstWhereOrNull( + (token) => token.text.content == form, + ); + text = messageEvent.messageDisplayText; + } + + if (token == null) return null; final tokenText = token.text.content; int tokenIndex = text.indexOf(tokenText); if (tokenIndex == -1) return null; diff --git a/lib/pangea/analytics_practice/analytics_practice_page.dart b/lib/pangea/analytics_practice/analytics_practice_page.dart index d80bd7800..97ca1d1a7 100644 --- a/lib/pangea/analytics_practice/analytics_practice_page.dart +++ b/lib/pangea/analytics_practice/analytics_practice_page.dart @@ -442,12 +442,7 @@ class AnalyticsPracticeState extends State PracticeTarget target, ) async { final token = target.tokens.first; - final construct = switch (widget.type) { - ConstructTypeEnum.vocab => token.vocabConstructID, - ConstructTypeEnum.morph => token.morphIdByFeature(target.morphFeature!), - }; - - if (construct == null) return null; + final construct = target.targetTokenConstructID(token); String? form; if (widget.type == ConstructTypeEnum.morph) {