Enable Formatting on Quoted Messages / Add "Replying To" Indicator #574

Merged
dan merged 2 commits from replying_to into trunk 2022-11-29 22:12:58 +00:00
4 changed files with 64 additions and 21 deletions

View File

@ -1,5 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:cwtch/config.dart';
import 'package:cwtch/models/message.dart'; import 'package:cwtch/models/message.dart';
import 'package:cwtch/models/messages/malformedmessage.dart'; import 'package:cwtch/models/messages/malformedmessage.dart';
import 'package:cwtch/widgets/malformedbubble.dart'; import 'package:cwtch/widgets/malformedbubble.dart';
@ -8,6 +9,9 @@ import 'package:cwtch/widgets/quotedmessage.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../settings.dart';
import '../../third_party/linkify/flutter_linkify.dart';
class QuotedMessageStructure { class QuotedMessageStructure {
final String quotedHash; final String quotedHash;
final String body; final String body;
@ -34,9 +38,16 @@ class QuotedMessage extends Message {
this.content, this.content,
); );
var content = message["body"]; var content = message["body"];
return Text( var formatMessages = Provider.of<Settings>(context).isExperimentEnabled(FormattingExperiment);
content, 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) { } catch (e) {
return MalformedBubble(); return MalformedBubble();
} }

View File

@ -10,6 +10,9 @@ import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../settings.dart';
import '../../third_party/linkify/flutter_linkify.dart';
class TextMessage extends Message { class TextMessage extends Message {
final MessageMetadata metadata; final MessageMetadata metadata;
final String content; final String content;
@ -21,9 +24,16 @@ class TextMessage extends Message {
return ChangeNotifierProvider.value( return ChangeNotifierProvider.value(
value: this.metadata, value: this.metadata,
builder: (bcontext, child) { builder: (bcontext, child) {
return Text( var formatMessages = Provider.of<Settings>(bcontext).isExperimentEnabled(FormattingExperiment);
this.content, return SelectableLinkify(
overflow: TextOverflow.ellipsis, 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,
); );
}); });
} }

View File

@ -25,7 +25,6 @@ class Juniper extends CwtchDark {
static final Color accent = Color(0xFF9E6A56); static final Color accent = Color(0xFF9E6A56);
static final Color accentAlt = Color(0xFF845A48); static final Color accentAlt = Color(0xFF845A48);
get theme => juniper_theme; get theme => juniper_theme;
get mode => mode_dark; get mode => mode_dark;

View File

@ -1,17 +1,14 @@
import 'package:cwtch/controllers/open_link_modal.dart'; import 'package:cwtch/controllers/open_link_modal.dart';
import 'package:cwtch/models/appstate.dart';
import 'package:cwtch/models/contact.dart'; import 'package:cwtch/models/contact.dart';
import 'package:cwtch/models/message.dart'; import 'package:cwtch/models/message.dart';
import 'package:cwtch/models/profile.dart'; import 'package:cwtch/models/profile.dart';
import 'package:cwtch/third_party/linkify/flutter_linkify.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/malformedbubble.dart';
import 'package:cwtch/widgets/messageloadingbubble.dart'; import 'package:cwtch/widgets/messageloadingbubble.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:intl/intl.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import '../settings.dart'; import '../settings.dart';
import 'messagebubbledecorations.dart'; import 'messagebubbledecorations.dart';
@ -45,6 +42,7 @@ class QuotedMessageBubbleState extends State<QuotedMessageBubble> {
senderDisplayStr = Provider.of<MessageMetadata>(context).senderHandle; senderDisplayStr = Provider.of<MessageMetadata>(context).senderHandle;
} }
} }
var wdgSender = SelectableText(senderDisplayStr, var wdgSender = SelectableText(senderDisplayStr,
style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor : Provider.of<Settings>(context).theme.messageFromOtherTextColor)); style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor : Provider.of<Settings>(context).theme.messageFromOtherTextColor));
@ -81,8 +79,30 @@ class QuotedMessageBubbleState extends State<QuotedMessageBubble> {
if (snapshot.hasData) { if (snapshot.hasData) {
try { try {
var qMessage = (snapshot.data! as Message); 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<ProfileInfoState>(context).onion) {
qMessageSender = Provider.of<ProfileInfoState>(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<ProfileInfoState>(context).contactList.findContact(qMessageSender);
if (contact != null) {
qMessageSender = contact.nickname;
}
}
var qTextColor = fromMe ? Provider.of<Settings>(context).theme.messageFromOtherTextColor : Provider.of<Settings>(context).theme.messageFromMeTextColor; var qTextColor = fromMe ? Provider.of<Settings>(context).theme.messageFromOtherTextColor : Provider.of<Settings>(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( return MouseRegion(
cursor: SystemMouseCursors.click, cursor: SystemMouseCursors.click,
child: GestureDetector( child: GestureDetector(
@ -103,15 +123,18 @@ class QuotedMessageBubbleState extends State<QuotedMessageBubble> {
color: fromMe ? Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor : Provider.of<Settings>(context).theme.messageFromMeBackgroundColor, color: fromMe ? Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor : Provider.of<Settings>(context).theme.messageFromMeBackgroundColor,
), ),
height: 75, height: 75,
child: Row(mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.start, children: [ child: Column(children: [
Padding(padding: EdgeInsets.symmetric(vertical: 5.0, horizontal: 10.0), child: Icon(Icons.reply, size: 32, color: qTextColor)), Align(alignment: Alignment.centerLeft, child: wdgReplyingTo),
Flexible( Row(mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.start, children: [
child: DefaultTextStyle( Padding(padding: EdgeInsets.symmetric(vertical: 5.0, horizontal: 10.0), child: Icon(Icons.reply, size: 32, color: qTextColor)),
textWidthBasis: TextWidthBasis.parent, Flexible(
child: qMessage.getPreviewWidget(context), child: DefaultTextStyle(
style: TextStyle(color: qTextColor), textWidthBasis: TextWidthBasis.parent,
overflow: TextOverflow.fade, child: qMessage.getPreviewWidget(context),
)) style: TextStyle(color: qTextColor),
overflow: TextOverflow.fade,
))
])
])))); ]))));
} catch (e) { } catch (e) {
return MalformedBubble(); return MalformedBubble();