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 { class TalkSettings {
bool sortFavoritesToTop; bool sortFavoritesToTop;
bool sortUnreadToTop; 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); factory TalkSettings.fromJson(Map<String, dynamic> json) => _$TalkSettingsFromJson(json);
Map<String, dynamic> toJson() => _$TalkSettingsToJson(this); Map<String, dynamic> toJson() => _$TalkSettingsToJson(this);

View File

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

View File

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

View File

@ -2,6 +2,7 @@
import 'dart:io'; import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:loader_overlay/loader_overlay.dart'; import 'package:loader_overlay/loader_overlay.dart';
import 'package:marianum_mobile/storage/base/settingsProvider.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
@ -23,6 +24,7 @@ class ChatTextfield extends StatefulWidget {
} }
class _ChatTextfieldState extends State<ChatTextfield> { class _ChatTextfieldState extends State<ChatTextfield> {
late SettingsProvider settings;
final TextEditingController _textBoxController = TextEditingController(); final TextEditingController _textBoxController = TextEditingController();
bool isLoading = false; bool isLoading = false;
@ -58,6 +60,21 @@ class _ChatTextfieldState extends State<ChatTextfield> {
), barrierDismissible: false); ), 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Stack( return Stack(
@ -134,6 +151,9 @@ class _ChatTextfieldState extends State<ChatTextfield> {
hintStyle: TextStyle(color: Theme.of(context).colorScheme.onSecondary), hintStyle: TextStyle(color: Theme.of(context).colorScheme.onSecondary),
border: InputBorder.none, border: InputBorder.none,
), ),
onChanged: (String text) {
setDraft(text);
},
), ),
), ),
const SizedBox(width: 15), const SizedBox(width: 15),
@ -152,6 +172,7 @@ class _ChatTextfieldState extends State<ChatTextfield> {
isLoading = false; isLoading = false;
}); });
_textBoxController.text = ""; _textBoxController.text = "";
setDraft("");
}); });
}, },
backgroundColor: Theme.of(context).primaryColor, backgroundColor: Theme.of(context).primaryColor,

View File

@ -18,8 +18,9 @@ class ChatTile extends StatefulWidget {
final GetRoomResponseObject data; final GetRoomResponseObject data;
final void Function({bool renew}) query; final void Function({bool renew}) query;
final bool disableContextActions; 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 @override
State<ChatTile> createState() => _ChatTileState(); 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), 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( trailing: Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,

View File

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