diff --git a/lib/src/components/message_send_state_icon.dart b/lib/src/components/message_send_state_icon.dart index 1441127..825da60 100644 --- a/lib/src/components/message_send_state_icon.dart +++ b/lib/src/components/message_send_state_icon.dart @@ -4,6 +4,7 @@ import 'package:provider/provider.dart'; import 'package:twonly/src/model/json/message.dart'; import 'package:twonly/src/model/messages_model.dart'; import 'package:twonly/src/providers/download_change_provider.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; enum MessageSendState { received, @@ -43,29 +44,29 @@ class MessageSendStateIcon extends StatelessWidget { switch (message.getSendState()) { case MessageSendState.receivedOpened: icon = Icon(Icons.crop_square, size: 14, color: color); - text = "Received"; + text = AppLocalizations.of(context)!.messageSendState_Received; break; case MessageSendState.sendOpened: icon = FaIcon(FontAwesomeIcons.paperPlane, size: 12, color: color); - text = "Opened"; + text = AppLocalizations.of(context)!.messageSendState_Opened; break; case MessageSendState.received: icon = Icon(Icons.square_rounded, size: 14, color: color); - text = "Received"; + text = AppLocalizations.of(context)!.messageSendState_Received; break; case MessageSendState.send: icon = FaIcon(FontAwesomeIcons.solidPaperPlane, size: 12, color: color); - text = "Send"; + text = AppLocalizations.of(context)!.messageSendState_Send; break; case MessageSendState.sending: case MessageSendState.receiving: icon = loaderIcon; - text = "Sending"; + text = AppLocalizations.of(context)!.messageSendState_Sending; break; } if (!message.isDownloaded) { - text = "Tap do load"; + text = AppLocalizations.of(context)!.messageSendState_TapToLoad; } bool isDownloading = false; @@ -78,7 +79,7 @@ class MessageSendStateIcon extends StatelessWidget { } if (isDownloading) { - text = "Downloading"; + text = AppLocalizations.of(context)!.messageSendState_Loading; icon = loaderIcon; } diff --git a/lib/src/localization/app_en.arb b/lib/src/localization/app_en.arb index cccac11..15405a9 100644 --- a/lib/src/localization/app_en.arb +++ b/lib/src/localization/app_en.arb @@ -23,6 +23,12 @@ "chatListViewSearchUserNameBtn": "Add your first twonly contact!", "chatListViewSendFirstTwonly": "Send your first twonly!", "chatListDetailInput": "Type a message", + "messageSendState_Received": "Received", + "messageSendState_Opened": "Opened", + "messageSendState_Send": "Send", + "messageSendState_Sending": "Sending", + "messageSendState_TapToLoad": "Tap to load", + "messageSendState_Loading": "Downloading", "chatListDetailTitle": "Your chat with {username}", "searchUsernameNotFoundLong": "\"{username}\" is not a twonly user. Please check the username and try again.", "errorUnknown": "An unexpected error has occurred. Please try again later.", diff --git a/lib/src/model/messages_model.dart b/lib/src/model/messages_model.dart index 47cbf96..98c8589 100644 --- a/lib/src/model/messages_model.dart +++ b/lib/src/model/messages_model.dart @@ -150,6 +150,7 @@ class DbMessages extends CvModelBase { columnOtherUserId: userIdFrom, columnSendOrReceivedAt: DateTime.now().toIso8601String() }); + print("insertl"); globalCallBackOnMessageChange(userIdFrom); return messageId; } catch (e) { @@ -179,6 +180,20 @@ class DbMessages extends CvModelBase { } } + static Future> getAllMessagesForUserWithHigherMessageId( + int otherUserId, int lastMessageId) async { + var rows = await dbProvider.db!.query( + tableName, + where: "$columnOtherUserId = ? AND $columnMessageId > ?", + whereArgs: [otherUserId, lastMessageId], + orderBy: "$columnUpdatedAt DESC", + ); + + List messages = await convertToDbMessage(rows); + + return messages; + } + static Future> getAllMessagesForUser(int otherUserId) async { var rows = await dbProvider.db!.query( tableName, diff --git a/lib/src/views/chat_item_details_view.dart b/lib/src/views/chat_item_details_view.dart index 9919d51..fc71857 100644 --- a/lib/src/views/chat_item_details_view.dart +++ b/lib/src/views/chat_item_details_view.dart @@ -8,6 +8,7 @@ import 'package:twonly/src/model/contacts_model.dart'; import 'package:twonly/src/model/json/message.dart'; import 'package:twonly/src/model/messages_model.dart'; import 'package:twonly/src/providers/api/api.dart'; +import 'package:twonly/src/providers/download_change_provider.dart'; import 'package:twonly/src/providers/messages_change_provider.dart'; import 'package:twonly/src/views/media_viewer_view.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; @@ -24,6 +25,15 @@ class ChatListEntry extends StatelessWidget { bool right = message.messageOtherId == null; MessageSendState state = message.getSendState(); + bool isDownloading = false; + if (message.messageContent != null && + message.messageContent!.downloadToken != null) { + isDownloading = context + .watch() + .currentlyDownloading + .contains(message.messageContent!.downloadToken!); + } + Widget child = Container(); switch (message.messageKind) { @@ -56,7 +66,7 @@ class ChatListEntry extends StatelessWidget { message.messageKind.getColor(Theme.of(context).colorScheme.primary); child = GestureDetector( onTap: () { - if (state == MessageSendState.received) { + if (state == MessageSendState.received && !isDownloading) { if (message.isDownloaded) { Navigator.push( context, @@ -127,8 +137,17 @@ class _ChatItemDetailsViewState extends State { } Future _loadAsync({bool updateOpenStatus = false}) async { - _messages = - await DbMessages.getAllMessagesForUser(widget.user.userId.toInt()); + if (_messages.isEmpty) { + _messages = + await DbMessages.getAllMessagesForUser(widget.user.userId.toInt()); + } else { + int lastMessageId = _messages.first.messageId; + List toAppend = + await DbMessages.getAllMessagesForUserWithHigherMessageId( + widget.user.userId.toInt(), lastMessageId); + _messages.insertAll(0, toAppend); + } + setState(() {}); if (updateOpenStatus) { @@ -149,7 +168,6 @@ class _ChatItemDetailsViewState extends State { String text = newMessageController.text; if (text == "") return; await sendTextMessage(widget.user.userId, newMessageController.text); - _loadAsync(); newMessageController.clear(); } @@ -162,10 +180,10 @@ class _ChatItemDetailsViewState extends State { lastChangeCounter = changeCounter[widget.user.userId.toInt()]!; } } - // messages = messages.reversed.toList(); return Scaffold( appBar: AppBar( - title: Text('Your Chat with ${widget.user.displayName}'), + title: Text(AppLocalizations.of(context)! + .chatListDetailTitle(widget.user.displayName)), ), body: Column( children: [ diff --git a/lib/src/views/chat_list_view.dart b/lib/src/views/chat_list_view.dart index d114ce2..a2638bd 100644 --- a/lib/src/views/chat_list_view.dart +++ b/lib/src/views/chat_list_view.dart @@ -7,6 +7,7 @@ import 'package:twonly/src/model/contacts_model.dart'; import 'package:twonly/src/model/messages_model.dart'; import 'package:twonly/src/providers/api/api.dart'; import 'package:twonly/src/providers/contacts_change_provider.dart'; +import 'package:twonly/src/providers/download_change_provider.dart'; import 'package:twonly/src/providers/messages_change_provider.dart'; import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/views/chat_item_details_view.dart'; @@ -149,6 +150,14 @@ class _UserListItem extends State { .inSeconds; MessageSendState state = widget.lastMessage.getSendState(); + bool isDownloading = false; + if (widget.lastMessage.messageContent != null && + widget.lastMessage.messageContent!.downloadToken != null) { + isDownloading = context + .watch() + .currentlyDownloading + .contains(widget.lastMessage.messageContent!.downloadToken!); + } return UserContextMenu( user: widget.user, @@ -184,6 +193,7 @@ class _UserListItem extends State { ), leading: InitialsAvatar(displayName: widget.user.displayName), onTap: () { + if (isDownloading) return; if (!widget.lastMessage.isDownloaded) { List token = widget.lastMessage.messageContent!.downloadToken!; tryDownloadMedia(token, force: true);