diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index 368cad4fc..c830d3583 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -3113,8 +3113,8 @@ "almostPerfect": "That seems right! Here's what I would have said.", "prettyGood": "Pretty good! Here's what I would have said.", "letMeThink": "Hmm, let's see how you did!", - "clickMessageTitle": "Select messages for language help!", - "clickMessageBody": "Messages always show in your target language but you can select them to access definitions and translations!", + "clickMessageTitle": "Need help?", + "clickMessageBody": "Click messages to access definitions, translations, and audio!", "understandingMessagesTitle": "Definitions and translations!", "addToClass": "Add this chat to ", "understandingMessagesBody": "Click underlined words for definitions. Translate with message options (upper right).", diff --git a/assets/l10n/intl_es.arb b/assets/l10n/intl_es.arb index c249f8a41..78e109aca 100644 --- a/assets/l10n/intl_es.arb +++ b/assets/l10n/intl_es.arb @@ -3275,8 +3275,6 @@ "almostPerfect": "¡Eso parece correcto! Esto es lo que yo hubiera dicho.", "prettyGood": "¡Bastante bien! Esto es lo que yo hubiera dicho.", "letMeThink": "Hmm, ¡vamos a ver cómo le fue!", - "clickMessageTitle": "¡Seleccione mensajes para obtener ayuda con el idioma!", - "clickMessageBody": "Los mensajes siempre se muestran en su idioma de destino, ¡pero puede seleccionarlos para acceder a definiciones y traducciones!", "understandingMessagesTitle": "¡Definiciones y traducciones!", "understandingMessagesBody": "Haga clic en las palabras subrayadas para ver las definiciones. Traduzca con 'opciones de mensajes' (arriba a la derecha).", "allDone": "¡Listo!", @@ -4576,6 +4574,8 @@ "messageAudio": "mensaje de audio", "definitions": "definiciones", "subscribedToUnlockTools": "Suscríbase para desbloquear herramientas lingüísticas, como", + "clickMessageTitle": "¿Necesitas ayuda?", + "clickMessageBody": "Haga clic en los mensajes para acceder a las definiciones, traducciones y audio.", "more": "Más", "translationTooltip": "Traducir", "audioTooltip": "Reproducir audio" diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index f5e6f3b6b..a7aa744ba 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -24,12 +24,14 @@ import 'package:fluffychat/pangea/models/pangea_message_event.dart'; import 'package:fluffychat/pangea/models/student_analytics_summary_model.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:fluffychat/pangea/utils/firebase_analytics.dart'; +import 'package:fluffychat/pangea/utils/instructions.dart'; import 'package:fluffychat/pangea/utils/report_message.dart'; import 'package:fluffychat/pangea/widgets/chat/message_toolbar.dart'; import 'package:fluffychat/pangea/widgets/igc/pangea_text_controller.dart'; import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; import 'package:fluffychat/utils/error_reporter.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/filtered_timeline_extension.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/app_lock.dart'; @@ -347,6 +349,17 @@ class ChatController extends State loadTimelineFuture = _getTimeline(); try { await loadTimelineFuture; + // #Pangea + if (timeline != null) { + choreographer.pangeaController.instructions.show( + context, + InstructionsEnum.clickMessage, + timeline!.events.firstWhereOrNull((e) => e.isVisibleInGui)?.eventId ?? + '', + true, + ); + } + // Pangea# final fullyRead = room.fullyRead; if (fullyRead.isEmpty) return; if (timeline!.events.any((event) => event.eventId == fullyRead)) { diff --git a/lib/pangea/widgets/chat/message_toolbar.dart b/lib/pangea/widgets/chat/message_toolbar.dart index 206f6dbb3..4a331e80a 100644 --- a/lib/pangea/widgets/chat/message_toolbar.dart +++ b/lib/pangea/widgets/chat/message_toolbar.dart @@ -147,7 +147,7 @@ class MessageToolbar extends StatefulWidget { class MessageToolbarState extends State { Widget? child; MessageMode? currentMode; - bool hasSelectedText = false; + bool updatingMode = false; late StreamSubscription selectionStream; late StreamSubscription toolbarModeStream; @@ -193,10 +193,14 @@ class MessageToolbarState extends State { } void updateMode(MessageMode newMode) { + if (updatingMode) return; debugPrint("updating toolbar mode"); final bool subscribed = MatrixState.pangeaController.subscriptionController.isSubscribed; - setState(() => currentMode = newMode); + setState(() { + currentMode = newMode; + updatingMode = true; + }); if (!subscribed) { child = MessageUnsubscribedCard( languageTool: getModeTitle(newMode), @@ -218,7 +222,9 @@ class MessageToolbarState extends State { break; } } - setState(() {}); + setState(() { + updatingMode = false; + }); } void showTranslation() { @@ -266,20 +272,17 @@ class MessageToolbarState extends State { @override void initState() { super.initState(); - if (widget.textSelection.selectedText != null) { - hasSelectedText = true; - } - toolbarModeStream = widget.toolbarModeStream.stream.listen((mode) { updateMode(mode); }); - Timer? timer; + updateMode(MessageMode.play); + Timer? timer; selectionStream = widget.textSelection.selectionStream.stream.listen((value) { timer?.cancel(); - timer = Timer(const Duration(milliseconds: 750), () { + timer = Timer(const Duration(milliseconds: 500), () { if (currentMode != null || value != null && value.isNotEmpty) { updateMode(currentMode ?? MessageMode.translation); } diff --git a/lib/pangea/widgets/igc/pangea_rich_text.dart b/lib/pangea/widgets/igc/pangea_rich_text.dart index 342993daa..0cf94faee 100644 --- a/lib/pangea/widgets/igc/pangea_rich_text.dart +++ b/lib/pangea/widgets/igc/pangea_rich_text.dart @@ -7,6 +7,7 @@ import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/models/message_data_models.dart'; import 'package:fluffychat/pangea/models/pangea_message_event.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; +import 'package:fluffychat/pangea/utils/instructions.dart'; import 'package:fluffychat/pangea/widgets/chat/message_context_menu.dart'; import 'package:fluffychat/pangea/widgets/chat/message_toolbar.dart'; import 'package:fluffychat/widgets/matrix.dart'; @@ -109,6 +110,14 @@ class PangeaRichTextState extends State { @override Widget build(BuildContext context) { + if (blur > 0) { + pangeaController.instructions.show( + context, + InstructionsEnum.blurMeansTranslate, + widget.pangeaMessageEvent.eventId, + ); + } + //TODO - take out of build function of every message final Widget richText = SelectableText.rich( onSelectionChanged: (selection, cause) {