saving message references in draft
This commit is contained in:
		| @@ -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<ApiResponse?> properties() => [_getChatResponse]; | ||||
|  | ||||
| @@ -31,9 +38,18 @@ class ChatProps extends DataHolder { | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   void setReferenceMessageId(int? messageId) { | ||||
|     referenceMessageId = messageId; | ||||
|   void setReferenceMessageId(int? messageId, BuildContext context, String sendToToken) { | ||||
|     Future.microtask(() { | ||||
|       _referenceMessageId = messageId; | ||||
|       notifyListeners(); | ||||
|  | ||||
|       var settings = Provider.of<SettingsProvider>(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) { | ||||
|   | ||||
| @@ -7,8 +7,9 @@ class TalkSettings { | ||||
|   bool sortFavoritesToTop; | ||||
|   bool sortUnreadToTop; | ||||
|   Map<String, String> drafts; | ||||
|   Map<String, int> 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<String, dynamic> json) => _$TalkSettingsFromJson(json); | ||||
|   Map<String, dynamic> toJson() => _$TalkSettingsToJson(this); | ||||
|   | ||||
| @@ -10,6 +10,7 @@ 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), | ||||
|       draftReplies: Map<String, int>.from(json['draftReplies'] as Map), | ||||
|     ); | ||||
|  | ||||
| Map<String, dynamic> _$TalkSettingsToJson(TalkSettings instance) => | ||||
| @@ -17,4 +18,5 @@ Map<String, dynamic> _$TalkSettingsToJson(TalkSettings instance) => | ||||
|       'sortFavoritesToTop': instance.sortFavoritesToTop, | ||||
|       'sortUnreadToTop': instance.sortUnreadToTop, | ||||
|       'drafts': instance.drafts, | ||||
|       'draftReplies': instance.draftReplies, | ||||
|     }; | ||||
|   | ||||
| @@ -279,7 +279,7 @@ class _ChatBubbleState extends State<ChatBubble> with SingleTickerProviderStateM | ||||
|               _position = const Offset(0, 0); | ||||
|             }); | ||||
|             if(widget.bubbleData.isReplyable) { | ||||
|               Provider.of<ChatProps>(context, listen: false).setReferenceMessageId(widget.bubbleData.id); | ||||
|               Provider.of<ChatProps>(context, listen: false).setReferenceMessageId(widget.bubbleData.id, context, widget.chatData.token); | ||||
|             } | ||||
|           }, | ||||
|           onLongPress: showOptionsDialog, | ||||
|   | ||||
| @@ -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<ChatTextfield> { | ||||
|   void initState() { | ||||
|     super.initState(); | ||||
|     settings = Provider.of<SettingsProvider>(context, listen: false); | ||||
|     Provider.of<ChatProps>(context, listen: false).referenceMessageId = null; | ||||
|     Provider.of<ChatProps>(context, listen: false).unsafeInternalSetReferenceMessageId = | ||||
|         settings.val().talkSettings.draftReplies[widget.sendToToken]; | ||||
|   } | ||||
|  | ||||
|   @override | ||||
| @@ -99,8 +99,8 @@ class _ChatTextfieldState extends State<ChatTextfield> { | ||||
|               children: [ | ||||
|                 Consumer<ChatProps>( | ||||
|                   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<ChatTextfield> { | ||||
|                             ), | ||||
|                           ), | ||||
|                           IconButton( | ||||
|                             onPressed: () => data.setReferenceMessageId(null), | ||||
|                             onPressed: () => data.setReferenceMessageId(null, context, widget.sendToToken), | ||||
|                             icon: const Icon(Icons.close_outlined), | ||||
|                             padding: const EdgeInsets.only(left: 0), | ||||
|                           ), | ||||
| @@ -203,7 +203,7 @@ class _ChatTextfieldState extends State<ChatTextfield> { | ||||
|                         }); | ||||
|                         SendMessage(widget.sendToToken, SendMessageParams( | ||||
|                             _textBoxController.text, | ||||
|                             replyTo: Provider.of<ChatProps>(context, listen: false).referenceMessageId.toString() | ||||
|                             replyTo: Provider.of<ChatProps>(context, listen: false).getReferenceMessageId.toString() | ||||
|                         )).run().then((value) { | ||||
|                           _query(); | ||||
|                           setState(() { | ||||
| @@ -211,8 +211,8 @@ class _ChatTextfieldState extends State<ChatTextfield> { | ||||
|                           }); | ||||
|                           _textBoxController.text = ''; | ||||
|                           setDraft(''); | ||||
|                           Provider.of<ChatProps>(context, listen: false).setReferenceMessageId(null, context, widget.sendToToken); | ||||
|                         }); | ||||
|                         Provider.of<ChatProps>(context, listen: false).referenceMessageId = null; | ||||
|                       }, | ||||
|                       backgroundColor: Theme.of(context).primaryColor, | ||||
|                       elevation: 5, | ||||
|   | ||||
| @@ -29,6 +29,7 @@ class DefaultSettings { | ||||
|         sortFavoritesToTop: true, | ||||
|         sortUnreadToTop: false, | ||||
|         drafts: {}, | ||||
|         draftReplies: {}, | ||||
|       ), | ||||
|       fileSettings: FileSettings( | ||||
|           sortFoldersToTop: true, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user