From 68bfe92849e501603264626f10d7091420c47b41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sat, 9 Sep 2023 17:48:02 +0200 Subject: [PATCH] Added draft system for unsent messages --- lib/storage/talk/talkSettings.dart | 3 ++- lib/storage/talk/talkSettings.g.dart | 2 ++ lib/view/pages/talk/chatList.dart | 10 ++++------ lib/view/pages/talk/chatTextfield.dart | 21 +++++++++++++++++++++ lib/view/pages/talk/chatTile.dart | 14 ++++++++++++-- lib/view/settings/defaultSettings.dart | 1 + 6 files changed, 42 insertions(+), 9 deletions(-) diff --git a/lib/storage/talk/talkSettings.dart b/lib/storage/talk/talkSettings.dart index 05bf729..7f63d1b 100644 --- a/lib/storage/talk/talkSettings.dart +++ b/lib/storage/talk/talkSettings.dart @@ -6,8 +6,9 @@ part 'talkSettings.g.dart'; class TalkSettings { bool sortFavoritesToTop; bool sortUnreadToTop; + Map drafts; - TalkSettings({required this.sortFavoritesToTop, required this.sortUnreadToTop}); + TalkSettings({required this.sortFavoritesToTop, required this.sortUnreadToTop, required this.drafts}); factory TalkSettings.fromJson(Map json) => _$TalkSettingsFromJson(json); Map toJson() => _$TalkSettingsToJson(this); diff --git a/lib/storage/talk/talkSettings.g.dart b/lib/storage/talk/talkSettings.g.dart index 33472f6..83a356d 100644 --- a/lib/storage/talk/talkSettings.g.dart +++ b/lib/storage/talk/talkSettings.g.dart @@ -9,10 +9,12 @@ part of 'talkSettings.dart'; TalkSettings _$TalkSettingsFromJson(Map json) => TalkSettings( sortFavoritesToTop: json['sortFavoritesToTop'] as bool, sortUnreadToTop: json['sortUnreadToTop'] as bool, + drafts: Map.from(json['drafts'] as Map), ); Map _$TalkSettingsToJson(TalkSettings instance) => { 'sortFavoritesToTop': instance.sortFavoritesToTop, 'sortUnreadToTop': instance.sortUnreadToTop, + 'drafts': instance.drafts, }; diff --git a/lib/view/pages/talk/chatList.dart b/lib/view/pages/talk/chatList.dart index 89f5a49..473d0a6 100644 --- a/lib/view/pages/talk/chatList.dart +++ b/lib/view/pages/talk/chatList.dart @@ -23,17 +23,16 @@ class ChatList extends StatefulWidget { } class _ChatListState extends State { + late SettingsProvider settings; @override void initState() { super.initState(); - - + settings = Provider.of(context, listen: false); WidgetsBinding.instance.addPostFrameCallback((timeStamp) { _query(); - SettingsProvider settings = Provider.of(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 { builder: (context, data, child) { if(data.primaryLoading()) return const LoadingSpinner(); - latestData = data; - List chats = []; for (var chatRoom in data.getRoomsResponse.sortBy( lastActivity: true, @@ -126,7 +123,8 @@ class _ChatListState extends State { unreadToTop: Provider.of(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( diff --git a/lib/view/pages/talk/chatTextfield.dart b/lib/view/pages/talk/chatTextfield.dart index 8ef04fa..ca7e5a8 100644 --- a/lib/view/pages/talk/chatTextfield.dart +++ b/lib/view/pages/talk/chatTextfield.dart @@ -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 { + late SettingsProvider settings; final TextEditingController _textBoxController = TextEditingController(); bool isLoading = false; @@ -58,6 +60,21 @@ class _ChatTextfieldState extends State { ), 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(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 { 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 { isLoading = false; }); _textBoxController.text = ""; + setDraft(""); }); }, backgroundColor: Theme.of(context).primaryColor, diff --git a/lib/view/pages/talk/chatTile.dart b/lib/view/pages/talk/chatTile.dart index 3037d3d..afc8de5 100644 --- a/lib/view/pages/talk/chatTile.dart +++ b/lib/view/pages/talk/chatTile.dart @@ -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 createState() => _ChatTileState(); @@ -78,7 +79,16 @@ class _ChatTileState extends State { ) ], ), - 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, diff --git a/lib/view/settings/defaultSettings.dart b/lib/view/settings/defaultSettings.dart index 1c6bc88..04c0324 100644 --- a/lib/view/settings/defaultSettings.dart +++ b/lib/view/settings/defaultSettings.dart @@ -27,6 +27,7 @@ class DefaultSettings { talkSettings: TalkSettings( sortFavoritesToTop: true, sortUnreadToTop: false, + drafts: {}, ), fileSettings: FileSettings( sortFoldersToTop: true,