From c949bbc1c286775b991fb9a1044af089662745ec Mon Sep 17 00:00:00 2001 From: Nutcake Date: Sat, 6 May 2023 19:45:54 +0200 Subject: [PATCH] Make friend status auto-update when receiving message --- lib/clients/messaging_client.dart | 20 +++++++++++++++++++ lib/models/friend.dart | 14 +++++++++++++ lib/widgets/friends/friend_list_tile.dart | 1 - .../messages/message_audio_player.dart | 1 - .../messages/message_session_invite.dart | 1 - 5 files changed, 34 insertions(+), 3 deletions(-) diff --git a/lib/clients/messaging_client.dart b/lib/clients/messaging_client.dart index 72347b9..5d0384b 100644 --- a/lib/clients/messaging_client.dart +++ b/lib/clients/messaging_client.dart @@ -196,6 +196,25 @@ class MessagingClient extends ChangeNotifier { notifyListeners(); } + void _updateFriend(Friend friend) { + _friendsCache[friend.id] = friend; + final sIndex = _sortedFriendsCache.indexWhere((element) => element.id == friend.id); + if (sIndex == -1) { + _sortedFriendsCache.add(friend); + } else { + _sortedFriendsCache[sIndex] = friend; + } + _sortFriendsCache(); + } + + Future updateFriendStatus(String userId) async { + final friend = getAsFriend(userId); + if (friend == null) return; + final newStatus = await UserApi.getUserStatus(_apiClient, userId: userId); + _updateFriend(friend.copyWith(userStatus: newStatus)); + notifyListeners(); + } + MessageCache? getUserMessageCache(String userId) => _messageCache[userId]; static Future backgroundCheckUnreads(Map? inputData) async { @@ -325,6 +344,7 @@ class MessagingClient extends ChangeNotifier { cache.addMessage(message); if (message.senderId != selectedFriend?.id) { addUnread(message); + updateFriendStatus(message.senderId); } notifyListeners(); break; diff --git a/lib/models/friend.dart b/lib/models/friend.dart index 37c290a..a0e5a9b 100644 --- a/lib/models/friend.dart +++ b/lib/models/friend.dart @@ -28,6 +28,20 @@ class Friend extends Comparable { ); } + Friend copyWith({ + String? id, String? username, String? ownerId, UserStatus? userStatus, UserProfile? userProfile, + FriendStatus? friendStatus, DateTime? latestMessageTime}) { + return Friend( + id: id ?? this.id, + username: username ?? this.username, + ownerId: ownerId ?? this.ownerId, + userStatus: userStatus ?? this.userStatus, + userProfile: userProfile ?? this.userProfile, + friendStatus: friendStatus ?? this.friendStatus, + latestMessageTime: latestMessageTime ?? this.latestMessageTime, + ); + } + Map toMap({bool shallow=false}) { return { "id": id, diff --git a/lib/widgets/friends/friend_list_tile.dart b/lib/widgets/friends/friend_list_tile.dart index 0258224..32848ee 100644 --- a/lib/widgets/friends/friend_list_tile.dart +++ b/lib/widgets/friends/friend_list_tile.dart @@ -1,5 +1,4 @@ import 'package:contacts_plus_plus/auxiliary.dart'; -import 'package:contacts_plus_plus/client_holder.dart'; import 'package:contacts_plus_plus/clients/messaging_client.dart'; import 'package:contacts_plus_plus/models/friend.dart'; import 'package:contacts_plus_plus/models/message.dart'; diff --git a/lib/widgets/messages/message_audio_player.dart b/lib/widgets/messages/message_audio_player.dart index 2a4ed36..632e512 100644 --- a/lib/widgets/messages/message_audio_player.dart +++ b/lib/widgets/messages/message_audio_player.dart @@ -5,7 +5,6 @@ import 'package:contacts_plus_plus/client_holder.dart'; import 'package:contacts_plus_plus/auxiliary.dart'; import 'package:contacts_plus_plus/models/message.dart'; import 'package:contacts_plus_plus/widgets/messages/message_state_indicator.dart'; -import 'package:contacts_plus_plus/widgets/messages/messages_list.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:just_audio/just_audio.dart'; diff --git a/lib/widgets/messages/message_session_invite.dart b/lib/widgets/messages/message_session_invite.dart index cbfd3d5..a9dafdc 100644 --- a/lib/widgets/messages/message_session_invite.dart +++ b/lib/widgets/messages/message_session_invite.dart @@ -7,7 +7,6 @@ import 'package:contacts_plus_plus/models/session.dart'; import 'package:contacts_plus_plus/widgets/generic_avatar.dart'; import 'package:contacts_plus_plus/widgets/messages/messages_session_header.dart'; import 'package:contacts_plus_plus/widgets/messages/message_state_indicator.dart'; -import 'package:contacts_plus_plus/widgets/messages/messages_list.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart';