diff --git a/lib/pangea/vocab_practice/vocab_practice_page.dart b/lib/pangea/vocab_practice/vocab_practice_page.dart index 4bfbfc111..d03153161 100644 --- a/lib/pangea/vocab_practice/vocab_practice_page.dart +++ b/lib/pangea/vocab_practice/vocab_practice_page.dart @@ -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 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 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 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)); diff --git a/lib/pangea/vocab_practice/vocab_practice_view.dart b/lib/pangea/vocab_practice/vocab_practice_view.dart index 7fd3783e8..d4805c373 100644 --- a/lib/pangea/vocab_practice/vocab_practice_view.dart +++ b/lib/pangea/vocab_practice/vocab_practice_view.dart @@ -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(), ),