From 6cbec5abcafc307638c936266aaba9d1efcd46c4 Mon Sep 17 00:00:00 2001 From: ggurdin <46800240+ggurdin@users.noreply.github.com> Date: Wed, 22 Oct 2025 11:55:22 -0400 Subject: [PATCH] 4428 word zoom card changes positionsize when mobile keyboard opens (#4491) * fix: on flag token info, close word card * chore: update icon and tooltip for emoji mode * refactor: create base feedback dialog * fix: start drag imeadiatly on tap practice match item --- lib/l10n/intl_en.arb | 4 +- lib/pages/chat/chat.dart | 36 ++++ .../activity_feedback_request_dialog.dart | 121 ------------- .../activity_sessions_start_view.dart | 10 +- .../common/widgets/feedback_dialog.dart | 142 +++++++++++++++ .../token_info_feedback_dialog.dart | 171 +++--------------- ... => token_info_feedback_notification.dart} | 70 +------ .../practice_match_item.dart | 3 +- .../widgets/reading_assistance_content.dart | 33 ++-- .../toolbar/widgets/select_mode_buttons.dart | 4 +- .../widgets/word_zoom/word_zoom_widget.dart | 33 ++-- 11 files changed, 257 insertions(+), 370 deletions(-) delete mode 100644 lib/pangea/activity_sessions/activity_session_start/activity_feedback_request_dialog.dart create mode 100644 lib/pangea/common/widgets/feedback_dialog.dart rename lib/pangea/token_info_feedback/{token_info_feedback_button.dart => token_info_feedback_notification.dart} (56%) diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 7abea706e..75ca9cb0b 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -5313,5 +5313,7 @@ "saveActivityDesc": "Good job! Save this activity for later review and practice", "levelInfoTooltip": "Here you can see all the points you’ve earned and how!", "alreadyInCourseWithID": "You are already in a course with this plan. Do you want to create a course with the same plan, or go to the existing course?", - "goToExistingCourse": "Go to existing course" + "goToExistingCourse": "Go to existing course", + "emojiView": "Emoji view", + "feedbackDialogDesc": "I make mistakes too! Anything to help me improve?" } diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index f71339c17..5c1bd759b 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -62,6 +62,9 @@ import 'package:fluffychat/pangea/learning_settings/constants/language_constants import 'package:fluffychat/pangea/learning_settings/widgets/p_language_dialog.dart'; import 'package:fluffychat/pangea/message_token_text/tokens_util.dart'; import 'package:fluffychat/pangea/spaces/utils/load_participants_util.dart'; +import 'package:fluffychat/pangea/token_info_feedback/token_info_feedback_dialog.dart'; +import 'package:fluffychat/pangea/token_info_feedback/token_info_feedback_notification.dart'; +import 'package:fluffychat/pangea/token_info_feedback/token_info_feedback_request.dart'; import 'package:fluffychat/pangea/toolbar/enums/message_mode_enum.dart'; import 'package:fluffychat/pangea/toolbar/widgets/message_selection_overlay.dart'; import 'package:fluffychat/utils/error_reporter.dart'; @@ -2232,6 +2235,39 @@ class ChatController extends State ); } + Future showTokenFeedbackDialog( + TokenInfoFeedbackRequestData requestData, + String langCode, + PangeaMessageEvent event, + ) async { + clearSelectedEvents(); + final resp = await showDialog( + context: context, + builder: (context) => TokenInfoFeedbackDialog( + requestData: requestData, + langCode: langCode, + event: event, + ), + ); + + if (resp != null && resp is String) { + OverlayUtil.showOverlay( + overlayKey: "token_feedback_snackbar", + context: context, + child: TokenFeedbackNotification(message: resp), + transformTargetId: '', + position: OverlayPositionEnum.top, + backDropToDismiss: false, + closePrevOverlay: false, + canPop: false, + ); + + Future.delayed(const Duration(seconds: 10), () { + MatrixState.pAnyState.closeOverlay("token_feedback_snackbar"); + }); + } + } + final ScrollController carouselController = ScrollController(); ActivityRoleModel? highlightedRole; diff --git a/lib/pangea/activity_sessions/activity_session_start/activity_feedback_request_dialog.dart b/lib/pangea/activity_sessions/activity_session_start/activity_feedback_request_dialog.dart deleted file mode 100644 index adbed6422..000000000 --- a/lib/pangea/activity_sessions/activity_session_start/activity_feedback_request_dialog.dart +++ /dev/null @@ -1,121 +0,0 @@ -import 'dart:ui'; - -import 'package:flutter/material.dart'; - -import 'package:fluffychat/l10n/l10n.dart'; - -class ActivityFeedbackRequestDialog extends StatefulWidget { - const ActivityFeedbackRequestDialog({super.key}); - - @override - State createState() => - ActivityFeedbackRequestDialogState(); -} - -class ActivityFeedbackRequestDialogState - extends State { - final TextEditingController _feedbackController = TextEditingController(); - - @override - void initState() { - super.initState(); - _feedbackController.addListener(() { - setState(() {}); - }); - } - - @override - void dispose() { - _feedbackController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return BackdropFilter( - filter: ImageFilter.blur(sigmaX: 2.5, sigmaY: 2.5), - child: Dialog( - backgroundColor: Theme.of(context).colorScheme.surfaceContainerHigh, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20.0), - ), - child: SizedBox( - width: 325.0, - child: Column( - spacing: 20.0, - mainAxisSize: MainAxisSize.min, - children: [ - Padding( - padding: const EdgeInsets.all(12.0), - child: Row( - children: [ - IconButton( - icon: const Icon(Icons.close), - onPressed: () => Navigator.of(context).pop(), - ), - Expanded( - child: Text( - L10n.of(context).feedbackTitle, - style: Theme.of(context).textTheme.titleLarge, - textAlign: TextAlign.center, - ), - ), - const SizedBox( - width: 40.0, - height: 40.0, - child: Center( - child: Icon(Icons.flag_outlined), - ), - ), - ], - ), - ), - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 20.0, - ), - child: Column( - spacing: 20.0, - mainAxisSize: MainAxisSize.min, - children: [ - Text( - L10n.of(context).feedbackDesc, - textAlign: TextAlign.center, - ), - SizedBox( - child: TextField( - controller: _feedbackController, - decoration: InputDecoration( - hintText: L10n.of(context).feedbackHint, - ), - keyboardType: TextInputType.multiline, - minLines: 1, - maxLines: 5, - ), - ), - ElevatedButton( - onPressed: _feedbackController.text.isNotEmpty - ? () { - Navigator.of(context).pop( - _feedbackController.text, - ); - } - : null, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text(L10n.of(context).feedbackButton), - ], - ), - ), - const SizedBox.shrink(), - ], - ), - ), - ], - ), - ), - ), - ); - } -} diff --git a/lib/pangea/activity_sessions/activity_session_start/activity_sessions_start_view.dart b/lib/pangea/activity_sessions/activity_session_start/activity_sessions_start_view.dart index 911aa2510..bd3c55062 100644 --- a/lib/pangea/activity_sessions/activity_session_start/activity_sessions_start_view.dart +++ b/lib/pangea/activity_sessions/activity_session_start/activity_sessions_start_view.dart @@ -6,11 +6,11 @@ import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pangea/activity_feedback/activity_feedback_repo.dart'; import 'package:fluffychat/pangea/activity_feedback/activity_feedback_request.dart'; -import 'package:fluffychat/pangea/activity_sessions/activity_session_start/activity_feedback_request_dialog.dart'; import 'package:fluffychat/pangea/activity_sessions/activity_session_start/activity_feedback_response_dialog.dart'; import 'package:fluffychat/pangea/activity_sessions/activity_session_start/activity_session_start_page.dart'; import 'package:fluffychat/pangea/activity_sessions/activity_summary_widget.dart'; import 'package:fluffychat/pangea/common/widgets/error_indicator.dart'; +import 'package:fluffychat/pangea/common/widgets/feedback_dialog.dart'; import 'package:fluffychat/pangea/course_plans/course_activities/course_activity_repo.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; import 'package:fluffychat/utils/stream_extension.dart'; @@ -65,7 +65,13 @@ class ActivitySessionStartView extends StatelessWidget { final feedback = await showDialog( context: context, builder: (context) { - return const ActivityFeedbackRequestDialog(); + return FeedbackDialog( + title: L10n.of(context).feedbackTitle, + onSubmit: (feedback) { + Navigator.of(context).pop(feedback); + }, + scrollable: false, + ); }, ); diff --git a/lib/pangea/common/widgets/feedback_dialog.dart b/lib/pangea/common/widgets/feedback_dialog.dart new file mode 100644 index 000000000..3ec11dee5 --- /dev/null +++ b/lib/pangea/common/widgets/feedback_dialog.dart @@ -0,0 +1,142 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pangea/bot/widgets/bot_face_svg.dart'; + +class FeedbackDialog extends StatefulWidget { + final String title; + final Function(String) onSubmit; + + final bool scrollable; + final Widget? extraContent; + + const FeedbackDialog({ + super.key, + required this.title, + required this.onSubmit, + this.scrollable = true, + this.extraContent, + }); + + @override + State createState() => _FeedbackDialogState(); +} + +class _FeedbackDialogState extends State { + final TextEditingController _feedbackController = TextEditingController(); + + @override + void dispose() { + _feedbackController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final content = Column( + spacing: 20.0, + mainAxisSize: MainAxisSize.min, + children: [ + const Center( + child: BotFace( + width: 50.0, + expression: BotExpression.addled, + ), + ), + Text( + L10n.of(context).feedbackDialogDesc, + textAlign: TextAlign.center, + ), + if (widget.extraContent != null) widget.extraContent!, + TextFormField( + controller: _feedbackController, + decoration: InputDecoration( + hintText: L10n.of(context).feedbackHint, + ), + keyboardType: TextInputType.multiline, + onFieldSubmitted: _feedbackController.text.isNotEmpty + ? (value) => widget.onSubmit(value) + : null, + maxLines: null, + onTapOutside: (_) => FocusManager.instance.primaryFocus?.unfocus(), + ), + ], + ); + + return BackdropFilter( + filter: ImageFilter.blur(sigmaX: 2.5, sigmaY: 2.5), + child: Dialog( + backgroundColor: Theme.of(context).colorScheme.surfaceContainerHigh, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20.0), + ), + child: Container( + width: 325.0, + constraints: const BoxConstraints( + maxHeight: 600.0, + ), + padding: const EdgeInsets.all(12.0), + child: Column( + spacing: 20.0, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + IconButton( + icon: const Icon(Icons.close), + onPressed: () => Navigator.of(context).pop(), + ), + Expanded( + child: Container( + constraints: const BoxConstraints( + minHeight: 40.0, + ), + alignment: Alignment.center, + child: Text( + widget.title, + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.w600, + ), + textAlign: TextAlign.center, + ), + ), + ), + const SizedBox( + width: 40.0, + height: 40.0, + child: Center( + child: Icon(Icons.flag_outlined), + ), + ), + ], + ), + widget.scrollable + ? Expanded(child: SingleChildScrollView(child: content)) + : content, + ValueListenableBuilder( + valueListenable: _feedbackController, + builder: (context, value, _) { + final isNotEmpty = value.text.isNotEmpty; + return ElevatedButton( + onPressed: + isNotEmpty ? () => widget.onSubmit(value.text) : null, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text(L10n.of(context).feedbackButton), + ], + ), + ); + }, + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/pangea/token_info_feedback/token_info_feedback_dialog.dart b/lib/pangea/token_info_feedback/token_info_feedback_dialog.dart index bc242d64d..33a7e7775 100644 --- a/lib/pangea/token_info_feedback/token_info_feedback_dialog.dart +++ b/lib/pangea/token_info_feedback/token_info_feedback_dialog.dart @@ -1,8 +1,7 @@ -import 'dart:ui'; - import 'package:flutter/material.dart'; import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pangea/common/widgets/feedback_dialog.dart'; import 'package:fluffychat/pangea/events/event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/events/models/pangea_token_model.dart'; import 'package:fluffychat/pangea/events/models/tokens_event_content_model.dart'; @@ -21,45 +20,28 @@ import 'package:fluffychat/pangea/toolbar/widgets/word_zoom/word_zoom_widget.dar import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; -class TokenInfoFeedbackDialog extends StatefulWidget { +class TokenInfoFeedbackDialog extends StatelessWidget { final TokenInfoFeedbackRequestData requestData; final String langCode; final PangeaMessageEvent event; - final VoidCallback onUpdate; const TokenInfoFeedbackDialog({ super.key, required this.requestData, required this.langCode, required this.event, - required this.onUpdate, }); - @override - State createState() => - _TokenInfoFeedbackDialogState(); -} - -class _TokenInfoFeedbackDialogState extends State { - final TextEditingController _feedbackController = TextEditingController(); - - @override - void dispose() { - _feedbackController.dispose(); - super.dispose(); - } - - Future _submitFeedback() async { + Future _submitFeedback(String feedback) async { final request = TokenInfoFeedbackRequest( - userFeedback: _feedbackController.text, - data: widget.requestData, + userFeedback: feedback, + data: requestData, ); final TokenInfoFeedbackResponse response = await TokenInfoFeedbackRepo.submitFeedback(request); - final originalToken = - widget.requestData.tokens[widget.requestData.selectedToken]; + final originalToken = requestData.tokens[requestData.selectedToken]; final token = response.updatedToken ?? originalToken; // first, update lemma info if changed @@ -77,7 +59,7 @@ class _TokenInfoFeedbackDialogState extends State { ); } - final originalSent = widget.event.originalSent; + final originalSent = event.originalSent; // if no other changes, just return the message final hasTokenUpdate = response.updatedToken != null; @@ -86,45 +68,43 @@ class _TokenInfoFeedbackDialogState extends State { response.updatedLanguage != originalSent.langCode; if (!hasTokenUpdate && !hasLangUpdate) { - widget.onUpdate(); return response.userFriendlyMessage; } // update the tokens to be sent in the message edit - final tokens = List.from(widget.requestData.tokens); + final tokens = List.from(requestData.tokens); if (hasTokenUpdate) { - tokens[widget.requestData.selectedToken] = response.updatedToken!; + tokens[requestData.selectedToken] = response.updatedToken!; } if (hasLangUpdate) { originalSent.content.langCode = response.updatedLanguage!; } - await widget.event.room.pangeaSendTextEvent( - widget.requestData.fullText, - editEventId: widget.event.eventId, + await event.room.pangeaSendTextEvent( + requestData.fullText, + editEventId: event.eventId, originalSent: originalSent?.content, - originalWritten: widget.event.originalWritten?.content, + originalWritten: event.originalWritten?.content, tokensSent: PangeaMessageTokens( tokens: tokens, ), - tokensWritten: widget.event.originalWritten?.tokens != null + tokensWritten: event.originalWritten?.tokens != null ? PangeaMessageTokens( - tokens: widget.event.originalWritten!.tokens!, - detections: widget.event.originalWritten?.detections, + tokens: event.originalWritten!.tokens!, + detections: event.originalWritten?.detections, ) : null, choreo: originalSent?.choreo, ); - widget.onUpdate(); return response.userFriendlyMessage; } - Future _submit() async { + Future _submit(String feedback, BuildContext context) async { final resp = await showFutureLoadingDialog( context: context, - future: () => _submitFeedback(), + future: () => _submitFeedback(feedback), ); if (!resp.isError) { @@ -154,9 +134,9 @@ class _TokenInfoFeedbackDialogState extends State { ) async { final req = PhoneticTranscriptionRequest( arc: LanguageArc( - l1: PLanguageStore.byLangCode(widget.requestData.wordCardL1) ?? + l1: PLanguageStore.byLangCode(requestData.wordCardL1) ?? MatrixState.pangeaController.languageController.userL1!, - l2: PLanguageStore.byLangCode(widget.langCode) ?? + l2: PLanguageStore.byLangCode(langCode) ?? MatrixState.pangeaController.languageController.userL2!, ), content: response.content, @@ -166,109 +146,14 @@ class _TokenInfoFeedbackDialogState extends State { @override Widget build(BuildContext context) { - final selectedToken = - widget.requestData.tokens[widget.requestData.selectedToken]; - return BackdropFilter( - filter: ImageFilter.blur(sigmaX: 2.5, sigmaY: 2.5), - child: Dialog( - backgroundColor: Theme.of(context).colorScheme.surfaceContainerHigh, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20.0), - ), - child: Container( - width: 325.0, - constraints: const BoxConstraints( - maxHeight: 600.0, - ), - padding: const EdgeInsets.all(12.0), - child: Column( - spacing: 20.0, - mainAxisSize: MainAxisSize.min, - children: [ - // Header with title and close button - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - IconButton( - icon: const Icon(Icons.close), - onPressed: () => Navigator.of(context).pop(), - ), - Expanded( - child: Text( - L10n.of(context).tokenInfoFeedbackDialogTitle, - style: const TextStyle( - fontSize: 18, - fontWeight: FontWeight.w600, - ), - textAlign: TextAlign.center, - ), - ), - const SizedBox( - width: 40.0, - height: 40.0, - child: Center( - child: Icon(Icons.flag_outlined), - ), - ), - ], - ), - - // Content - Expanded( - child: SingleChildScrollView( - child: Column( - spacing: 20.0, - mainAxisSize: MainAxisSize.min, - children: [ - // Placeholder for word card - Center( - child: WordZoomWidget( - token: selectedToken.text, - construct: selectedToken.vocabConstructID, - langCode: widget.langCode, - ), - ), - // Description text - Text( - L10n.of(context).tokenInfoFeedbackDialogDesc, - textAlign: TextAlign.center, - ), - // Feedback text field - TextFormField( - controller: _feedbackController, - decoration: InputDecoration( - hintText: L10n.of(context).feedbackHint, - ), - keyboardType: TextInputType.multiline, - minLines: 1, - maxLines: 5, - onFieldSubmitted: _feedbackController.text.isNotEmpty - ? (_) => _submit() - : null, - ), - ], - ), - ), - ), - - ValueListenableBuilder( - valueListenable: _feedbackController, - builder: (context, value, _) { - final isNotEmpty = value.text.isNotEmpty; - return ElevatedButton( - onPressed: isNotEmpty ? _submit : null, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text(L10n.of(context).feedbackButton), - ], - ), - ); - }, - ), - ], - ), - ), + final selectedToken = requestData.tokens[requestData.selectedToken]; + return FeedbackDialog( + title: L10n.of(context).tokenInfoFeedbackDialogTitle, + onSubmit: (feedback) => _submit(feedback, context), + extraContent: WordZoomWidget( + token: selectedToken.text, + construct: selectedToken.vocabConstructID, + langCode: langCode, ), ); } diff --git a/lib/pangea/token_info_feedback/token_info_feedback_button.dart b/lib/pangea/token_info_feedback/token_info_feedback_notification.dart similarity index 56% rename from lib/pangea/token_info_feedback/token_info_feedback_button.dart rename to lib/pangea/token_info_feedback/token_info_feedback_notification.dart index 89c6289ae..cc52fbf12 100644 --- a/lib/pangea/token_info_feedback/token_info_feedback_button.dart +++ b/lib/pangea/token_info_feedback/token_info_feedback_notification.dart @@ -3,82 +3,22 @@ import 'package:flutter/material.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pangea/bot/widgets/bot_face_svg.dart'; -import 'package:fluffychat/pangea/common/utils/overlay.dart'; -import 'package:fluffychat/pangea/events/event_wrappers/pangea_message_event.dart'; -import 'package:fluffychat/pangea/token_info_feedback/token_info_feedback_dialog.dart'; -import 'package:fluffychat/pangea/token_info_feedback/token_info_feedback_request.dart'; import 'package:fluffychat/widgets/matrix.dart'; -class TokenInfoFeedbackButton extends StatelessWidget { - final TokenInfoFeedbackRequestData requestData; - final String langCode; - final PangeaMessageEvent event; - final VoidCallback onUpdate; - - const TokenInfoFeedbackButton({ - super.key, - required this.requestData, - required this.langCode, - required this.event, - required this.onUpdate, - }); - - Future _submitFeedback(BuildContext context) async { - final resp = await showDialog( - context: context, - builder: (context) => TokenInfoFeedbackDialog( - requestData: requestData, - langCode: langCode, - event: event, - onUpdate: onUpdate, - ), - ); - - if (resp != null && resp is String) { - _showSuccessSnackBar(resp, context); - } - } - - void _showSuccessSnackBar(String message, BuildContext context) { - OverlayUtil.showOverlay( - overlayKey: "token_feedback_snackbar", - context: context, - child: _TokenFeedbackNotification(message: message), - transformTargetId: '', - position: OverlayPositionEnum.top, - backDropToDismiss: false, - closePrevOverlay: false, - canPop: false, - ); - - Future.delayed(const Duration(seconds: 10), () { - MatrixState.pAnyState.closeOverlay("token_feedback_snackbar"); - }); - } - - @override - Widget build(BuildContext context) { - return IconButton( - icon: const Icon(Icons.flag_outlined), - onPressed: () => _submitFeedback(context), - tooltip: L10n.of(context).reportWordIssueTooltip, - ); - } -} - -class _TokenFeedbackNotification extends StatefulWidget { +class TokenFeedbackNotification extends StatefulWidget { final String message; - const _TokenFeedbackNotification({ + const TokenFeedbackNotification({ + super.key, required this.message, }); @override - State<_TokenFeedbackNotification> createState() => + State createState() => _TokenFeedbackNotificationState(); } -class _TokenFeedbackNotificationState extends State<_TokenFeedbackNotification> +class _TokenFeedbackNotificationState extends State with SingleTickerProviderStateMixin { late AnimationController _slideController; late Animation _slideAnimation; diff --git a/lib/pangea/toolbar/reading_assistance_input_row/practice_match_item.dart b/lib/pangea/toolbar/reading_assistance_input_row/practice_match_item.dart index dd06e779a..35c0877a7 100644 --- a/lib/pangea/toolbar/reading_assistance_input_row/practice_match_item.dart +++ b/lib/pangea/toolbar/reading_assistance_input_row/practice_match_item.dart @@ -142,13 +142,12 @@ class PracticeMatchItemState extends State { ], ); - return LongPressDraggable( + return Draggable( data: widget.constructForm, feedback: Material( type: MaterialType.transparency, child: content, ), - delay: const Duration(milliseconds: 50), onDragStarted: onTap, child: InkWell( onHover: (isHovered) => setState(() => _isHovered = isHovered), diff --git a/lib/pangea/toolbar/widgets/reading_assistance_content.dart b/lib/pangea/toolbar/widgets/reading_assistance_content.dart index 1ae64b5a3..eaaf03435 100644 --- a/lib/pangea/toolbar/widgets/reading_assistance_content.dart +++ b/lib/pangea/toolbar/widgets/reading_assistance_content.dart @@ -50,20 +50,25 @@ class ReadingAssistanceContent extends StatelessWidget { onClose: () => overlayController.updateSelectedSpan(null), langCode: overlayController.pangeaMessageEvent.messageDisplayLangCode, onDismissNewWordOverlay: () => overlayController.setState(() {}), - requestData: selectedTokenIndex >= 0 - ? TokenInfoFeedbackRequestData( - userId: Matrix.of(context).client.userID!, - roomId: overlayController.event.room.id, - fullText: overlayController.pangeaMessageEvent.messageDisplayText, - detectedLanguage: - overlayController.pangeaMessageEvent.messageDisplayLangCode, - tokens: tokens ?? [], - selectedToken: selectedTokenIndex, - wordCardL1: MatrixState.pangeaController.languageController - .activeL1Code()!, - ) - : null, - pangeaMessageEvent: overlayController.pangeaMessageEvent, + onFlagTokenInfo: () { + if (selectedTokenIndex < 0) return; + final requestData = TokenInfoFeedbackRequestData( + userId: Matrix.of(context).client.userID!, + roomId: overlayController.event.room.id, + fullText: overlayController.pangeaMessageEvent.messageDisplayText, + detectedLanguage: + overlayController.pangeaMessageEvent.messageDisplayLangCode, + tokens: tokens ?? [], + selectedToken: selectedTokenIndex, + wordCardL1: + MatrixState.pangeaController.languageController.activeL1Code()!, + ); + overlayController.widget.chatController.showTokenFeedbackDialog( + requestData, + overlayController.pangeaMessageEvent.messageDisplayLangCode, + overlayController.pangeaMessageEvent, + ); + }, ); } } diff --git a/lib/pangea/toolbar/widgets/select_mode_buttons.dart b/lib/pangea/toolbar/widgets/select_mode_buttons.dart index 616652710..97153bcaf 100644 --- a/lib/pangea/toolbar/widgets/select_mode_buttons.dart +++ b/lib/pangea/toolbar/widgets/select_mode_buttons.dart @@ -28,7 +28,7 @@ enum SelectMode { audio(Icons.volume_up), translate(Icons.translate), practice(Symbols.fitness_center), - emoji(Symbols.imagesmode), + emoji(Icons.visibility_outlined), speechTranslation(Icons.translate); final IconData icon; @@ -45,7 +45,7 @@ enum SelectMode { case SelectMode.practice: return l10n.practice; case SelectMode.emoji: - return l10n.image; + return l10n.emojiView; } } } diff --git a/lib/pangea/toolbar/widgets/word_zoom/word_zoom_widget.dart b/lib/pangea/toolbar/widgets/word_zoom/word_zoom_widget.dart index 9c38d405f..2688389af 100644 --- a/lib/pangea/toolbar/widgets/word_zoom/word_zoom_widget.dart +++ b/lib/pangea/toolbar/widgets/word_zoom/word_zoom_widget.dart @@ -6,14 +6,11 @@ import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pangea/common/widgets/error_indicator.dart'; import 'package:fluffychat/pangea/constructs/construct_identifier.dart'; -import 'package:fluffychat/pangea/events/event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/events/models/pangea_token_text_model.dart'; import 'package:fluffychat/pangea/learning_settings/models/language_model.dart'; import 'package:fluffychat/pangea/learning_settings/utils/p_language_store.dart'; import 'package:fluffychat/pangea/lemmas/lemma_reaction_picker.dart'; import 'package:fluffychat/pangea/phonetic_transcription/phonetic_transcription_widget.dart'; -import 'package:fluffychat/pangea/token_info_feedback/token_info_feedback_button.dart'; -import 'package:fluffychat/pangea/token_info_feedback/token_info_feedback_request.dart'; import 'package:fluffychat/pangea/toolbar/widgets/message_unsubscribed_card.dart'; import 'package:fluffychat/pangea/toolbar/widgets/practice_activity/word_audio_button.dart'; import 'package:fluffychat/pangea/toolbar/widgets/word_zoom/lemma_meaning_builder.dart'; @@ -28,11 +25,13 @@ class WordZoomWidget extends StatelessWidget { final VoidCallback? onClose; final bool wordIsNew; - final VoidCallback? onDismissNewWordOverlay; final Event? event; - final TokenInfoFeedbackRequestData? requestData; - final PangeaMessageEvent? pangeaMessageEvent; + final VoidCallback? onDismissNewWordOverlay; + final VoidCallback? onFlagTokenInfo; + + // final TokenInfoFeedbackRequestData? requestData; + // final PangeaMessageEvent? pangeaMessageEvent; const WordZoomWidget({ super.key, @@ -41,10 +40,9 @@ class WordZoomWidget extends StatelessWidget { required this.langCode, this.onClose, this.wordIsNew = false, - this.onDismissNewWordOverlay, this.event, - this.requestData, - this.pangeaMessageEvent, + this.onDismissNewWordOverlay, + this.onFlagTokenInfo, }); String get transformTargetId => "word-zoom-card-${token.uniqueKey}"; @@ -107,17 +105,12 @@ class WordZoomWidget extends StatelessWidget { ), ), ), - requestData != null && pangeaMessageEvent != null - ? TokenInfoFeedbackButton( - requestData: requestData!, - langCode: langCode, - event: pangeaMessageEvent!, - onUpdate: () { - // close the zoom when updating - if (onClose != null) { - onClose!(); - } - }, + onFlagTokenInfo != null + ? IconButton( + icon: const Icon(Icons.flag_outlined), + onPressed: onFlagTokenInfo, + tooltip: + L10n.of(context).reportWordIssueTooltip, ) : const SizedBox( width: 40.0,