Added draft system for unsent messages

This commit is contained in:
Elias Müller 2023-09-09 17:48:02 +02:00
parent 7a411a34c9
commit 68bfe92849
6 changed files with 42 additions and 9 deletions

View File

@ -6,8 +6,9 @@ part 'talkSettings.g.dart';
class TalkSettings {
bool sortFavoritesToTop;
bool sortUnreadToTop;
Map<String, String> drafts;
TalkSettings({required this.sortFavoritesToTop, required this.sortUnreadToTop});
TalkSettings({required this.sortFavoritesToTop, required this.sortUnreadToTop, required this.drafts});
factory TalkSettings.fromJson(Map<String, dynamic> json) => _$TalkSettingsFromJson(json);
Map<String, dynamic> toJson() => _$TalkSettingsToJson(this);

View File

@ -9,10 +9,12 @@ part of 'talkSettings.dart';
TalkSettings _$TalkSettingsFromJson(Map<String, dynamic> json) => TalkSettings(
sortFavoritesToTop: json['sortFavoritesToTop'] as bool,
sortUnreadToTop: json['sortUnreadToTop'] as bool,
drafts: Map<String, String>.from(json['drafts'] as Map),
);
Map<String, dynamic> _$TalkSettingsToJson(TalkSettings instance) =>
<String, dynamic>{
'sortFavoritesToTop': instance.sortFavoritesToTop,
'sortUnreadToTop': instance.sortUnreadToTop,
'drafts': instance.drafts,
};

View File

@ -23,17 +23,16 @@ class ChatList extends StatefulWidget {
}
class _ChatListState extends State<ChatList> {
late SettingsProvider settings;
@override
void initState() {
super.initState();
settings = Provider.of<SettingsProvider>(context, listen: false);
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
_query();
SettingsProvider settings = Provider.of<SettingsProvider>(context, listen: false);
if(!settings.val().notificationSettings.enabled && !settings.val().notificationSettings.askUsageDismissed) {
settings.val(write: true).notificationSettings.askUsageDismissed = true;
@ -116,9 +115,7 @@ class _ChatListState extends State<ChatList> {
builder: (context, data, child) {
if(data.primaryLoading()) return const LoadingSpinner();
latestData = data;
List<ChatTile> chats = [];
for (var chatRoom in data.getRoomsResponse.sortBy(
lastActivity: true,
@ -126,7 +123,8 @@ class _ChatListState extends State<ChatList> {
unreadToTop: Provider.of<SettingsProvider>(context).val().talkSettings.sortUnreadToTop,
)
) {
chats.add(ChatTile(data: chatRoom, query: _query));
bool hasDraft = settings.val().talkSettings.drafts.containsKey(chatRoom.token);
chats.add(ChatTile(data: chatRoom, query: _query, hasDraft: hasDraft));
}
return RefreshIndicator(

View File

@ -2,6 +2,7 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:loader_overlay/loader_overlay.dart';
import 'package:marianum_mobile/storage/base/settingsProvider.dart';
import 'package:provider/provider.dart';
import 'package:uuid/uuid.dart';
@ -23,6 +24,7 @@ class ChatTextfield extends StatefulWidget {
}
class _ChatTextfieldState extends State<ChatTextfield> {
late SettingsProvider settings;
final TextEditingController _textBoxController = TextEditingController();
bool isLoading = false;
@ -58,6 +60,21 @@ class _ChatTextfieldState extends State<ChatTextfield> {
), barrierDismissible: false);
}
void setDraft(String text) {
if(text.isNotEmpty) {
settings.val(write: true).talkSettings.drafts[widget.sendToToken] = text;
} else {
settings.val(write: true).talkSettings.drafts.removeWhere((key, value) => key == widget.sendToToken);
}
}
@override
void initState() {
settings = Provider.of<SettingsProvider>(context, listen: false);
_textBoxController.text = settings.val().talkSettings.drafts[widget.sendToToken] ?? "";
super.initState();
}
@override
Widget build(BuildContext context) {
return Stack(
@ -134,6 +151,9 @@ class _ChatTextfieldState extends State<ChatTextfield> {
hintStyle: TextStyle(color: Theme.of(context).colorScheme.onSecondary),
border: InputBorder.none,
),
onChanged: (String text) {
setDraft(text);
},
),
),
const SizedBox(width: 15),
@ -152,6 +172,7 @@ class _ChatTextfieldState extends State<ChatTextfield> {
isLoading = false;
});
_textBoxController.text = "";
setDraft("");
});
},
backgroundColor: Theme.of(context).primaryColor,

View File

@ -18,8 +18,9 @@ class ChatTile extends StatefulWidget {
final GetRoomResponseObject data;
final void Function({bool renew}) query;
final bool disableContextActions;
final bool hasDraft;
const ChatTile({Key? key, required this.data, required this.query, this.disableContextActions = false}) : super(key: key);
const ChatTile({Key? key, required this.data, required this.query, this.disableContextActions = false, this.hasDraft = false}) : super(key: key);
@override
State<ChatTile> createState() => _ChatTileState();
@ -78,7 +79,16 @@ class _ChatTileState extends State<ChatTile> {
)
],
),
title: Text(widget.data.displayName),
title: Row(
mainAxisSize: MainAxisSize.min,
children: [
Text(widget.data.displayName),
if(widget.hasDraft) ...[
const SizedBox(width: 5),
const Icon(Icons.edit_outlined, size: 15),
],
],
),
subtitle: Text("${Jiffy.parseFromMillisecondsSinceEpoch(widget.data.lastMessage.timestamp * 1000).fromNow()}: ${RichObjectStringProcessor.parseToString(widget.data.lastMessage.message.replaceAll("\n", " "), widget.data.lastMessage.messageParameters)}", overflow: TextOverflow.ellipsis),
trailing: Row(
mainAxisSize: MainAxisSize.min,

View File

@ -27,6 +27,7 @@ class DefaultSettings {
talkSettings: TalkSettings(
sortFavoritesToTop: true,
sortUnreadToTop: false,
drafts: {},
),
fileSettings: FileSettings(
sortFoldersToTop: true,