From ffa51e83a19568253d346341b884d2afbe07928c Mon Sep 17 00:00:00 2001 From: Dan Ballard Date: Fri, 29 Apr 2022 16:00:52 -0700 Subject: [PATCH] new message marker moved from id to index and now works on old messages --- lib/models/contact.dart | 15 +++++++++------ lib/models/message.dart | 23 ++++++++++++----------- lib/models/messagecache.dart | 7 ------- lib/models/messages/filemessage.dart | 12 ++++++------ lib/models/messages/invitemessage.dart | 6 +++--- lib/models/messages/malformedmessage.dart | 4 ++-- lib/models/messages/quotedmessage.dart | 4 ++-- lib/models/messages/textmessage.dart | 4 ++-- lib/widgets/messagelist.dart | 2 +- lib/widgets/messagerow.dart | 9 +++------ 10 files changed, 40 insertions(+), 46 deletions(-) diff --git a/lib/models/contact.dart b/lib/models/contact.dart index 56bfe8b3..5cbdd5cf 100644 --- a/lib/models/contact.dart +++ b/lib/models/contact.dart @@ -42,7 +42,7 @@ class ContactInfoState extends ChangeNotifier { late int _totalMessages = 0; late DateTime _lastMessageTime; late Map> keys; - int _newMarkerMsgId = -1; + int _newMarkerMsgIndex = -1; late MessageCache messageCache; // todo: a nicer way to model contacts, groups and other "entities" @@ -145,11 +145,12 @@ class ContactInfoState extends ChangeNotifier { } void selected() { + this._newMarkerMsgIndex = this._unreadMessages-1; this._unreadMessages = 0; } void unselected() { - this._newMarkerMsgId = -1; + this._newMarkerMsgIndex = -1; } int get unreadMessages => this._unreadMessages; @@ -159,8 +160,8 @@ class ContactInfoState extends ChangeNotifier { notifyListeners(); } - int get newMarkerMsgId { - return this._newMarkerMsgId; + int get newMarkerMsgIndex { + return this._newMarkerMsgIndex; } int get totalMessages => this._totalMessages; @@ -240,8 +241,10 @@ class ContactInfoState extends ChangeNotifier { if (!selectedConversation) { unreadMessages++; } - if (_newMarkerMsgId == -1) { - _newMarkerMsgId = messageID; + if (_newMarkerMsgIndex == -1) { + _newMarkerMsgIndex = 0; + } else { + _newMarkerMsgIndex++; } this._lastMessageTime = timestamp; diff --git a/lib/models/message.dart b/lib/models/message.dart index d7786fdf..67e0bc02 100644 --- a/lib/models/message.dart +++ b/lib/models/message.dart @@ -32,33 +32,34 @@ const GroupConversationHandleLength = 32; abstract class Message { MessageMetadata getMetadata(); - Widget getWidget(BuildContext context, Key key); + Widget getWidget(BuildContext context, Key key, int index); Widget getPreviewWidget(BuildContext context); } -Message compileOverlay(MessageMetadata metadata, String messageData) { - try { - dynamic message = jsonDecode(messageData); +Message compileOverlay(MessageInfo messageInfo) { + + try { + dynamic message = jsonDecode(messageInfo.wrapper); var content = message['d'] as dynamic; var overlay = int.parse(message['o'].toString()); switch (overlay) { case TextMessageOverlay: - return TextMessage(metadata, content); + return TextMessage(messageInfo.metadata, content); case SuggestContactOverlay: case InviteGroupOverlay: - return InviteMessage(overlay, metadata, content); + return InviteMessage(overlay, messageInfo.metadata, content); case QuotedMessageOverlay: - return QuotedMessage(metadata, content); + return QuotedMessage(messageInfo.metadata, content); case FileShareOverlay: - return FileMessage(metadata, content); + return FileMessage(messageInfo.metadata, content); default: // Metadata is valid, content is not.. - return MalformedMessage(metadata); + return MalformedMessage(messageInfo.metadata); } } catch (e) { - return MalformedMessage(metadata); + return MalformedMessage(messageInfo.metadata); } } @@ -222,7 +223,7 @@ Future messageHandler(BuildContext context, String profileOnion, int co MessageInfo? messageInfo = await cacheHandler.get(cwtch, profileOnion, conversationIdentifier, cache); if (messageInfo != null) { - return compileOverlay(messageInfo.metadata, messageInfo.wrapper); + return compileOverlay(messageInfo); } else { return MalformedMessage(malformedMetadata); } diff --git a/lib/models/messagecache.dart b/lib/models/messagecache.dart index 9c218930..b2c348ce 100644 --- a/lib/models/messagecache.dart +++ b/lib/models/messagecache.dart @@ -105,13 +105,6 @@ class MessageCache extends ChangeNotifier { int get indexUnsynced => _indexUnsynced; - // TODO: unused? delete? - void resetIndexCache() { - this._indexUnsynced = 0; - cacheByIndex = List.empty(growable: true); - notifyListeners(); - } - MessageInfo? getById(int id) => cache[id]; Future getByIndex(int index) async { diff --git a/lib/models/messages/filemessage.dart b/lib/models/messages/filemessage.dart index c68b24e5..3ba18fad 100644 --- a/lib/models/messages/filemessage.dart +++ b/lib/models/messages/filemessage.dart @@ -18,13 +18,13 @@ class FileMessage extends Message { FileMessage(this.metadata, this.content); @override - Widget getWidget(BuildContext context, Key key) { + Widget getWidget(BuildContext context, Key key, int index) { return ChangeNotifierProvider.value( value: this.metadata, builder: (bcontext, child) { dynamic shareObj = jsonDecode(this.content); if (shareObj == null) { - return MessageRow(MalformedBubble()); + return MessageRow(MalformedBubble(), index); } String nameSuggestion = shareObj['f'] as String; String rootHash = shareObj['h'] as String; @@ -39,10 +39,10 @@ class FileMessage extends Message { } if (!validHash(rootHash, nonce)) { - return MessageRow(MalformedBubble()); + return MessageRow(MalformedBubble(), index); } - return MessageRow(FileBubble(nameSuggestion, rootHash, nonce, fileSize, isAuto: metadata.isAuto), key: key); + return MessageRow(FileBubble(nameSuggestion, rootHash, nonce, fileSize, isAuto: metadata.isAuto), index, key: key); }); } @@ -53,14 +53,14 @@ class FileMessage extends Message { builder: (bcontext, child) { dynamic shareObj = jsonDecode(this.content); if (shareObj == null) { - return MessageRow(MalformedBubble()); + return MessageRow(MalformedBubble(), 0); } String nameSuggestion = shareObj['n'] as String; String rootHash = shareObj['h'] as String; String nonce = shareObj['n'] as String; int fileSize = shareObj['s'] as int; if (!validHash(rootHash, nonce)) { - return MessageRow(MalformedBubble()); + return MessageRow(MalformedBubble(), 0); } return Container( alignment: Alignment.center, diff --git a/lib/models/messages/invitemessage.dart b/lib/models/messages/invitemessage.dart index 50a28806..02fc7512 100644 --- a/lib/models/messages/invitemessage.dart +++ b/lib/models/messages/invitemessage.dart @@ -17,7 +17,7 @@ class InviteMessage extends Message { InviteMessage(this.overlay, this.metadata, this.content); @override - Widget getWidget(BuildContext context, Key key) { + Widget getWidget(BuildContext context, Key key, int index) { return ChangeNotifierProvider.value( value: this.metadata, builder: (bcontext, child) { @@ -36,10 +36,10 @@ class InviteMessage extends Message { inviteTarget = jsonObj['GroupID']; inviteNick = jsonObj['GroupName']; } else { - return MessageRow(MalformedBubble()); + return MessageRow(MalformedBubble(), index); } } - return MessageRow(InvitationBubble(overlay, inviteTarget, inviteNick, invite), key: key); + return MessageRow(InvitationBubble(overlay, inviteTarget, inviteNick, invite), index, key: key); }); } diff --git a/lib/models/messages/malformedmessage.dart b/lib/models/messages/malformedmessage.dart index 0ebf2281..033663f2 100644 --- a/lib/models/messages/malformedmessage.dart +++ b/lib/models/messages/malformedmessage.dart @@ -9,11 +9,11 @@ class MalformedMessage extends Message { MalformedMessage(this.metadata); @override - Widget getWidget(BuildContext context, Key key) { + Widget getWidget(BuildContext context, Key key, int index) { return ChangeNotifierProvider.value( value: this.metadata, builder: (context, child) { - return MessageRow(MalformedBubble(), key: key); + return MessageRow(MalformedBubble(), index, key: key); }); } diff --git a/lib/models/messages/quotedmessage.dart b/lib/models/messages/quotedmessage.dart index c43ac12c..1519037a 100644 --- a/lib/models/messages/quotedmessage.dart +++ b/lib/models/messages/quotedmessage.dart @@ -48,7 +48,7 @@ class QuotedMessage extends Message { } @override - Widget getWidget(BuildContext context, Key key) { + Widget getWidget(BuildContext context, Key key, int index) { try { dynamic message = jsonDecode(this.content); @@ -59,7 +59,7 @@ class QuotedMessage extends Message { return ChangeNotifierProvider.value( value: this.metadata, builder: (bcontext, child) { - return MessageRow(QuotedMessageBubble(message["body"], messageHandler(bcontext, metadata.profileOnion, metadata.conversationIdentifier, ByContentHash(message["quotedHash"]))), key: key); + return MessageRow(QuotedMessageBubble(message["body"], messageHandler(bcontext, metadata.profileOnion, metadata.conversationIdentifier, ByContentHash(message["quotedHash"]))), index, key: key); }); } catch (e) { return MalformedBubble(); diff --git a/lib/models/messages/textmessage.dart b/lib/models/messages/textmessage.dart index ecfeab70..908a7d53 100644 --- a/lib/models/messages/textmessage.dart +++ b/lib/models/messages/textmessage.dart @@ -29,12 +29,12 @@ class TextMessage extends Message { } @override - Widget getWidget(BuildContext context, Key key) { + Widget getWidget(BuildContext context, Key key, int index) { return ChangeNotifierProvider.value( value: this.metadata, builder: (bcontext, child) { return MessageRow( - MessageBubble(this.content), + MessageBubble(this.content), index, key: key, ); }); diff --git a/lib/widgets/messagelist.dart b/lib/widgets/messagelist.dart index f5100234..6e5583e5 100644 --- a/lib/widgets/messagelist.dart +++ b/lib/widgets/messagelist.dart @@ -100,7 +100,7 @@ class _MessageListState extends State { // reliably use this without running into duplicate keys...it isn't ideal as it means keys need to be re-built // when new messages are added...however it is better than the alternative of not having widget keys at all. var key = Provider.of(outerContext, listen: false).getMessageKey(contactHandle, messageIndex); - return message.getWidget(context, key); + return message.getWidget(context, key, messageIndex); } else { return MessageLoadingBubble(); } diff --git a/lib/widgets/messagerow.dart b/lib/widgets/messagerow.dart index 710109e1..f52921c8 100644 --- a/lib/widgets/messagerow.dart +++ b/lib/widgets/messagerow.dart @@ -18,8 +18,9 @@ import '../settings.dart'; class MessageRow extends StatefulWidget { final Widget child; + final int index; - MessageRow(this.child, {Key? key}) : super(key: key); + MessageRow(this.child, this.index, {Key? key}) : super(key: key); @override MessageRowState createState() => MessageRowState(); @@ -32,12 +33,9 @@ class MessageRowState extends State with SingleTickerProviderStateMi late Alignment _dragAlignment = Alignment.center; Alignment _dragAffinity = Alignment.center; - late int index; - @override void initState() { super.initState(); - index = Provider.of(context, listen: false).messageID; _controller = AnimationController(vsync: this); _controller.addListener(() { setState(() { @@ -224,8 +222,7 @@ class MessageRowState extends State with SingleTickerProviderStateMi children: widgetRow, ))))); - var markMsgId = Provider.of(context).newMarkerMsgId; - if (markMsgId == Provider.of(context).messageID) { + if (Provider.of(context).newMarkerMsgIndex == widget.index) { return Column(crossAxisAlignment: fromMe ? CrossAxisAlignment.end : CrossAxisAlignment.start, children: [Align(alignment: Alignment.center, child: _bubbleNew()), mr]); } else { return mr;