You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
5.2 KiB
Dart
151 lines
5.2 KiB
Dart
import 'dart:developer';
|
|
|
|
import 'package:fluffychat/config/app_config.dart';
|
|
import 'package:fluffychat/config/themes.dart';
|
|
import 'package:fluffychat/pangea/enum/message_mode_enum.dart';
|
|
import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart';
|
|
import 'package:fluffychat/pangea/utils/error_handler.dart';
|
|
import 'package:fluffychat/pangea/widgets/chat/message_audio_card.dart';
|
|
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/tts_controller.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/widgets/matrix.dart';
|
|
import 'package:flutter/foundation.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
|
|
|
const double minCardHeight = 70;
|
|
|
|
class MessageToolbar extends StatelessWidget {
|
|
final PangeaMessageEvent pangeaMessageEvent;
|
|
final MessageOverlayController overLayController;
|
|
final TtsController tts;
|
|
|
|
const MessageToolbar({
|
|
super.key,
|
|
required this.pangeaMessageEvent,
|
|
required this.overLayController,
|
|
required this.tts,
|
|
});
|
|
|
|
Widget toolbarContent(BuildContext context) {
|
|
final bool subscribed =
|
|
MatrixState.pangeaController.subscriptionController.isSubscribed;
|
|
|
|
if (!subscribed) {
|
|
return MessageUnsubscribedCard(
|
|
controller: overLayController,
|
|
);
|
|
}
|
|
|
|
// Check if the message is in the user's second language
|
|
final bool messageInUserL2 = pangeaMessageEvent.messageDisplayLangCode ==
|
|
MatrixState.pangeaController.languageController.userL2?.langCode;
|
|
|
|
// If not in the target language show specific messsage
|
|
if (!messageInUserL2) {
|
|
return MessageDisplayCard(
|
|
displayText:
|
|
L10n.of(context)!.messageNotInTargetLang, // Pass the display text,
|
|
);
|
|
}
|
|
|
|
switch (overLayController.toolbarMode) {
|
|
case MessageMode.translation:
|
|
return MessageTranslationCard(
|
|
messageEvent: pangeaMessageEvent,
|
|
selection: overLayController.selectedSpan,
|
|
);
|
|
case MessageMode.textToSpeech:
|
|
return MessageAudioCard(
|
|
messageEvent: pangeaMessageEvent,
|
|
overlayController: overLayController,
|
|
selection: overLayController.selectedSpan,
|
|
tts: tts,
|
|
setIsPlayingAudio: overLayController.setIsPlayingAudio,
|
|
);
|
|
case MessageMode.speechToText:
|
|
return MessageSpeechToTextCard(
|
|
messageEvent: pangeaMessageEvent,
|
|
);
|
|
case MessageMode.definition:
|
|
if (!overLayController.isSelection) {
|
|
return MessageDisplayCard(
|
|
displayText: L10n.of(context)!.selectToDefine,
|
|
);
|
|
} else {
|
|
try {
|
|
final selectedText = overLayController.targetText;
|
|
|
|
return WordDataCard(
|
|
word: selectedText,
|
|
wordLang: pangeaMessageEvent.messageDisplayLangCode,
|
|
fullText: pangeaMessageEvent.messageDisplayText,
|
|
fullTextLang: pangeaMessageEvent.messageDisplayLangCode,
|
|
hasInfo: true,
|
|
room: overLayController.widget.chatController.room,
|
|
);
|
|
} catch (e, s) {
|
|
debugger(when: kDebugMode);
|
|
ErrorHandler.logError(
|
|
e: "Error in WordDataCard",
|
|
s: s,
|
|
data: {
|
|
"word": overLayController.targetText,
|
|
"fullText": pangeaMessageEvent.messageDisplayText,
|
|
},
|
|
);
|
|
return const SizedBox();
|
|
}
|
|
}
|
|
case MessageMode.practiceActivity:
|
|
return PracticeActivityCard(
|
|
pangeaMessageEvent: pangeaMessageEvent,
|
|
overlayController: overLayController,
|
|
tts: tts,
|
|
);
|
|
default:
|
|
debugger(when: kDebugMode);
|
|
ErrorHandler.logError(
|
|
e: "Invalid toolbar mode",
|
|
s: StackTrace.current,
|
|
data: {"newMode": overLayController.toolbarMode},
|
|
);
|
|
return const SizedBox();
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Container(
|
|
decoration: BoxDecoration(
|
|
color: Theme.of(context).cardColor,
|
|
border: Border.all(
|
|
width: 2,
|
|
color: Theme.of(context).colorScheme.primary.withOpacity(0.5),
|
|
),
|
|
borderRadius: const BorderRadius.all(
|
|
Radius.circular(AppConfig.borderRadius),
|
|
),
|
|
),
|
|
constraints: const BoxConstraints(
|
|
maxHeight: AppConfig.toolbarMaxHeight,
|
|
minWidth: AppConfig.toolbarMinWidth,
|
|
minHeight: AppConfig.toolbarMinHeight,
|
|
// maxWidth is set by MessageSelectionOverlay
|
|
),
|
|
child: SingleChildScrollView(
|
|
child: AnimatedSize(
|
|
duration: FluffyThemes.animationDuration,
|
|
child: toolbarContent(context),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|