forked from cwtch.im/cwtch-ui
new message marker moved from id to index and now works on old messages
This commit is contained in:
parent
0647a2d98d
commit
ffa51e83a1
|
@ -42,7 +42,7 @@ class ContactInfoState extends ChangeNotifier {
|
|||
late int _totalMessages = 0;
|
||||
late DateTime _lastMessageTime;
|
||||
late Map<String, GlobalKey<MessageRowState>> 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;
|
||||
|
|
|
@ -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<Message> 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);
|
||||
}
|
||||
|
|
|
@ -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<MessageInfo?> getByIndex(int index) async {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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,
|
||||
);
|
||||
});
|
||||
|
|
|
@ -100,7 +100,7 @@ class _MessageListState extends State<MessageList> {
|
|||
// 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<ContactInfoState>(outerContext, listen: false).getMessageKey(contactHandle, messageIndex);
|
||||
return message.getWidget(context, key);
|
||||
return message.getWidget(context, key, messageIndex);
|
||||
} else {
|
||||
return MessageLoadingBubble();
|
||||
}
|
||||
|
|
|
@ -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<MessageRow> with SingleTickerProviderStateMi
|
|||
late Alignment _dragAlignment = Alignment.center;
|
||||
Alignment _dragAffinity = Alignment.center;
|
||||
|
||||
late int index;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
index = Provider.of<MessageMetadata>(context, listen: false).messageID;
|
||||
_controller = AnimationController(vsync: this);
|
||||
_controller.addListener(() {
|
||||
setState(() {
|
||||
|
@ -224,8 +222,7 @@ class MessageRowState extends State<MessageRow> with SingleTickerProviderStateMi
|
|||
children: widgetRow,
|
||||
)))));
|
||||
|
||||
var markMsgId = Provider.of<ContactInfoState>(context).newMarkerMsgId;
|
||||
if (markMsgId == Provider.of<MessageMetadata>(context).messageID) {
|
||||
if (Provider.of<ContactInfoState>(context).newMarkerMsgIndex == widget.index) {
|
||||
return Column(crossAxisAlignment: fromMe ? CrossAxisAlignment.end : CrossAxisAlignment.start, children: [Align(alignment: Alignment.center, child: _bubbleNew()), mr]);
|
||||
} else {
|
||||
return mr;
|
||||
|
|
Loading…
Reference in New Issue