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 {
|
class TalkSettings {
|
||||||
bool sortFavoritesToTop;
|
bool sortFavoritesToTop;
|
||||||
bool sortUnreadToTop;
|
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);
|
factory TalkSettings.fromJson(Map<String, dynamic> json) => _$TalkSettingsFromJson(json);
|
||||||
Map<String, dynamic> toJson() => _$TalkSettingsToJson(this);
|
Map<String, dynamic> toJson() => _$TalkSettingsToJson(this);
|
||||||
|
@ -9,10 +9,12 @@ part of 'talkSettings.dart';
|
|||||||
TalkSettings _$TalkSettingsFromJson(Map<String, dynamic> json) => TalkSettings(
|
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),
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$TalkSettingsToJson(TalkSettings instance) =>
|
Map<String, dynamic> _$TalkSettingsToJson(TalkSettings instance) =>
|
||||||
<String, dynamic>{
|
<String, dynamic>{
|
||||||
'sortFavoritesToTop': instance.sortFavoritesToTop,
|
'sortFavoritesToTop': instance.sortFavoritesToTop,
|
||||||
'sortUnreadToTop': instance.sortUnreadToTop,
|
'sortUnreadToTop': instance.sortUnreadToTop,
|
||||||
|
'drafts': instance.drafts,
|
||||||
};
|
};
|
||||||
|
@ -23,17 +23,16 @@ class ChatList extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _ChatListState extends State<ChatList> {
|
class _ChatListState extends State<ChatList> {
|
||||||
|
late SettingsProvider settings;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
|
settings = Provider.of<SettingsProvider>(context, listen: false);
|
||||||
|
|
||||||
|
|
||||||
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
|
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
|
||||||
_query();
|
_query();
|
||||||
|
|
||||||
SettingsProvider settings = Provider.of<SettingsProvider>(context, listen: false);
|
|
||||||
if(!settings.val().notificationSettings.enabled && !settings.val().notificationSettings.askUsageDismissed) {
|
if(!settings.val().notificationSettings.enabled && !settings.val().notificationSettings.askUsageDismissed) {
|
||||||
settings.val(write: true).notificationSettings.askUsageDismissed = true;
|
settings.val(write: true).notificationSettings.askUsageDismissed = true;
|
||||||
|
|
||||||
@ -116,9 +115,7 @@ class _ChatListState extends State<ChatList> {
|
|||||||
builder: (context, data, child) {
|
builder: (context, data, child) {
|
||||||
|
|
||||||
if(data.primaryLoading()) return const LoadingSpinner();
|
if(data.primaryLoading()) return const LoadingSpinner();
|
||||||
|
|
||||||
latestData = data;
|
latestData = data;
|
||||||
|
|
||||||
List<ChatTile> chats = [];
|
List<ChatTile> chats = [];
|
||||||
for (var chatRoom in data.getRoomsResponse.sortBy(
|
for (var chatRoom in data.getRoomsResponse.sortBy(
|
||||||
lastActivity: true,
|
lastActivity: true,
|
||||||
@ -126,7 +123,8 @@ class _ChatListState extends State<ChatList> {
|
|||||||
unreadToTop: Provider.of<SettingsProvider>(context).val().talkSettings.sortUnreadToTop,
|
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(
|
return RefreshIndicator(
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:loader_overlay/loader_overlay.dart';
|
import 'package:loader_overlay/loader_overlay.dart';
|
||||||
|
import 'package:marianum_mobile/storage/base/settingsProvider.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:uuid/uuid.dart';
|
import 'package:uuid/uuid.dart';
|
||||||
|
|
||||||
@ -23,6 +24,7 @@ class ChatTextfield extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _ChatTextfieldState extends State<ChatTextfield> {
|
class _ChatTextfieldState extends State<ChatTextfield> {
|
||||||
|
late SettingsProvider settings;
|
||||||
final TextEditingController _textBoxController = TextEditingController();
|
final TextEditingController _textBoxController = TextEditingController();
|
||||||
bool isLoading = false;
|
bool isLoading = false;
|
||||||
|
|
||||||
@ -58,6 +60,21 @@ class _ChatTextfieldState extends State<ChatTextfield> {
|
|||||||
), barrierDismissible: false);
|
), 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
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Stack(
|
return Stack(
|
||||||
@ -134,6 +151,9 @@ class _ChatTextfieldState extends State<ChatTextfield> {
|
|||||||
hintStyle: TextStyle(color: Theme.of(context).colorScheme.onSecondary),
|
hintStyle: TextStyle(color: Theme.of(context).colorScheme.onSecondary),
|
||||||
border: InputBorder.none,
|
border: InputBorder.none,
|
||||||
),
|
),
|
||||||
|
onChanged: (String text) {
|
||||||
|
setDraft(text);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(width: 15),
|
const SizedBox(width: 15),
|
||||||
@ -152,6 +172,7 @@ class _ChatTextfieldState extends State<ChatTextfield> {
|
|||||||
isLoading = false;
|
isLoading = false;
|
||||||
});
|
});
|
||||||
_textBoxController.text = "";
|
_textBoxController.text = "";
|
||||||
|
setDraft("");
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
backgroundColor: Theme.of(context).primaryColor,
|
backgroundColor: Theme.of(context).primaryColor,
|
||||||
|
@ -18,8 +18,9 @@ class ChatTile extends StatefulWidget {
|
|||||||
final GetRoomResponseObject data;
|
final GetRoomResponseObject data;
|
||||||
final void Function({bool renew}) query;
|
final void Function({bool renew}) query;
|
||||||
final bool disableContextActions;
|
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
|
@override
|
||||||
State<ChatTile> createState() => _ChatTileState();
|
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),
|
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(
|
trailing: Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
@ -27,6 +27,7 @@ class DefaultSettings {
|
|||||||
talkSettings: TalkSettings(
|
talkSettings: TalkSettings(
|
||||||
sortFavoritesToTop: true,
|
sortFavoritesToTop: true,
|
||||||
sortUnreadToTop: false,
|
sortUnreadToTop: false,
|
||||||
|
drafts: {},
|
||||||
),
|
),
|
||||||
fileSettings: FileSettings(
|
fileSettings: FileSettings(
|
||||||
sortFoldersToTop: true,
|
sortFoldersToTop: true,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user