Added draft system for unsent messages
This commit is contained in:
parent
7a411a34c9
commit
68bfe92849
@ -6,8 +6,9 @@ part 'talkSettings.g.dart';
|
||||
class TalkSettings {
|
||||
bool sortFavoritesToTop;
|
||||
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);
|
||||
Map<String, dynamic> toJson() => _$TalkSettingsToJson(this);
|
||||
|
@ -9,10 +9,12 @@ part of 'talkSettings.dart';
|
||||
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),
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$TalkSettingsToJson(TalkSettings instance) =>
|
||||
<String, dynamic>{
|
||||
'sortFavoritesToTop': instance.sortFavoritesToTop,
|
||||
'sortUnreadToTop': instance.sortUnreadToTop,
|
||||
'drafts': instance.drafts,
|
||||
};
|
||||
|
@ -23,17 +23,16 @@ class ChatList extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _ChatListState extends State<ChatList> {
|
||||
late SettingsProvider settings;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
||||
|
||||
settings = Provider.of<SettingsProvider>(context, listen: false);
|
||||
|
||||
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
|
||||
_query();
|
||||
|
||||
SettingsProvider settings = Provider.of<SettingsProvider>(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<ChatList> {
|
||||
builder: (context, data, child) {
|
||||
|
||||
if(data.primaryLoading()) return const LoadingSpinner();
|
||||
|
||||
latestData = data;
|
||||
|
||||
List<ChatTile> chats = [];
|
||||
for (var chatRoom in data.getRoomsResponse.sortBy(
|
||||
lastActivity: true,
|
||||
@ -126,7 +123,8 @@ class _ChatListState extends State<ChatList> {
|
||||
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(
|
||||
|
@ -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<ChatTextfield> {
|
||||
late SettingsProvider settings;
|
||||
final TextEditingController _textBoxController = TextEditingController();
|
||||
bool isLoading = false;
|
||||
|
||||
@ -58,6 +60,21 @@ class _ChatTextfieldState extends State<ChatTextfield> {
|
||||
), 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
|
||||
Widget build(BuildContext context) {
|
||||
return Stack(
|
||||
@ -134,6 +151,9 @@ class _ChatTextfieldState extends State<ChatTextfield> {
|
||||
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<ChatTextfield> {
|
||||
isLoading = false;
|
||||
});
|
||||
_textBoxController.text = "";
|
||||
setDraft("");
|
||||
});
|
||||
},
|
||||
backgroundColor: Theme.of(context).primaryColor,
|
||||
|
@ -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<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),
|
||||
trailing: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
|
@ -27,6 +27,7 @@ class DefaultSettings {
|
||||
talkSettings: TalkSettings(
|
||||
sortFavoritesToTop: true,
|
||||
sortUnreadToTop: false,
|
||||
drafts: {},
|
||||
),
|
||||
fileSettings: FileSettings(
|
||||
sortFoldersToTop: true,
|
||||
|
Loading…
x
Reference in New Issue
Block a user