Skip to content

Commit 0266ff4

Browse files
committed
model: Add Unreads model, for tracking unread-message counts
1 parent 1fde1da commit 0266ff4

File tree

6 files changed

+1345
-2
lines changed

6 files changed

+1345
-2
lines changed

lib/api/model/initial_snapshot.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ class UnreadMessagesSnapshot {
234234

235235
final bool oldUnreadsMissing;
236236

237-
UnreadMessagesSnapshot({
237+
const UnreadMessagesSnapshot({
238238
required this.count,
239239
required this.dms,
240240
required this.streams,

lib/model/narrow.dart

+18
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11

2+
import '../api/model/events.dart';
23
import '../api/model/initial_snapshot.dart';
34
import '../api/model/model.dart';
45
import '../api/model/narrow.dart';
@@ -160,6 +161,23 @@ class DmNarrow extends Narrow implements SendableNarrow {
160161
);
161162
}
162163

164+
/// A [DmNarrow] from an [UnreadHuddleSnapshot].
165+
factory DmNarrow.ofUnreadHuddleSnapshot(UnreadHuddleSnapshot snapshot, {required int selfUserId}) {
166+
final userIds = snapshot.userIdsString.split(',').map((id) => int.parse(id));
167+
return DmNarrow(selfUserId: selfUserId,
168+
// (already sorted; see API doc)
169+
allRecipientIds: userIds.toList(growable: false));
170+
}
171+
172+
factory DmNarrow.ofUpdateMessageFlagsMessageDetail(
173+
UpdateMessageFlagsMessageDetail detail, {
174+
required int selfUserId,
175+
}) {
176+
assert(detail.type == MessageType.private);
177+
return DmNarrow(selfUserId: selfUserId,
178+
allRecipientIds: [...detail.userIds!, selfUserId]..sort());
179+
}
180+
163181
/// The user IDs of everyone in the conversation, sorted.
164182
///
165183
/// Each message in the conversation is sent by one of these users

lib/model/store.dart

+8-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import 'autocomplete.dart';
1717
import 'database.dart';
1818
import 'message_list.dart';
1919
import 'recent_dm_conversations.dart';
20+
import 'unreads.dart';
2021

2122
export 'package:drift/drift.dart' show Value;
2223
export 'database.dart' show Account, AccountsCompanion;
@@ -154,6 +155,7 @@ class PerAccountStore extends ChangeNotifier {
154155
realmDefaultExternalAccounts = initialSnapshot.realmDefaultExternalAccounts,
155156
customProfileFields = _sortCustomProfileFields(initialSnapshot.customProfileFields),
156157
userSettings = initialSnapshot.userSettings,
158+
unreads = Unreads(initial: initialSnapshot.unreadMsgs, selfUserId: account.userId),
157159
users = Map.fromEntries(
158160
initialSnapshot.realmUsers
159161
.followedBy(initialSnapshot.realmNonActiveUsers)
@@ -181,6 +183,7 @@ class PerAccountStore extends ChangeNotifier {
181183

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

185188
// Users and data about them.
186189
final Map<int, User> users;
@@ -306,19 +309,23 @@ class PerAccountStore extends ChangeNotifier {
306309
for (final view in _messageListViews) {
307310
view.maybeAddMessage(event.message);
308311
}
312+
unreads.handleMessageEvent(event);
309313
} else if (event is UpdateMessageEvent) {
310314
assert(debugLog("server event: update_message ${event.messageId}"));
311315
for (final view in _messageListViews) {
312316
view.maybeUpdateMessage(event);
313317
}
318+
unreads.handleUpdateMessageEvent(event);
314319
} else if (event is DeleteMessageEvent) {
315320
assert(debugLog("server event: delete_message ${event.messageIds}"));
316-
// TODO handle
321+
// TODO handle in message lists
322+
unreads.handleDeleteMessageEvent(event);
317323
} else if (event is UpdateMessageFlagsEvent) {
318324
assert(debugLog("server event: update_message_flags/${event.op} ${event.flag.toJson()}"));
319325
for (final view in _messageListViews) {
320326
view.maybeUpdateMessageFlags(event);
321327
}
328+
unreads.handleUpdateMessageFlagsEvent(event);
322329
} else if (event is ReactionEvent) {
323330
assert(debugLog("server event: reaction/${event.op}"));
324331
for (final view in _messageListViews) {

0 commit comments

Comments
 (0)