diff --git a/lib/models/messages/quotedmessage.dart b/lib/models/messages/quotedmessage.dart index 9f819618..d827d632 100644 --- a/lib/models/messages/quotedmessage.dart +++ b/lib/models/messages/quotedmessage.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:cwtch/config.dart'; import 'package:cwtch/models/message.dart'; import 'package:cwtch/models/messages/malformedmessage.dart'; import 'package:cwtch/widgets/malformedbubble.dart'; @@ -8,6 +9,9 @@ import 'package:cwtch/widgets/quotedmessage.dart'; import 'package:flutter/widgets.dart'; import 'package:provider/provider.dart'; +import '../../settings.dart'; +import '../../third_party/linkify/flutter_linkify.dart'; + class QuotedMessageStructure { final String quotedHash; final String body; @@ -34,9 +38,16 @@ class QuotedMessage extends Message { this.content, ); var content = message["body"]; - return Text( - content, - ); + var formatMessages = Provider.of(context).isExperimentEnabled(FormattingExperiment); + return SelectableLinkify( + text: content + '\u202F', + options: LinkifyOptions(messageFormatting: formatMessages, parseLinks: false, looseUrl: true, defaultToHttps: true), + linkifiers: [UrlLinkifier()], + onOpen: null, + textAlign: TextAlign.left, + style: TextStyle(overflow: TextOverflow.ellipsis), + codeStyle: TextStyle(overflow: TextOverflow.ellipsis), + textWidthBasis: TextWidthBasis.longestLine); } catch (e) { return MalformedBubble(); } diff --git a/lib/models/messages/textmessage.dart b/lib/models/messages/textmessage.dart index b2496f19..3c46a21a 100644 --- a/lib/models/messages/textmessage.dart +++ b/lib/models/messages/textmessage.dart @@ -10,6 +10,9 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:provider/provider.dart'; +import '../../settings.dart'; +import '../../third_party/linkify/flutter_linkify.dart'; + class TextMessage extends Message { final MessageMetadata metadata; final String content; @@ -21,9 +24,16 @@ class TextMessage extends Message { return ChangeNotifierProvider.value( value: this.metadata, builder: (bcontext, child) { - return Text( - this.content, - overflow: TextOverflow.ellipsis, + var formatMessages = Provider.of(bcontext).isExperimentEnabled(FormattingExperiment); + return SelectableLinkify( + text: content + '\u202F', + options: LinkifyOptions(messageFormatting: formatMessages, parseLinks: false, looseUrl: true, defaultToHttps: true), + linkifiers: [UrlLinkifier()], + onOpen: null, + textAlign: TextAlign.left, + style: TextStyle(overflow: TextOverflow.ellipsis), + codeStyle: TextStyle(overflow: TextOverflow.ellipsis), + textWidthBasis: TextWidthBasis.longestLine, ); }); } diff --git a/lib/themes/juniper.dart b/lib/themes/juniper.dart index a8965657..33308e32 100644 --- a/lib/themes/juniper.dart +++ b/lib/themes/juniper.dart @@ -25,7 +25,6 @@ class Juniper extends CwtchDark { static final Color accent = Color(0xFF9E6A56); static final Color accentAlt = Color(0xFF845A48); - get theme => juniper_theme; get mode => mode_dark; diff --git a/lib/widgets/quotedmessage.dart b/lib/widgets/quotedmessage.dart index 038d9052..acf218f9 100644 --- a/lib/widgets/quotedmessage.dart +++ b/lib/widgets/quotedmessage.dart @@ -1,17 +1,14 @@ import 'package:cwtch/controllers/open_link_modal.dart'; -import 'package:cwtch/models/appstate.dart'; import 'package:cwtch/models/contact.dart'; import 'package:cwtch/models/message.dart'; import 'package:cwtch/models/profile.dart'; import 'package:cwtch/third_party/linkify/flutter_linkify.dart'; -import 'package:cwtch/views/contactsview.dart'; import 'package:cwtch/widgets/malformedbubble.dart'; import 'package:cwtch/widgets/messageloadingbubble.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:intl/intl.dart'; - +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import '../settings.dart'; import 'messagebubbledecorations.dart'; @@ -45,6 +42,7 @@ class QuotedMessageBubbleState extends State { senderDisplayStr = Provider.of(context).senderHandle; } } + var wdgSender = SelectableText(senderDisplayStr, style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of(context).theme.messageFromMeTextColor : Provider.of(context).theme.messageFromOtherTextColor)); @@ -81,8 +79,30 @@ class QuotedMessageBubbleState extends State { if (snapshot.hasData) { try { var qMessage = (snapshot.data! as Message); - // Swap the background color for quoted tweets.. + + // If the sender is not us, then we want to give them a nickname... + String qMessageSender; + + // if we sent the quoted message then display our nickname + if (qMessage.getMetadata().senderHandle == Provider.of(context).onion) { + qMessageSender = Provider.of(context).nickname; + } else { + // default to handle + qMessageSender = qMessage.getMetadata().senderHandle; + // if we have the handle as a contact then replace with the nickname... + ContactInfoState? contact = Provider.of(context).contactList.findContact(qMessageSender); + if (contact != null) { + qMessageSender = contact.nickname; + } + } + var qTextColor = fromMe ? Provider.of(context).theme.messageFromOtherTextColor : Provider.of(context).theme.messageFromMeTextColor; + + var wdgReplyingTo = SelectableText( + AppLocalizations.of(context)!.replyingTo.replaceAll("%1", qMessageSender), + style: TextStyle(fontSize: 10, color: qTextColor.withOpacity(0.8)), + ); + // Swap the background color for quoted tweets.. return MouseRegion( cursor: SystemMouseCursors.click, child: GestureDetector( @@ -103,15 +123,18 @@ class QuotedMessageBubbleState extends State { color: fromMe ? Provider.of(context).theme.messageFromOtherBackgroundColor : Provider.of(context).theme.messageFromMeBackgroundColor, ), height: 75, - child: Row(mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.start, children: [ - Padding(padding: EdgeInsets.symmetric(vertical: 5.0, horizontal: 10.0), child: Icon(Icons.reply, size: 32, color: qTextColor)), - Flexible( - child: DefaultTextStyle( - textWidthBasis: TextWidthBasis.parent, - child: qMessage.getPreviewWidget(context), - style: TextStyle(color: qTextColor), - overflow: TextOverflow.fade, - )) + child: Column(children: [ + Align(alignment: Alignment.centerLeft, child: wdgReplyingTo), + Row(mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.start, children: [ + Padding(padding: EdgeInsets.symmetric(vertical: 5.0, horizontal: 10.0), child: Icon(Icons.reply, size: 32, color: qTextColor)), + Flexible( + child: DefaultTextStyle( + textWidthBasis: TextWidthBasis.parent, + child: qMessage.getPreviewWidget(context), + style: TextStyle(color: qTextColor), + overflow: TextOverflow.fade, + )) + ]) ])))); } catch (e) { return MalformedBubble();