Merge pull request #5240 from pangeachat/5210-add-transcriptionaudio-to-practice

feat: add transcript in vocab practice view
This commit is contained in:
ggurdin 2026-01-16 13:34:33 -05:00 committed by GitHub
commit 5044e070da
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 38 additions and 7 deletions

View file

@ -22,6 +22,7 @@ import 'package:fluffychat/pangea/practice_activities/multiple_choice_activity_m
import 'package:fluffychat/pangea/practice_activities/practice_activity_model.dart';
import 'package:fluffychat/pangea/practice_activities/practice_generation_repo.dart';
import 'package:fluffychat/pangea/practice_activities/practice_target.dart';
import 'package:fluffychat/pangea/text_to_speech/tts_controller.dart';
import 'package:fluffychat/pangea/vocab_practice/vocab_practice_session_model.dart';
import 'package:fluffychat/pangea/vocab_practice/vocab_practice_session_repo.dart';
import 'package:fluffychat/pangea/vocab_practice/vocab_practice_view.dart';
@ -258,6 +259,12 @@ class VocabPracticeState extends State<VocabPractice> with AnalyticsUpdater {
activityState.value = const AsyncState.loading();
final nextActivityCompleter = _queue.removeFirst();
activityConstructId.value = nextActivityCompleter.key;
TtsController.tryToSpeak(
nextActivityCompleter.key.lemma,
langCode:
MatrixState.pangeaController.userController.userL2!.langCode,
);
final activity = await nextActivityCompleter.value.future;
activityState.value = AsyncState.loaded(activity);
}
@ -276,12 +283,16 @@ class VocabPracticeState extends State<VocabPractice> with AnalyticsUpdater {
try {
activityState.value = const AsyncState.loading();
final req = requests.first;
activityConstructId.value = req.targetTokens.first.vocabConstructID;
TtsController.tryToSpeak(
req.targetTokens.first.vocabConstructID.lemma,
langCode: MatrixState.pangeaController.userController.userL2!.langCode,
);
final res = await _fetchActivity(req);
if (!mounted) return;
activityConstructId.value = req.targetTokens.first.vocabConstructID;
activityState.value = AsyncState.loaded(res);
} catch (e) {
if (!mounted) return;
@ -397,6 +408,11 @@ class VocabPracticeState extends State<VocabPractice> with AnalyticsUpdater {
await _saveSession();
if (!correct) return;
TtsController.tryToSpeak(
activity.targetTokens.first.vocabConstructID.lemma,
langCode: MatrixState.pangeaController.userController.userL2!.langCode,
);
// Display the fact that the choice was correct before loading the next activity
await Future.delayed(const Duration(milliseconds: 1000));

View file

@ -7,6 +7,7 @@ import 'package:fluffychat/pangea/common/utils/async_state.dart';
import 'package:fluffychat/pangea/common/widgets/error_indicator.dart';
import 'package:fluffychat/pangea/instructions/instructions_enum.dart';
import 'package:fluffychat/pangea/instructions/instructions_inline_tooltip.dart';
import 'package:fluffychat/pangea/phonetic_transcription/phonetic_transcription_widget.dart';
import 'package:fluffychat/pangea/practice_activities/activity_type_enum.dart';
import 'package:fluffychat/pangea/practice_activities/practice_activity_model.dart';
import 'package:fluffychat/pangea/vocab_practice/choice_cards/audio_choice_card.dart';
@ -17,6 +18,7 @@ import 'package:fluffychat/pangea/vocab_practice/vocab_practice_page.dart';
import 'package:fluffychat/pangea/vocab_practice/vocab_practice_session_model.dart';
import 'package:fluffychat/pangea/vocab_practice/vocab_timer_widget.dart';
import 'package:fluffychat/widgets/layouts/max_width_body.dart';
import 'package:fluffychat/widgets/matrix.dart';
class VocabPracticeView extends StatelessWidget {
final VocabPracticeState controller;
@ -123,13 +125,26 @@ class _VocabActivityView extends StatelessWidget {
child: ValueListenableBuilder(
valueListenable: controller.activityConstructId,
builder: (context, constructId, __) => constructId != null
? Text(
constructId.lemma,
textAlign: TextAlign.center,
style:
Theme.of(context).textTheme.titleLarge?.copyWith(
? Column(
spacing: 12.0,
children: [
Text(
constructId.lemma,
textAlign: TextAlign.center,
style: Theme.of(context)
.textTheme
.titleLarge
?.copyWith(
fontWeight: FontWeight.bold,
),
),
PhoneticTranscriptionWidget(
text: constructId.lemma,
textLanguage: MatrixState
.pangeaController.userController.userL2!,
style: const TextStyle(fontSize: 14.0),
),
],
)
: const SizedBox(),
),