Added option to sort unread chats to top

This commit is contained in:
Elias Müller 2023-06-07 18:22:15 +02:00
parent b94a3d33e9
commit f8ac83a296
6 changed files with 36 additions and 9 deletions

View File

@ -14,12 +14,21 @@ class GetRoomResponse extends ApiResponse {
factory GetRoomResponse.fromJson(Map<String, dynamic> json) => _$GetRoomResponseFromJson(json);
Map<String, dynamic> toJson() => _$GetRoomResponseToJson(this);
List<GetRoomResponseObject> sortBy({bool lastActivity = true, bool favoritesToTop = false}) {
List<GetRoomResponseObject> sorted = data.toList();
if(lastActivity) sorted.sort((a, b) => -a.lastActivity.compareTo(b.lastActivity));
if(favoritesToTop) sorted.sort((a, b) => b.isFavorite ? 1 : -1);
List<GetRoomResponseObject> sortBy({bool lastActivity = true, required bool favoritesToTop, required bool unreadToTop}) {
return data.toList()..sort((a, b) {
return sorted;
// Unread messages
if(unreadToTop) {
int unreadStatus = b.unreadMessages.compareTo(a.unreadMessages);
if(unreadStatus != 0) return unreadStatus;
}
// Favorites
if(favoritesToTop) if(a.isFavorite) return -1;
// Activity
return b.lastActivity.compareTo(a.lastActivity);
});
}
}

View File

@ -58,6 +58,7 @@ class SettingsProvider extends ChangeNotifier {
),
talkSettings: TalkSettings(
sortFavoritesToTop: true,
sortUnreadToTop: false,
),
);
}

View File

@ -5,8 +5,9 @@ part 'talkSettings.g.dart';
@JsonSerializable()
class TalkSettings {
bool sortFavoritesToTop;
bool sortUnreadToTop;
TalkSettings({required this.sortFavoritesToTop});
TalkSettings({required this.sortFavoritesToTop, required this.sortUnreadToTop});
factory TalkSettings.fromJson(Map<String, dynamic> json) => _$TalkSettingsFromJson(json);
Map<String, dynamic> toJson() => _$TalkSettingsToJson(this);

View File

@ -8,9 +8,11 @@ part of 'talkSettings.dart';
TalkSettings _$TalkSettingsFromJson(Map<String, dynamic> json) => TalkSettings(
sortFavoritesToTop: json['sortFavoritesToTop'] as bool,
sortUnreadToTop: json['sortUnreadToTop'] as bool,
);
Map<String, dynamic> _$TalkSettingsToJson(TalkSettings instance) =>
<String, dynamic>{
'sortFavoritesToTop': instance.sortFavoritesToTop,
'sortUnreadToTop': instance.sortUnreadToTop,
};

View File

@ -67,8 +67,10 @@ class _ChatListState extends State<ChatList> {
List<ChatTile> chats = [];
for (var chatRoom in data.getRoomsResponse.sortBy(
lastActivity: true,
favoritesToTop: Provider.of<SettingsProvider>(context).val().talkSettings.sortFavoritesToTop)
lastActivity: true,
favoritesToTop: Provider.of<SettingsProvider>(context).val().talkSettings.sortFavoritesToTop,
unreadToTop: Provider.of<SettingsProvider>(context).val().talkSettings.sortUnreadToTop,
)
) {
chats.add(ChatTile(data: chatRoom, query: _query));
}

View File

@ -104,6 +104,19 @@ class _SettingsState extends State<Settings> {
),
),
ListTile(
leading: const Icon(Icons.mark_email_unread_outlined),
title: const Text("Ungelesene Chats nach oben sortieren"),
trailing: Checkbox(
value: settings.val().talkSettings.sortUnreadToTop,
onChanged: (e) {
setState(() {
settings.val(write: true).talkSettings.sortUnreadToTop = e!;
});
},
),
),
const Divider(),
ListTile(
@ -150,7 +163,6 @@ class _SettingsState extends State<Settings> {
leading: const Icon(Icons.developer_mode_outlined),
title: const Text("Entwickleransicht"),
trailing: Checkbox(
visualDensity: const VisualDensity(horizontal: VisualDensity.minimumDensity),
value: settings.val().devToolsEnabled,
onChanged: (state) {
changeView() => setState(() {