add download icon

This commit is contained in:
otsmr 2025-01-30 23:01:40 +01:00
parent 59146674b6
commit dd31f18e07
5 changed files with 63 additions and 13 deletions

View file

@ -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;
}

View file

@ -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.",

View file

@ -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<List<DbMessage>> getAllMessagesForUserWithHigherMessageId(
int otherUserId, int lastMessageId) async {
var rows = await dbProvider.db!.query(
tableName,
where: "$columnOtherUserId = ? AND $columnMessageId > ?",
whereArgs: [otherUserId, lastMessageId],
orderBy: "$columnUpdatedAt DESC",
);
List<DbMessage> messages = await convertToDbMessage(rows);
return messages;
}
static Future<List<DbMessage>> getAllMessagesForUser(int otherUserId) async {
var rows = await dbProvider.db!.query(
tableName,

View file

@ -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<DownloadChangeProvider>()
.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<ChatItemDetailsView> {
}
Future _loadAsync({bool updateOpenStatus = false}) async {
if (_messages.isEmpty) {
_messages =
await DbMessages.getAllMessagesForUser(widget.user.userId.toInt());
} else {
int lastMessageId = _messages.first.messageId;
List<DbMessage> toAppend =
await DbMessages.getAllMessagesForUserWithHigherMessageId(
widget.user.userId.toInt(), lastMessageId);
_messages.insertAll(0, toAppend);
}
setState(() {});
if (updateOpenStatus) {
@ -149,7 +168,6 @@ class _ChatItemDetailsViewState extends State<ChatItemDetailsView> {
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<ChatItemDetailsView> {
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: [

View file

@ -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<UserListItem> {
.inSeconds;
MessageSendState state = widget.lastMessage.getSendState();
bool isDownloading = false;
if (widget.lastMessage.messageContent != null &&
widget.lastMessage.messageContent!.downloadToken != null) {
isDownloading = context
.watch<DownloadChangeProvider>()
.currentlyDownloading
.contains(widget.lastMessage.messageContent!.downloadToken!);
}
return UserContextMenu(
user: widget.user,
@ -184,6 +193,7 @@ class _UserListItem extends State<UserListItem> {
),
leading: InitialsAvatar(displayName: widget.user.displayName),
onTap: () {
if (isDownloading) return;
if (!widget.lastMessage.isDownloaded) {
List<int> token = widget.lastMessage.messageContent!.downloadToken!;
tryDownloadMedia(token, force: true);