|
|
|
|
@ -1,4 +1,3 @@
|
|
|
|
|
import 'dart:async';
|
|
|
|
|
import 'dart:developer';
|
|
|
|
|
import 'dart:ui';
|
|
|
|
|
|
|
|
|
|
@ -13,13 +12,13 @@ import 'package:fluffychat/pangea/utils/show_defintion_util.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';
|
|
|
|
|
import 'package:sentry_flutter/sentry_flutter.dart';
|
|
|
|
|
|
|
|
|
|
import '../../models/igc_text_data_model.dart';
|
|
|
|
|
import '../../models/language_detection_model.dart';
|
|
|
|
|
import '../../models/pangea_match_model.dart';
|
|
|
|
|
import '../../models/pangea_representation_event.dart';
|
|
|
|
|
import '../../utils/bot_style.dart';
|
|
|
|
|
import '../../utils/instructions.dart';
|
|
|
|
|
|
|
|
|
|
class PangeaRichText extends StatefulWidget {
|
|
|
|
|
@ -30,6 +29,7 @@ class PangeaRichText extends StatefulWidget {
|
|
|
|
|
final bool immersionMode;
|
|
|
|
|
final bool definitions;
|
|
|
|
|
final Choreographer? choreographer;
|
|
|
|
|
final ShowDefintionUtil? messageToolbar;
|
|
|
|
|
|
|
|
|
|
const PangeaRichText({
|
|
|
|
|
super.key,
|
|
|
|
|
@ -40,6 +40,7 @@ class PangeaRichText extends StatefulWidget {
|
|
|
|
|
required this.definitions,
|
|
|
|
|
this.choreographer,
|
|
|
|
|
this.existingStyle,
|
|
|
|
|
this.messageToolbar,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
@ -52,32 +53,30 @@ class PangeaRichTextState extends State<PangeaRichText> {
|
|
|
|
|
bool _fetchingTokens = false;
|
|
|
|
|
double get blur => _fetchingRepresentation && widget.immersionMode ? 5 : 0;
|
|
|
|
|
List<TextSpan> textSpan = [];
|
|
|
|
|
ShowDefintionUtil? messageToolbar;
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
void initState() {
|
|
|
|
|
super.initState();
|
|
|
|
|
setState(() => textSpan = getTextSpan(context));
|
|
|
|
|
updateTextSpan();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
void didUpdateWidget(PangeaRichText oldWidget) {
|
|
|
|
|
super.didUpdateWidget(oldWidget);
|
|
|
|
|
setState(() => textSpan = getTextSpan(context));
|
|
|
|
|
updateTextSpan();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void updateTextSpan() {
|
|
|
|
|
setState(() {
|
|
|
|
|
textSpan = getTextSpan(context);
|
|
|
|
|
widget.messageToolbar?.messageText = textSpan.map((e) => e.text).join();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
//TODO - take out of build function of every message
|
|
|
|
|
// if (areLanguagesSet) {
|
|
|
|
|
messageToolbar = ShowDefintionUtil(
|
|
|
|
|
targetId: widget.pangeaMessageEvent.eventId,
|
|
|
|
|
room: widget.pangeaMessageEvent.room,
|
|
|
|
|
langCode: widget.selectedDisplayLang?.langCode ??
|
|
|
|
|
userL2LangCode ??
|
|
|
|
|
LanguageKeys.unknownLanguage,
|
|
|
|
|
messageText: textSpan.map((x) => x.text).join(),
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if (!widget.selected &&
|
|
|
|
|
widget.selectedDisplayLang != null &&
|
|
|
|
|
@ -95,10 +94,16 @@ class PangeaRichTextState extends State<PangeaRichText> {
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
final TextSpan richTextSpan = TextSpan(
|
|
|
|
|
final Widget richText = SelectableText.rich(
|
|
|
|
|
onSelectionChanged: (selection, cause) =>
|
|
|
|
|
widget.messageToolbar?.onTextSelection(selection, cause, context),
|
|
|
|
|
focusNode: widget.messageToolbar?.focusNode,
|
|
|
|
|
contextMenuBuilder: widget.messageToolbar?.contextMenuOverride,
|
|
|
|
|
TextSpan(
|
|
|
|
|
children: [
|
|
|
|
|
...textSpan,
|
|
|
|
|
if (widget.selected && (_fetchingRepresentation || _fetchingTokens))
|
|
|
|
|
// if (widget.selected)
|
|
|
|
|
const WidgetSpan(
|
|
|
|
|
child: Padding(
|
|
|
|
|
padding: EdgeInsets.only(left: 5.0),
|
|
|
|
|
@ -113,32 +118,8 @@ class PangeaRichTextState extends State<PangeaRichText> {
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
final Widget richText = widget.selected
|
|
|
|
|
? SelectableText.rich(
|
|
|
|
|
richTextSpan,
|
|
|
|
|
onSelectionChanged: (selection, cause) => kIsWeb
|
|
|
|
|
? messageToolbar?.onTextSelection(selection, cause, context)
|
|
|
|
|
: null,
|
|
|
|
|
focusNode: messageToolbar?.focusNode,
|
|
|
|
|
contextMenuBuilder: (context, selection) {
|
|
|
|
|
return AdaptiveTextSelectionToolbar.buttonItems(
|
|
|
|
|
anchors: selection.contextMenuAnchors,
|
|
|
|
|
buttonItems: [
|
|
|
|
|
...selection.contextMenuButtonItems,
|
|
|
|
|
ContextMenuButtonItem(
|
|
|
|
|
label: L10n.of(context)!.showDefinition,
|
|
|
|
|
onPressed: () {
|
|
|
|
|
messageToolbar?.showDefinition(context);
|
|
|
|
|
messageToolbar?.focusNode.unfocus();
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
: RichText(text: richTextSpan);
|
|
|
|
|
|
|
|
|
|
return blur > 0
|
|
|
|
|
? ImageFiltered(
|
|
|
|
|
@ -222,8 +203,8 @@ class PangeaRichTextState extends State<PangeaRichText> {
|
|
|
|
|
userL1: userL1LangCode ?? LanguageKeys.unknownLanguage,
|
|
|
|
|
).constructTokenSpan(
|
|
|
|
|
context: context,
|
|
|
|
|
defaultStyle: widget.existingStyle,
|
|
|
|
|
handleClick: true,
|
|
|
|
|
defaultStyle: textStyle(repEvent, context),
|
|
|
|
|
handleClick: false,
|
|
|
|
|
spanCardModel: null,
|
|
|
|
|
transformTargetId: widget.pangeaMessageEvent.eventId,
|
|
|
|
|
room: widget.pangeaMessageEvent.room,
|
|
|
|
|
@ -244,10 +225,20 @@ class PangeaRichTextState extends State<PangeaRichText> {
|
|
|
|
|
[
|
|
|
|
|
TextSpan(
|
|
|
|
|
text: repEvent.text,
|
|
|
|
|
style: widget.existingStyle,
|
|
|
|
|
style: textStyle(repEvent, context),
|
|
|
|
|
),
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
TextStyle? textStyle(RepresentationEvent repEvent, BuildContext context) =>
|
|
|
|
|
// !repEvent.botAuthored
|
|
|
|
|
true
|
|
|
|
|
? widget.existingStyle
|
|
|
|
|
: BotStyle.text(
|
|
|
|
|
context,
|
|
|
|
|
existingStyle: widget.existingStyle,
|
|
|
|
|
setColor: false,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
bool get areLanguagesSet =>
|
|
|
|
|
userL2LangCode != null && userL2LangCode != LanguageKeys.unknownLanguage;
|
|
|
|
|
|
|
|
|
|
@ -279,75 +270,4 @@ class PangeaRichTextState extends State<PangeaRichText> {
|
|
|
|
|
Future<void> onSentenceRewrite(String sentenceRewrite) async {
|
|
|
|
|
debugPrint("PTODO implement onSentenceRewrite");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// void onTextSelection(
|
|
|
|
|
// TextSelection selection,
|
|
|
|
|
// SelectionChangedCause? _,
|
|
|
|
|
// ) =>
|
|
|
|
|
// selection.isCollapsed
|
|
|
|
|
// ? clearTextSelection()
|
|
|
|
|
// : setTextSelection(selection);
|
|
|
|
|
|
|
|
|
|
// void setTextSelection(TextSelection selection) {
|
|
|
|
|
// textSelection = selection;
|
|
|
|
|
// if (BrowserContextMenu.enabled && kIsWeb) {
|
|
|
|
|
// BrowserContextMenu.disableContextMenu();
|
|
|
|
|
// }
|
|
|
|
|
// kIsWeb ? showToolbar() : showDefinition();
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// void clearTextSelection() {
|
|
|
|
|
// textSelection = null;
|
|
|
|
|
// if (kIsWeb && !BrowserContextMenu.enabled) {
|
|
|
|
|
// BrowserContextMenu.enableContextMenu();
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// void showToolbar() async {
|
|
|
|
|
// if (toolbarShowing || !kIsWeb) return;
|
|
|
|
|
// toolbarShowing = true;
|
|
|
|
|
// await Future.delayed(const Duration(seconds: 2));
|
|
|
|
|
|
|
|
|
|
// final toolbarFuture = MessageToolbar.showToolbar(
|
|
|
|
|
// context,
|
|
|
|
|
// widget.pangeaMessageEvent.eventId,
|
|
|
|
|
// _focusNode.offset,
|
|
|
|
|
// );
|
|
|
|
|
|
|
|
|
|
// final resp = await toolbarFuture;
|
|
|
|
|
// toolbarShowing = false;
|
|
|
|
|
|
|
|
|
|
// switch (resp) {
|
|
|
|
|
// case null:
|
|
|
|
|
// break;
|
|
|
|
|
// case 1:
|
|
|
|
|
// showDefinition();
|
|
|
|
|
// break;
|
|
|
|
|
// default:
|
|
|
|
|
// break;
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// void showDefinition() {
|
|
|
|
|
// final String messageText = textSpan.map((x) => x.text).join();
|
|
|
|
|
// final String fullText = textSelection!.textInside(messageText);
|
|
|
|
|
// final String langCode = widget.selectedDisplayLang?.langCode ??
|
|
|
|
|
// userL2LangCode ??
|
|
|
|
|
// LanguageKeys.unknownLanguage;
|
|
|
|
|
|
|
|
|
|
// OverlayUtil.showPositionedCard(
|
|
|
|
|
// context: context,
|
|
|
|
|
// cardToShow: WordDataCard(
|
|
|
|
|
// word: fullText,
|
|
|
|
|
// wordLang: langCode,
|
|
|
|
|
// fullText: messageText,
|
|
|
|
|
// fullTextLang: langCode,
|
|
|
|
|
// hasInfo: false,
|
|
|
|
|
// room: widget.pangeaMessageEvent.room,
|
|
|
|
|
// ),
|
|
|
|
|
// cardSize: const Size(300, 300),
|
|
|
|
|
// transformTargetId: widget.pangeaMessageEvent.eventId,
|
|
|
|
|
// backDropToDismiss: false,
|
|
|
|
|
// );
|
|
|
|
|
// }
|
|
|
|
|
}
|
|
|
|
|
|