diff --git a/lib/api/marianumcloud/talk/room/getRoomResponse.dart b/lib/api/marianumcloud/talk/room/getRoomResponse.dart index 1e23588..ec81722 100644 --- a/lib/api/marianumcloud/talk/room/getRoomResponse.dart +++ b/lib/api/marianumcloud/talk/room/getRoomResponse.dart @@ -14,12 +14,21 @@ class GetRoomResponse extends ApiResponse { factory GetRoomResponse.fromJson(Map json) => _$GetRoomResponseFromJson(json); Map toJson() => _$GetRoomResponseToJson(this); - List sortBy({bool lastActivity = true, bool favoritesToTop = false}) { - List 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 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); + }); } } diff --git a/lib/storage/base/settingsProvider.dart b/lib/storage/base/settingsProvider.dart index 0489d83..bedda8f 100644 --- a/lib/storage/base/settingsProvider.dart +++ b/lib/storage/base/settingsProvider.dart @@ -58,6 +58,7 @@ class SettingsProvider extends ChangeNotifier { ), talkSettings: TalkSettings( sortFavoritesToTop: true, + sortUnreadToTop: false, ), ); } diff --git a/lib/storage/talk/talkSettings.dart b/lib/storage/talk/talkSettings.dart index b7aece1..05bf729 100644 --- a/lib/storage/talk/talkSettings.dart +++ b/lib/storage/talk/talkSettings.dart @@ -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 json) => _$TalkSettingsFromJson(json); Map toJson() => _$TalkSettingsToJson(this); diff --git a/lib/storage/talk/talkSettings.g.dart b/lib/storage/talk/talkSettings.g.dart index 81cde06..33472f6 100644 --- a/lib/storage/talk/talkSettings.g.dart +++ b/lib/storage/talk/talkSettings.g.dart @@ -8,9 +8,11 @@ part of 'talkSettings.dart'; TalkSettings _$TalkSettingsFromJson(Map json) => TalkSettings( sortFavoritesToTop: json['sortFavoritesToTop'] as bool, + sortUnreadToTop: json['sortUnreadToTop'] as bool, ); Map _$TalkSettingsToJson(TalkSettings instance) => { 'sortFavoritesToTop': instance.sortFavoritesToTop, + 'sortUnreadToTop': instance.sortUnreadToTop, }; diff --git a/lib/view/pages/talk/chatList.dart b/lib/view/pages/talk/chatList.dart index 41f5252..df7a182 100644 --- a/lib/view/pages/talk/chatList.dart +++ b/lib/view/pages/talk/chatList.dart @@ -67,8 +67,10 @@ class _ChatListState extends State { List chats = []; for (var chatRoom in data.getRoomsResponse.sortBy( - lastActivity: true, - favoritesToTop: Provider.of(context).val().talkSettings.sortFavoritesToTop) + lastActivity: true, + favoritesToTop: Provider.of(context).val().talkSettings.sortFavoritesToTop, + unreadToTop: Provider.of(context).val().talkSettings.sortUnreadToTop, + ) ) { chats.add(ChatTile(data: chatRoom, query: _query)); } diff --git a/lib/view/settings/settings.dart b/lib/view/settings/settings.dart index bf80633..a27fabc 100644 --- a/lib/view/settings/settings.dart +++ b/lib/view/settings/settings.dart @@ -104,6 +104,19 @@ class _SettingsState extends State { ), ), + 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 { 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(() {