From d264fc4504bb66b0190bb77c03e4e546e1accd57 Mon Sep 17 00:00:00 2001 From: zoe Date: Wed, 28 Sep 2022 00:00:12 +0200 Subject: [PATCH] add sorting for convos --- lib/business_logic/chat/chat.dart | 56 +++++++++++++++++++++++-------- lib/pages/chat/chat.dart | 19 +++++------ 2 files changed, 51 insertions(+), 24 deletions(-) diff --git a/lib/business_logic/chat/chat.dart b/lib/business_logic/chat/chat.dart index f3e7860..9c753ed 100644 --- a/lib/business_logic/chat/chat.dart +++ b/lib/business_logic/chat/chat.dart @@ -5,7 +5,7 @@ import 'package:loris/business_logic/timeline/timeline.dart'; import 'package:loris/global.dart' as global; import 'package:http/http.dart' as http; -class ConversationModel { +class ConversationModel implements Comparable { final String id; final List accounts; final bool unread; @@ -35,22 +35,29 @@ class ConversationModel { unread: json["unread"], lastStatus: PostModel.fromJson(json["last_status"], identity)); } + + @override + int compareTo(other) { + if (lastStatus == null && other.lastStatus == null) return 0; + ; + if (lastStatus == null) return -1; + return lastStatus!.createdAt.compareTo(other.lastStatus!.createdAt); + } } class ConversationModelResult { - // http status code - final int statusCode; - // list of models final List models; - ConversationModelResult(this.statusCode, this.models); + final Map maxIds; + + ConversationModelResult(this.models, {this.maxIds = const {}}); } /* loads conversation models from timeline */ -Future getConversationModels( +Future _getConversationModels( String identityName, String? maxId, ) async { @@ -73,14 +80,35 @@ Future getConversationModels( final result = await http.get(uri, headers: headers); if (result.statusCode != 200) { - return ConversationModelResult(result.statusCode, []); + return ConversationModelResult([]); } - return ConversationModelResult( - result.statusCode, - jsonDecode(result.body) - .map( - (e) => ConversationModel.fromJson(e, identityName), - ) - .toList()); + return ConversationModelResult(jsonDecode(result.body) + .map( + (e) => ConversationModel.fromJson(e, identityName), + ) + .toList()); +} + +Future getAllConversationModels( + Map maxIds) async { + List futureResults = []; + global.settings!.identities.forEach((key, value) { + futureResults.add(_getConversationModels(key, maxIds[key])); + }); + List models = []; + for (var element in futureResults) { + models.addAll((await element).models); + } + models.sort(); + models = models.reversed.toList().sublist(0, global.settings!.batchSize); + Map newMaxIds = {}; + for (var element in models) { + if (newMaxIds[element.identity] == null) { + newMaxIds.addAll({element.identity: element.id}); + } else if (element.id.compareTo(newMaxIds[element.identity]!) < 0) { + newMaxIds.addAll({element.identity: element.id}); + } + } + return ConversationModelResult(models, maxIds: newMaxIds); } diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 9bbfe70..60b08b5 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:localization/localization.dart'; import 'package:loris/business_logic/chat/chat.dart'; import 'package:loris/themes/themes.dart' as themes; import 'package:loris/global.dart' as global; @@ -15,16 +16,12 @@ class _ChatState extends State { // map that stores max ids for each identity Map maxIds = {}; - Future fetchForIdentity(String identityName) async { - final c = await getConversationModels(identityName, maxIds[identityName]); + Future updateConversations() async { + final models = await getAllConversationModels(maxIds); + print(models.maxIds); setState(() { - conversations.addAll(c.models); - }); - } - - void updateConversations() { - global.settings!.identities.forEach((key, value) { - fetchForIdentity(key); + conversations.addAll(models.models); + maxIds = models.maxIds; }); } @@ -80,7 +77,9 @@ class ConversationButton extends StatelessWidget { child: Column( children: [ Wrap( - children: [SelectableText(model.identity)], + children: [ + SelectableText("${"you-are".i18n()} ${model.identity}") + ], ) ], ),