mirror of
https://github.com/twonlyapp/twonly-app.git
synced 2026-01-15 13:08:42 +00:00
add download icon
This commit is contained in:
parent
59146674b6
commit
dd31f18e07
5 changed files with 63 additions and 13 deletions
|
|
@ -4,6 +4,7 @@ import 'package:provider/provider.dart';
|
||||||
import 'package:twonly/src/model/json/message.dart';
|
import 'package:twonly/src/model/json/message.dart';
|
||||||
import 'package:twonly/src/model/messages_model.dart';
|
import 'package:twonly/src/model/messages_model.dart';
|
||||||
import 'package:twonly/src/providers/download_change_provider.dart';
|
import 'package:twonly/src/providers/download_change_provider.dart';
|
||||||
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
|
|
||||||
enum MessageSendState {
|
enum MessageSendState {
|
||||||
received,
|
received,
|
||||||
|
|
@ -43,29 +44,29 @@ class MessageSendStateIcon extends StatelessWidget {
|
||||||
switch (message.getSendState()) {
|
switch (message.getSendState()) {
|
||||||
case MessageSendState.receivedOpened:
|
case MessageSendState.receivedOpened:
|
||||||
icon = Icon(Icons.crop_square, size: 14, color: color);
|
icon = Icon(Icons.crop_square, size: 14, color: color);
|
||||||
text = "Received";
|
text = AppLocalizations.of(context)!.messageSendState_Received;
|
||||||
break;
|
break;
|
||||||
case MessageSendState.sendOpened:
|
case MessageSendState.sendOpened:
|
||||||
icon = FaIcon(FontAwesomeIcons.paperPlane, size: 12, color: color);
|
icon = FaIcon(FontAwesomeIcons.paperPlane, size: 12, color: color);
|
||||||
text = "Opened";
|
text = AppLocalizations.of(context)!.messageSendState_Opened;
|
||||||
break;
|
break;
|
||||||
case MessageSendState.received:
|
case MessageSendState.received:
|
||||||
icon = Icon(Icons.square_rounded, size: 14, color: color);
|
icon = Icon(Icons.square_rounded, size: 14, color: color);
|
||||||
text = "Received";
|
text = AppLocalizations.of(context)!.messageSendState_Received;
|
||||||
break;
|
break;
|
||||||
case MessageSendState.send:
|
case MessageSendState.send:
|
||||||
icon = FaIcon(FontAwesomeIcons.solidPaperPlane, size: 12, color: color);
|
icon = FaIcon(FontAwesomeIcons.solidPaperPlane, size: 12, color: color);
|
||||||
text = "Send";
|
text = AppLocalizations.of(context)!.messageSendState_Send;
|
||||||
break;
|
break;
|
||||||
case MessageSendState.sending:
|
case MessageSendState.sending:
|
||||||
case MessageSendState.receiving:
|
case MessageSendState.receiving:
|
||||||
icon = loaderIcon;
|
icon = loaderIcon;
|
||||||
text = "Sending";
|
text = AppLocalizations.of(context)!.messageSendState_Sending;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!message.isDownloaded) {
|
if (!message.isDownloaded) {
|
||||||
text = "Tap do load";
|
text = AppLocalizations.of(context)!.messageSendState_TapToLoad;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isDownloading = false;
|
bool isDownloading = false;
|
||||||
|
|
@ -78,7 +79,7 @@ class MessageSendStateIcon extends StatelessWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isDownloading) {
|
if (isDownloading) {
|
||||||
text = "Downloading";
|
text = AppLocalizations.of(context)!.messageSendState_Loading;
|
||||||
icon = loaderIcon;
|
icon = loaderIcon;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,12 @@
|
||||||
"chatListViewSearchUserNameBtn": "Add your first twonly contact!",
|
"chatListViewSearchUserNameBtn": "Add your first twonly contact!",
|
||||||
"chatListViewSendFirstTwonly": "Send your first twonly!",
|
"chatListViewSendFirstTwonly": "Send your first twonly!",
|
||||||
"chatListDetailInput": "Type a message",
|
"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}",
|
"chatListDetailTitle": "Your chat with {username}",
|
||||||
"searchUsernameNotFoundLong": "\"{username}\" is not a twonly user. Please check the username and try again.",
|
"searchUsernameNotFoundLong": "\"{username}\" is not a twonly user. Please check the username and try again.",
|
||||||
"errorUnknown": "An unexpected error has occurred. Please try again later.",
|
"errorUnknown": "An unexpected error has occurred. Please try again later.",
|
||||||
|
|
|
||||||
|
|
@ -150,6 +150,7 @@ class DbMessages extends CvModelBase {
|
||||||
columnOtherUserId: userIdFrom,
|
columnOtherUserId: userIdFrom,
|
||||||
columnSendOrReceivedAt: DateTime.now().toIso8601String()
|
columnSendOrReceivedAt: DateTime.now().toIso8601String()
|
||||||
});
|
});
|
||||||
|
print("insertl");
|
||||||
globalCallBackOnMessageChange(userIdFrom);
|
globalCallBackOnMessageChange(userIdFrom);
|
||||||
return messageId;
|
return messageId;
|
||||||
} catch (e) {
|
} 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 {
|
static Future<List<DbMessage>> getAllMessagesForUser(int otherUserId) async {
|
||||||
var rows = await dbProvider.db!.query(
|
var rows = await dbProvider.db!.query(
|
||||||
tableName,
|
tableName,
|
||||||
|
|
|
||||||
|
|
@ -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/json/message.dart';
|
||||||
import 'package:twonly/src/model/messages_model.dart';
|
import 'package:twonly/src/model/messages_model.dart';
|
||||||
import 'package:twonly/src/providers/api/api.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/providers/messages_change_provider.dart';
|
||||||
import 'package:twonly/src/views/media_viewer_view.dart';
|
import 'package:twonly/src/views/media_viewer_view.dart';
|
||||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
|
|
@ -24,6 +25,15 @@ class ChatListEntry extends StatelessWidget {
|
||||||
bool right = message.messageOtherId == null;
|
bool right = message.messageOtherId == null;
|
||||||
MessageSendState state = message.getSendState();
|
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();
|
Widget child = Container();
|
||||||
|
|
||||||
switch (message.messageKind) {
|
switch (message.messageKind) {
|
||||||
|
|
@ -56,7 +66,7 @@ class ChatListEntry extends StatelessWidget {
|
||||||
message.messageKind.getColor(Theme.of(context).colorScheme.primary);
|
message.messageKind.getColor(Theme.of(context).colorScheme.primary);
|
||||||
child = GestureDetector(
|
child = GestureDetector(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
if (state == MessageSendState.received) {
|
if (state == MessageSendState.received && !isDownloading) {
|
||||||
if (message.isDownloaded) {
|
if (message.isDownloaded) {
|
||||||
Navigator.push(
|
Navigator.push(
|
||||||
context,
|
context,
|
||||||
|
|
@ -127,8 +137,17 @@ class _ChatItemDetailsViewState extends State<ChatItemDetailsView> {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future _loadAsync({bool updateOpenStatus = false}) async {
|
Future _loadAsync({bool updateOpenStatus = false}) async {
|
||||||
|
if (_messages.isEmpty) {
|
||||||
_messages =
|
_messages =
|
||||||
await DbMessages.getAllMessagesForUser(widget.user.userId.toInt());
|
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(() {});
|
setState(() {});
|
||||||
|
|
||||||
if (updateOpenStatus) {
|
if (updateOpenStatus) {
|
||||||
|
|
@ -149,7 +168,6 @@ class _ChatItemDetailsViewState extends State<ChatItemDetailsView> {
|
||||||
String text = newMessageController.text;
|
String text = newMessageController.text;
|
||||||
if (text == "") return;
|
if (text == "") return;
|
||||||
await sendTextMessage(widget.user.userId, newMessageController.text);
|
await sendTextMessage(widget.user.userId, newMessageController.text);
|
||||||
_loadAsync();
|
|
||||||
newMessageController.clear();
|
newMessageController.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -162,10 +180,10 @@ class _ChatItemDetailsViewState extends State<ChatItemDetailsView> {
|
||||||
lastChangeCounter = changeCounter[widget.user.userId.toInt()]!;
|
lastChangeCounter = changeCounter[widget.user.userId.toInt()]!;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// messages = messages.reversed.toList();
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: Text('Your Chat with ${widget.user.displayName}'),
|
title: Text(AppLocalizations.of(context)!
|
||||||
|
.chatListDetailTitle(widget.user.displayName)),
|
||||||
),
|
),
|
||||||
body: Column(
|
body: Column(
|
||||||
children: [
|
children: [
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import 'package:twonly/src/model/contacts_model.dart';
|
||||||
import 'package:twonly/src/model/messages_model.dart';
|
import 'package:twonly/src/model/messages_model.dart';
|
||||||
import 'package:twonly/src/providers/api/api.dart';
|
import 'package:twonly/src/providers/api/api.dart';
|
||||||
import 'package:twonly/src/providers/contacts_change_provider.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/providers/messages_change_provider.dart';
|
||||||
import 'package:twonly/src/utils/misc.dart';
|
import 'package:twonly/src/utils/misc.dart';
|
||||||
import 'package:twonly/src/views/chat_item_details_view.dart';
|
import 'package:twonly/src/views/chat_item_details_view.dart';
|
||||||
|
|
@ -149,6 +150,14 @@ class _UserListItem extends State<UserListItem> {
|
||||||
.inSeconds;
|
.inSeconds;
|
||||||
|
|
||||||
MessageSendState state = widget.lastMessage.getSendState();
|
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(
|
return UserContextMenu(
|
||||||
user: widget.user,
|
user: widget.user,
|
||||||
|
|
@ -184,6 +193,7 @@ class _UserListItem extends State<UserListItem> {
|
||||||
),
|
),
|
||||||
leading: InitialsAvatar(displayName: widget.user.displayName),
|
leading: InitialsAvatar(displayName: widget.user.displayName),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
|
if (isDownloading) return;
|
||||||
if (!widget.lastMessage.isDownloaded) {
|
if (!widget.lastMessage.isDownloaded) {
|
||||||
List<int> token = widget.lastMessage.messageContent!.downloadToken!;
|
List<int> token = widget.lastMessage.messageContent!.downloadToken!;
|
||||||
tryDownloadMedia(token, force: true);
|
tryDownloadMedia(token, force: true);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue