Skip to content

Commit

Permalink
model: Add Unreads model, for tracking unread-message counts
Browse files Browse the repository at this point in the history
  • Loading branch information
chrisbobbe committed Oct 23, 2023
1 parent 1fde1da commit 0266ff4
Show file tree
Hide file tree
Showing 6 changed files with 1,345 additions and 2 deletions.
2 changes: 1 addition & 1 deletion lib/api/model/initial_snapshot.dart
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ class UnreadMessagesSnapshot {

final bool oldUnreadsMissing;

UnreadMessagesSnapshot({
const UnreadMessagesSnapshot({
required this.count,
required this.dms,
required this.streams,
Expand Down
18 changes: 18 additions & 0 deletions lib/model/narrow.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@

import '../api/model/events.dart';
import '../api/model/initial_snapshot.dart';
import '../api/model/model.dart';
import '../api/model/narrow.dart';
Expand Down Expand Up @@ -160,6 +161,23 @@ class DmNarrow extends Narrow implements SendableNarrow {
);
}

/// A [DmNarrow] from an [UnreadHuddleSnapshot].
factory DmNarrow.ofUnreadHuddleSnapshot(UnreadHuddleSnapshot snapshot, {required int selfUserId}) {
final userIds = snapshot.userIdsString.split(',').map((id) => int.parse(id));
return DmNarrow(selfUserId: selfUserId,
// (already sorted; see API doc)
allRecipientIds: userIds.toList(growable: false));
}

factory DmNarrow.ofUpdateMessageFlagsMessageDetail(
UpdateMessageFlagsMessageDetail detail, {
required int selfUserId,
}) {
assert(detail.type == MessageType.private);
return DmNarrow(selfUserId: selfUserId,
allRecipientIds: [...detail.userIds!, selfUserId]..sort());
}

/// The user IDs of everyone in the conversation, sorted.
///
/// Each message in the conversation is sent by one of these users
Expand Down
9 changes: 8 additions & 1 deletion lib/model/store.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import 'autocomplete.dart';
import 'database.dart';
import 'message_list.dart';
import 'recent_dm_conversations.dart';
import 'unreads.dart';

export 'package:drift/drift.dart' show Value;
export 'database.dart' show Account, AccountsCompanion;
Expand Down Expand Up @@ -154,6 +155,7 @@ class PerAccountStore extends ChangeNotifier {
realmDefaultExternalAccounts = initialSnapshot.realmDefaultExternalAccounts,
customProfileFields = _sortCustomProfileFields(initialSnapshot.customProfileFields),
userSettings = initialSnapshot.userSettings,
unreads = Unreads(initial: initialSnapshot.unreadMsgs, selfUserId: account.userId),
users = Map.fromEntries(
initialSnapshot.realmUsers
.followedBy(initialSnapshot.realmNonActiveUsers)
Expand Down Expand Up @@ -181,6 +183,7 @@ class PerAccountStore extends ChangeNotifier {

// Data attached to the self-account on the realm.
final UserSettings? userSettings; // TODO(server-5)
final Unreads unreads;

// Users and data about them.
final Map<int, User> users;
Expand Down Expand Up @@ -306,19 +309,23 @@ class PerAccountStore extends ChangeNotifier {
for (final view in _messageListViews) {
view.maybeAddMessage(event.message);
}
unreads.handleMessageEvent(event);
} else if (event is UpdateMessageEvent) {
assert(debugLog("server event: update_message ${event.messageId}"));
for (final view in _messageListViews) {
view.maybeUpdateMessage(event);
}
unreads.handleUpdateMessageEvent(event);
} else if (event is DeleteMessageEvent) {
assert(debugLog("server event: delete_message ${event.messageIds}"));
// TODO handle
// TODO handle in message lists
unreads.handleDeleteMessageEvent(event);
} else if (event is UpdateMessageFlagsEvent) {
assert(debugLog("server event: update_message_flags/${event.op} ${event.flag.toJson()}"));
for (final view in _messageListViews) {
view.maybeUpdateMessageFlags(event);
}
unreads.handleUpdateMessageFlagsEvent(event);
} else if (event is ReactionEvent) {
assert(debugLog("server event: reaction/${event.op}"));
for (final view in _messageListViews) {
Expand Down
Loading

0 comments on commit 0266ff4

Please sign in to comment.