develop-replyToMessages #67

Merged
Pupsi merged 11 commits from develop-replyToMessages into develop 2024-05-12 12:36:15 +00:00
6 changed files with 34 additions and 14 deletions
Showing only changes of commit 0f84257eba - Show all commits

View File

@ -1,16 +1,23 @@
import 'package:flutter/cupertino.dart';
import 'package:provider/provider.dart';
import '../../api/apiResponse.dart'; import '../../api/apiResponse.dart';
import '../../api/marianumcloud/talk/chat/getChatCache.dart'; import '../../api/marianumcloud/talk/chat/getChatCache.dart';
import '../../api/marianumcloud/talk/chat/getChatResponse.dart'; import '../../api/marianumcloud/talk/chat/getChatResponse.dart';
import '../../storage/base/settingsProvider.dart';
import '../dataHolder.dart'; import '../dataHolder.dart';
class ChatProps extends DataHolder { class ChatProps extends DataHolder {
String _queryToken = ''; String _queryToken = '';
DateTime _lastTokenSet = DateTime.now(); DateTime _lastTokenSet = DateTime.now();
int? referenceMessageId; int? _referenceMessageId;
GetChatResponse? _getChatResponse; GetChatResponse? _getChatResponse;
GetChatResponse get getChatResponse => _getChatResponse!; GetChatResponse get getChatResponse => _getChatResponse!;
int? get getReferenceMessageId => _referenceMessageId;
set unsafeInternalSetReferenceMessageId(int? reference) => _referenceMessageId = reference;
@override @override
List<ApiResponse?> properties() => [_getChatResponse]; List<ApiResponse?> properties() => [_getChatResponse];
@ -31,9 +38,18 @@ class ChatProps extends DataHolder {
); );
} }
void setReferenceMessageId(int? messageId) { void setReferenceMessageId(int? messageId, BuildContext context, String sendToToken) {
referenceMessageId = messageId; Future.microtask(() {
notifyListeners(); _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) { void setQueryToken(String token) {

View File

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

View File

@ -10,6 +10,7 @@ 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), drafts: Map<String, String>.from(json['drafts'] as Map),
draftReplies: Map<String, int>.from(json['draftReplies'] as Map),
); );
Map<String, dynamic> _$TalkSettingsToJson(TalkSettings instance) => Map<String, dynamic> _$TalkSettingsToJson(TalkSettings instance) =>
@ -17,4 +18,5 @@ Map<String, dynamic> _$TalkSettingsToJson(TalkSettings instance) =>
'sortFavoritesToTop': instance.sortFavoritesToTop, 'sortFavoritesToTop': instance.sortFavoritesToTop,
'sortUnreadToTop': instance.sortUnreadToTop, 'sortUnreadToTop': instance.sortUnreadToTop,
'drafts': instance.drafts, 'drafts': instance.drafts,
'draftReplies': instance.draftReplies,
}; };

View File

@ -279,7 +279,7 @@ class _ChatBubbleState extends State<ChatBubble> with SingleTickerProviderStateM
_position = const Offset(0, 0); _position = const Offset(0, 0);
}); });
if(widget.bubbleData.isReplyable) { 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, onLongPress: showOptionsDialog,

View File

@ -1,6 +1,5 @@
import 'dart:io'; import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:nextcloud/nextcloud.dart'; import 'package:nextcloud/nextcloud.dart';
import 'package:persistent_bottom_nav_bar_v2/persistent_bottom_nav_bar_v2.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() { void initState() {
super.initState(); super.initState();
settings = Provider.of<SettingsProvider>(context, listen: false); 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 @override
@ -99,8 +99,8 @@ class _ChatTextfieldState extends State<ChatTextfield> {
children: [ children: [
Consumer<ChatProps>( Consumer<ChatProps>(
builder: (context, data, child) { builder: (context, data, child) {
if(data.referenceMessageId != null) { if(data.getReferenceMessageId != null) {
var referenceMessage = data.getChatResponse.sortByTimestamp().where((element) => element.id == data.referenceMessageId).last; var referenceMessage = data.getChatResponse.sortByTimestamp().where((element) => element.id == data.getReferenceMessageId).last;
return Row( return Row(
children: [ children: [
Expanded( Expanded(
@ -111,7 +111,7 @@ class _ChatTextfieldState extends State<ChatTextfield> {
), ),
), ),
IconButton( IconButton(
onPressed: () => data.setReferenceMessageId(null), onPressed: () => data.setReferenceMessageId(null, context, widget.sendToToken),
icon: const Icon(Icons.close_outlined), icon: const Icon(Icons.close_outlined),
padding: const EdgeInsets.only(left: 0), padding: const EdgeInsets.only(left: 0),
), ),
@ -194,7 +194,7 @@ class _ChatTextfieldState extends State<ChatTextfield> {
const SizedBox(width: 15), const SizedBox(width: 15),
FloatingActionButton( FloatingActionButton(
mini: true, mini: true,
onPressed: (){ onPressed: () {
if(_textBoxController.text.isEmpty) return; if(_textBoxController.text.isEmpty) return;
if(isLoading) return; if(isLoading) return;
@ -203,7 +203,7 @@ class _ChatTextfieldState extends State<ChatTextfield> {
}); });
SendMessage(widget.sendToToken, SendMessageParams( SendMessage(widget.sendToToken, SendMessageParams(
_textBoxController.text, _textBoxController.text,
replyTo: Provider.of<ChatProps>(context, listen: false).referenceMessageId.toString() replyTo: Provider.of<ChatProps>(context, listen: false).getReferenceMessageId.toString()
)).run().then((value) { )).run().then((value) {
_query(); _query();
setState(() { setState(() {
@ -211,8 +211,8 @@ class _ChatTextfieldState extends State<ChatTextfield> {
}); });
_textBoxController.text = ''; _textBoxController.text = '';
setDraft(''); 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, backgroundColor: Theme.of(context).primaryColor,
elevation: 5, elevation: 5,

View File

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