From 0f84257ebad3589779d9ec56022a8f4b7467af57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Fri, 10 May 2024 22:27:24 +0200 Subject: [PATCH] saving message references in draft --- lib/model/chatList/chatProps.dart | 24 +++++++++++++++---- lib/storage/talk/talkSettings.dart | 3 ++- lib/storage/talk/talkSettings.g.dart | 2 ++ .../pages/talk/components/chatBubble.dart | 2 +- .../pages/talk/components/chatTextfield.dart | 16 ++++++------- lib/view/settings/defaultSettings.dart | 1 + 6 files changed, 34 insertions(+), 14 deletions(-) diff --git a/lib/model/chatList/chatProps.dart b/lib/model/chatList/chatProps.dart index 7f77107..80b1038 100644 --- a/lib/model/chatList/chatProps.dart +++ b/lib/model/chatList/chatProps.dart @@ -1,16 +1,23 @@ +import 'package:flutter/cupertino.dart'; +import 'package:provider/provider.dart'; + import '../../api/apiResponse.dart'; import '../../api/marianumcloud/talk/chat/getChatCache.dart'; import '../../api/marianumcloud/talk/chat/getChatResponse.dart'; +import '../../storage/base/settingsProvider.dart'; import '../dataHolder.dart'; class ChatProps extends DataHolder { String _queryToken = ''; DateTime _lastTokenSet = DateTime.now(); - int? referenceMessageId; + int? _referenceMessageId; GetChatResponse? _getChatResponse; GetChatResponse get getChatResponse => _getChatResponse!; + int? get getReferenceMessageId => _referenceMessageId; + set unsafeInternalSetReferenceMessageId(int? reference) => _referenceMessageId = reference; + @override List properties() => [_getChatResponse]; @@ -31,9 +38,18 @@ class ChatProps extends DataHolder { ); } - void setReferenceMessageId(int? messageId) { - referenceMessageId = messageId; - notifyListeners(); + void setReferenceMessageId(int? messageId, BuildContext context, String sendToToken) { + Future.microtask(() { + _referenceMessageId = messageId; + notifyListeners(); + + var settings = Provider.of(context, listen: false); + if(messageId != null) { + settings.val(write: true).talkSettings.draftReplies[sendToToken] = messageId; + } else { + settings.val(write: true).talkSettings.draftReplies.removeWhere((key, value) => key == sendToToken); + } + }); } void setQueryToken(String token) { diff --git a/lib/storage/talk/talkSettings.dart b/lib/storage/talk/talkSettings.dart index a0df6a2..7c3123a 100644 --- a/lib/storage/talk/talkSettings.dart +++ b/lib/storage/talk/talkSettings.dart @@ -7,8 +7,9 @@ class TalkSettings { bool sortFavoritesToTop; bool sortUnreadToTop; Map drafts; + Map draftReplies; - TalkSettings({required this.sortFavoritesToTop, required this.sortUnreadToTop, required this.drafts}); + TalkSettings({required this.sortFavoritesToTop, required this.sortUnreadToTop, required this.drafts, required this.draftReplies}); 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 83a356d..ad15998 100644 --- a/lib/storage/talk/talkSettings.g.dart +++ b/lib/storage/talk/talkSettings.g.dart @@ -10,6 +10,7 @@ TalkSettings _$TalkSettingsFromJson(Map json) => TalkSettings( sortFavoritesToTop: json['sortFavoritesToTop'] as bool, sortUnreadToTop: json['sortUnreadToTop'] as bool, drafts: Map.from(json['drafts'] as Map), + draftReplies: Map.from(json['draftReplies'] as Map), ); Map _$TalkSettingsToJson(TalkSettings instance) => @@ -17,4 +18,5 @@ Map _$TalkSettingsToJson(TalkSettings instance) => 'sortFavoritesToTop': instance.sortFavoritesToTop, 'sortUnreadToTop': instance.sortUnreadToTop, 'drafts': instance.drafts, + 'draftReplies': instance.draftReplies, }; diff --git a/lib/view/pages/talk/components/chatBubble.dart b/lib/view/pages/talk/components/chatBubble.dart index 85b6280..997185e 100644 --- a/lib/view/pages/talk/components/chatBubble.dart +++ b/lib/view/pages/talk/components/chatBubble.dart @@ -279,7 +279,7 @@ class _ChatBubbleState extends State with SingleTickerProviderStateM _position = const Offset(0, 0); }); if(widget.bubbleData.isReplyable) { - Provider.of(context, listen: false).setReferenceMessageId(widget.bubbleData.id); + Provider.of(context, listen: false).setReferenceMessageId(widget.bubbleData.id, context, widget.chatData.token); } }, onLongPress: showOptionsDialog, diff --git a/lib/view/pages/talk/components/chatTextfield.dart b/lib/view/pages/talk/components/chatTextfield.dart index 4916cd5..2da2f9a 100644 --- a/lib/view/pages/talk/components/chatTextfield.dart +++ b/lib/view/pages/talk/components/chatTextfield.dart @@ -1,6 +1,5 @@ import 'dart:io'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:nextcloud/nextcloud.dart'; import 'package:persistent_bottom_nav_bar_v2/persistent_bottom_nav_bar_v2.dart'; @@ -81,7 +80,8 @@ class _ChatTextfieldState extends State { void initState() { super.initState(); settings = Provider.of(context, listen: false); - Provider.of(context, listen: false).referenceMessageId = null; + Provider.of(context, listen: false).unsafeInternalSetReferenceMessageId = + settings.val().talkSettings.draftReplies[widget.sendToToken]; } @override @@ -99,8 +99,8 @@ class _ChatTextfieldState extends State { children: [ Consumer( builder: (context, data, child) { - if(data.referenceMessageId != null) { - var referenceMessage = data.getChatResponse.sortByTimestamp().where((element) => element.id == data.referenceMessageId).last; + if(data.getReferenceMessageId != null) { + var referenceMessage = data.getChatResponse.sortByTimestamp().where((element) => element.id == data.getReferenceMessageId).last; return Row( children: [ Expanded( @@ -111,7 +111,7 @@ class _ChatTextfieldState extends State { ), ), IconButton( - onPressed: () => data.setReferenceMessageId(null), + onPressed: () => data.setReferenceMessageId(null, context, widget.sendToToken), icon: const Icon(Icons.close_outlined), padding: const EdgeInsets.only(left: 0), ), @@ -194,7 +194,7 @@ class _ChatTextfieldState extends State { const SizedBox(width: 15), FloatingActionButton( mini: true, - onPressed: (){ + onPressed: () { if(_textBoxController.text.isEmpty) return; if(isLoading) return; @@ -203,7 +203,7 @@ class _ChatTextfieldState extends State { }); SendMessage(widget.sendToToken, SendMessageParams( _textBoxController.text, - replyTo: Provider.of(context, listen: false).referenceMessageId.toString() + replyTo: Provider.of(context, listen: false).getReferenceMessageId.toString() )).run().then((value) { _query(); setState(() { @@ -211,8 +211,8 @@ class _ChatTextfieldState extends State { }); _textBoxController.text = ''; setDraft(''); + Provider.of(context, listen: false).setReferenceMessageId(null, context, widget.sendToToken); }); - Provider.of(context, listen: false).referenceMessageId = null; }, backgroundColor: Theme.of(context).primaryColor, elevation: 5, diff --git a/lib/view/settings/defaultSettings.dart b/lib/view/settings/defaultSettings.dart index 20ce747..1ff2d77 100644 --- a/lib/view/settings/defaultSettings.dart +++ b/lib/view/settings/defaultSettings.dart @@ -29,6 +29,7 @@ class DefaultSettings { sortFavoritesToTop: true, sortUnreadToTop: false, drafts: {}, + draftReplies: {}, ), fileSettings: FileSettings( sortFoldersToTop: true,