Merge pull request #921 from pangeachat/no-original-sent
in message toolbar, use the display representation instead of origina…
This commit is contained in:
commit
9f7acff1d2
8 changed files with 77 additions and 64 deletions
|
|
@ -563,13 +563,13 @@ class PangeaMessageEvent {
|
|||
return langCode ?? LanguageKeys.unknownLanguage;
|
||||
}
|
||||
|
||||
RepresentationEvent? get messageDisplayRepresentation =>
|
||||
representationByLanguage(messageDisplayLangCode);
|
||||
|
||||
/// Gets the message display text for the current language code.
|
||||
/// If the message display text is not available for the current language code,
|
||||
/// it returns the message body.
|
||||
String get messageDisplayText {
|
||||
final String? text = representationByLanguage(messageDisplayLangCode)?.text;
|
||||
return text ?? body;
|
||||
}
|
||||
String get messageDisplayText => messageDisplayRepresentation?.text ?? body;
|
||||
|
||||
List<PangeaMatch>? errorSteps(String lemma) {
|
||||
final RepresentationEvent? repEvent = originalSent ?? originalWritten;
|
||||
|
|
|
|||
|
|
@ -14,7 +14,6 @@ import 'package:fluffychat/pangea/widgets/chat/tts_controller.dart';
|
|||
import 'package:fluffychat/pangea/widgets/igc/card_error_widget.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
|
||||
class MessageAudioCard extends StatefulWidget {
|
||||
|
|
@ -147,15 +146,10 @@ class MessageAudioCardState extends State<MessageAudioCard> {
|
|||
|
||||
try {
|
||||
final String langCode = widget.messageEvent.messageDisplayLangCode;
|
||||
final String? text =
|
||||
widget.messageEvent.representationByLanguage(langCode)?.text;
|
||||
|
||||
if (text == null) {
|
||||
//TODO - handle error but get out of flow
|
||||
}
|
||||
|
||||
final Event? localEvent =
|
||||
widget.messageEvent.getTextToSpeechLocal(langCode, text!);
|
||||
final Event? localEvent = widget.messageEvent.getTextToSpeechLocal(
|
||||
langCode,
|
||||
widget.messageEvent.messageDisplayText,
|
||||
);
|
||||
|
||||
if (localEvent != null) {
|
||||
audioFile = await localEvent.getPangeaAudioFile();
|
||||
|
|
@ -172,11 +166,6 @@ class MessageAudioCardState extends State<MessageAudioCard> {
|
|||
debugPrint(StackTrace.current.toString());
|
||||
if (!mounted) return;
|
||||
setState(() => _isLoading = false);
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text(L10n.of(context)!.errorGettingAudio),
|
||||
),
|
||||
);
|
||||
ErrorHandler.logError(
|
||||
e: e,
|
||||
s: s,
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ import 'package:fluffychat/pangea/widgets/chat/overlay_footer.dart';
|
|||
import 'package:fluffychat/pangea/widgets/chat/overlay_header.dart';
|
||||
import 'package:fluffychat/pangea/widgets/chat/overlay_message.dart';
|
||||
import 'package:fluffychat/pangea/widgets/chat/tts_controller.dart';
|
||||
import 'package:fluffychat/pangea/widgets/practice_activity/target_tokens_controller.dart';
|
||||
import 'package:fluffychat/widgets/avatar.dart';
|
||||
import 'package:fluffychat/widgets/matrix.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
|
@ -74,6 +75,8 @@ class MessageOverlayController extends State<MessageSelectionOverlay>
|
|||
bool isPlayingAudio = false;
|
||||
|
||||
bool get showToolbarButtons => !widget._pangeaMessageEvent.isAudioMessage;
|
||||
final TargetTokensController targetTokensController =
|
||||
TargetTokensController();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
|
|
@ -107,8 +110,8 @@ class MessageOverlayController extends State<MessageSelectionOverlay>
|
|||
},
|
||||
).listen((_) => setState(() {}));
|
||||
|
||||
setInitialToolbarMode();
|
||||
tts.setupTTS();
|
||||
setInitialToolbarMode();
|
||||
}
|
||||
|
||||
/// We need to check if the setState call is safe to call immediately
|
||||
|
|
@ -489,7 +492,8 @@ class MessageOverlayController extends State<MessageSelectionOverlay>
|
|||
MessageToolbar(
|
||||
pangeaMessageEvent: widget._pangeaMessageEvent,
|
||||
overLayController: this,
|
||||
tts: tts,
|
||||
ttsController: tts,
|
||||
targetTokensController: targetTokensController,
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
SizedBox(
|
||||
|
|
|
|||
|
|
@ -10,10 +10,13 @@ import 'package:fluffychat/pangea/widgets/chat/message_selection_overlay.dart';
|
|||
import 'package:fluffychat/pangea/widgets/chat/message_speech_to_text_card.dart';
|
||||
import 'package:fluffychat/pangea/widgets/chat/message_translation_card.dart';
|
||||
import 'package:fluffychat/pangea/widgets/chat/message_unsubscribed_card.dart';
|
||||
import 'package:fluffychat/pangea/widgets/chat/toolbar_content_loading_indicator.dart';
|
||||
import 'package:fluffychat/pangea/widgets/chat/tts_controller.dart';
|
||||
import 'package:fluffychat/pangea/widgets/igc/card_error_widget.dart';
|
||||
import 'package:fluffychat/pangea/widgets/igc/word_data_card.dart';
|
||||
import 'package:fluffychat/pangea/widgets/message_display_card.dart';
|
||||
import 'package:fluffychat/pangea/widgets/practice_activity/practice_activity_card.dart';
|
||||
import 'package:fluffychat/pangea/widgets/practice_activity/target_tokens_controller.dart';
|
||||
import 'package:fluffychat/widgets/matrix.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
|
@ -24,13 +27,15 @@ const double minCardHeight = 70;
|
|||
class MessageToolbar extends StatelessWidget {
|
||||
final PangeaMessageEvent pangeaMessageEvent;
|
||||
final MessageOverlayController overLayController;
|
||||
final TtsController tts;
|
||||
final TtsController ttsController;
|
||||
final TargetTokensController targetTokensController;
|
||||
|
||||
const MessageToolbar({
|
||||
super.key,
|
||||
required this.pangeaMessageEvent,
|
||||
required this.overLayController,
|
||||
required this.tts,
|
||||
required this.ttsController,
|
||||
required this.targetTokensController,
|
||||
});
|
||||
|
||||
Widget toolbarContent(BuildContext context) {
|
||||
|
|
@ -58,7 +63,7 @@ class MessageToolbar extends StatelessWidget {
|
|||
messageEvent: pangeaMessageEvent,
|
||||
overlayController: overLayController,
|
||||
selection: overLayController.selectedSpan,
|
||||
tts: tts,
|
||||
tts: ttsController,
|
||||
setIsPlayingAudio: overLayController.setIsPlayingAudio,
|
||||
);
|
||||
case MessageMode.speechToText:
|
||||
|
|
@ -67,8 +72,27 @@ class MessageToolbar extends StatelessWidget {
|
|||
);
|
||||
case MessageMode.definition:
|
||||
if (!overLayController.isSelection) {
|
||||
return MessageDisplayCard(
|
||||
displayText: L10n.of(context)!.selectToDefine,
|
||||
return FutureBuilder(
|
||||
future: targetTokensController.targetTokens(pangeaMessageEvent),
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.connectionState != ConnectionState.done) {
|
||||
return const ToolbarContentLoadingIndicator();
|
||||
} else if (snapshot.hasError ||
|
||||
snapshot.data == null ||
|
||||
snapshot.data!.isEmpty) {
|
||||
return const Padding(
|
||||
padding: EdgeInsets.all(8),
|
||||
child: CardErrorWidget(
|
||||
error: "No tokens available",
|
||||
maxWidth: AppConfig.toolbarMinWidth,
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return MessageDisplayCard(
|
||||
displayText: L10n.of(context)!.selectToDefine,
|
||||
);
|
||||
}
|
||||
},
|
||||
);
|
||||
} else {
|
||||
try {
|
||||
|
|
@ -106,7 +130,8 @@ class MessageToolbar extends StatelessWidget {
|
|||
return PracticeActivityCard(
|
||||
pangeaMessageEvent: pangeaMessageEvent,
|
||||
overlayController: overLayController,
|
||||
tts: tts,
|
||||
ttsController: ttsController,
|
||||
targetTokensController: targetTokensController,
|
||||
);
|
||||
default:
|
||||
debugger(when: kDebugMode);
|
||||
|
|
|
|||
|
|
@ -29,17 +29,19 @@ class OverlayMessageTextState extends State<OverlayMessageText> {
|
|||
|
||||
@override
|
||||
void initState() {
|
||||
tokens = widget.pangeaMessageEvent.originalSent?.tokens;
|
||||
if (widget.pangeaMessageEvent.originalSent != null && tokens == null) {
|
||||
widget.pangeaMessageEvent.originalSent!
|
||||
.tokensGlobal(
|
||||
widget.pangeaMessageEvent.senderId,
|
||||
widget.pangeaMessageEvent.originServerTs,
|
||||
)
|
||||
.then((tokens) {
|
||||
// this isn't currently working because originalSent's _event is null
|
||||
setState(() => this.tokens = tokens);
|
||||
});
|
||||
final repEvent = widget.pangeaMessageEvent.messageDisplayRepresentation;
|
||||
if (repEvent != null) {
|
||||
tokens = repEvent.tokens;
|
||||
if (tokens == null) {
|
||||
repEvent
|
||||
.tokensGlobal(
|
||||
widget.pangeaMessageEvent.senderId,
|
||||
widget.pangeaMessageEvent.originServerTs,
|
||||
)
|
||||
.then((tokens) {
|
||||
setState(() => this.tokens = tokens);
|
||||
});
|
||||
}
|
||||
}
|
||||
super.initState();
|
||||
}
|
||||
|
|
@ -70,7 +72,7 @@ class OverlayMessageTextState extends State<OverlayMessageText> {
|
|||
|
||||
// Convert the entire message into a list of characters
|
||||
final Characters messageCharacters =
|
||||
widget.pangeaMessageEvent.event.body.characters;
|
||||
widget.pangeaMessageEvent.messageDisplayText.characters;
|
||||
|
||||
// When building token positions, use grapheme cluster indices
|
||||
final List<TokenPosition> tokenPositions = [];
|
||||
|
|
|
|||
|
|
@ -91,12 +91,7 @@ class PangeaRichTextState extends State<PangeaRichText> {
|
|||
debugger(when: kDebugMode);
|
||||
}
|
||||
|
||||
repEvent = widget.pangeaMessageEvent
|
||||
.representationByLanguage(
|
||||
widget.pangeaMessageEvent.messageDisplayLangCode,
|
||||
)
|
||||
?.content;
|
||||
|
||||
repEvent = widget.pangeaMessageEvent.messageDisplayRepresentation?.content;
|
||||
if (repEvent == null) {
|
||||
setState(() => _fetchingRepresentation = true);
|
||||
widget.pangeaMessageEvent
|
||||
|
|
|
|||
|
|
@ -31,13 +31,15 @@ import 'package:flutter_gen/gen_l10n/l10n.dart';
|
|||
class PracticeActivityCard extends StatefulWidget {
|
||||
final PangeaMessageEvent pangeaMessageEvent;
|
||||
final MessageOverlayController overlayController;
|
||||
final TtsController tts;
|
||||
final TtsController ttsController;
|
||||
final TargetTokensController targetTokensController;
|
||||
|
||||
const PracticeActivityCard({
|
||||
super.key,
|
||||
required this.pangeaMessageEvent,
|
||||
required this.overlayController,
|
||||
required this.tts,
|
||||
required this.ttsController,
|
||||
required this.targetTokensController,
|
||||
});
|
||||
|
||||
@override
|
||||
|
|
@ -51,10 +53,6 @@ class PracticeActivityCardState extends State<PracticeActivityCard> {
|
|||
PracticeActivityRecordModel? currentCompletionRecord;
|
||||
bool fetchingActivity = false;
|
||||
|
||||
// tracks the target tokens for the current message
|
||||
// in a separate controller to manage the state
|
||||
TargetTokensController targetTokensController = TargetTokensController();
|
||||
|
||||
List<PracticeActivityEvent> get practiceActivities =>
|
||||
widget.pangeaMessageEvent.practiceActivities;
|
||||
|
||||
|
|
@ -124,7 +122,7 @@ class PracticeActivityCardState extends State<PracticeActivityCard> {
|
|||
return null;
|
||||
}
|
||||
|
||||
if (widget.pangeaMessageEvent.originalSent == null) {
|
||||
if (widget.pangeaMessageEvent.messageDisplayRepresentation == null) {
|
||||
debugger(when: kDebugMode);
|
||||
_updateFetchingActivity(false);
|
||||
ErrorHandler.logError(
|
||||
|
|
@ -142,8 +140,8 @@ class PracticeActivityCardState extends State<PracticeActivityCard> {
|
|||
MessageActivityRequest(
|
||||
userL1: pangeaController.languageController.userL1!.langCode,
|
||||
userL2: pangeaController.languageController.userL2!.langCode,
|
||||
messageText: widget.pangeaMessageEvent.originalSent!.text,
|
||||
tokensWithXP: await targetTokensController.targetTokens(
|
||||
messageText: widget.pangeaMessageEvent.messageDisplayText,
|
||||
tokensWithXP: await widget.targetTokensController.targetTokens(
|
||||
widget.pangeaMessageEvent,
|
||||
),
|
||||
messageId: widget.pangeaMessageEvent.eventId,
|
||||
|
|
@ -151,7 +149,8 @@ class PracticeActivityCardState extends State<PracticeActivityCard> {
|
|||
.map((activity) => activity.activityRequestMetaData)
|
||||
.toList(),
|
||||
activityQualityFeedback: activityFeedback,
|
||||
clientCompatibleActivities: widget.tts.isLanguageFullySupported
|
||||
clientCompatibleActivities: widget
|
||||
.ttsController.isLanguageFullySupported
|
||||
? ActivityTypeEnum.values
|
||||
: ActivityTypeEnum.values
|
||||
.where((type) => type != ActivityTypeEnum.wordFocusListening)
|
||||
|
|
@ -221,7 +220,7 @@ class PracticeActivityCardState extends State<PracticeActivityCard> {
|
|||
|
||||
// update the target tokens with the new construct uses
|
||||
// NOTE - multiple choice activity is handling adding these to analytics
|
||||
await targetTokensController.updateTokensWithConstructs(
|
||||
await widget.targetTokensController.updateTokensWithConstructs(
|
||||
currentCompletionRecord!.usesForAllResponses(
|
||||
currentActivity!,
|
||||
metadata,
|
||||
|
|
@ -320,7 +319,7 @@ class PracticeActivityCardState extends State<PracticeActivityCard> {
|
|||
return MultipleChoiceActivity(
|
||||
practiceCardController: this,
|
||||
currentActivity: currentActivity!,
|
||||
tts: widget.tts,
|
||||
tts: widget.ttsController,
|
||||
eventID: widget.pangeaMessageEvent.eventId,
|
||||
);
|
||||
case ActivityTypeEnum.wordFocusListening:
|
||||
|
|
@ -329,7 +328,7 @@ class PracticeActivityCardState extends State<PracticeActivityCard> {
|
|||
return MultipleChoiceActivity(
|
||||
practiceCardController: this,
|
||||
currentActivity: currentActivity!,
|
||||
tts: widget.tts,
|
||||
tts: widget.ttsController,
|
||||
eventID: widget.pangeaMessageEvent.eventId,
|
||||
);
|
||||
// default:
|
||||
|
|
|
|||
|
|
@ -38,12 +38,11 @@ class TargetTokensController {
|
|||
Future<List<TokenWithXP>> _initialize(
|
||||
PangeaMessageEvent pangeaMessageEvent,
|
||||
) async {
|
||||
final tokens = await pangeaMessageEvent
|
||||
.representationByLanguage(pangeaMessageEvent.messageDisplayLangCode)
|
||||
?.tokensGlobal(
|
||||
pangeaMessageEvent.senderId,
|
||||
pangeaMessageEvent.originServerTs,
|
||||
);
|
||||
final tokens =
|
||||
await pangeaMessageEvent.messageDisplayRepresentation?.tokensGlobal(
|
||||
pangeaMessageEvent.senderId,
|
||||
pangeaMessageEvent.originServerTs,
|
||||
);
|
||||
|
||||
if (tokens == null || tokens.isEmpty) {
|
||||
debugger(when: kDebugMode);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue