Skip to content

Commit 9a04993

Browse files
committed
narrow: Add starred messages narrow.
"Starred messages narrow" is the user facing name of the narrow, thus we name the Narrow class after it. This narrow is pretty similar to MentionsNarrow. Signed-off-by: Zixuan James Li <[email protected]>
1 parent 1c7367a commit 9a04993

16 files changed

+137
-8
lines changed

assets/l10n/app_en.arb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,10 @@
480480
"@mentionsPageTitle": {
481481
"description": "Title for the page of @-mentions."
482482
},
483+
"starredMessagesPageTitle": "Starred messages",
484+
"@starredMessagesPageTitle": {
485+
"description": "Title for the page of starred messages."
486+
},
483487
"notifGroupDmConversationLabel": "{senderFullName} to you and {numOthers, plural, =1{1 other} other{{numOthers} others}}",
484488
"@notifGroupDmConversationLabel": {
485489
"description": "Label for a group DM conversation notification.",

lib/model/autocomplete.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,7 @@ class MentionAutocompleteView extends ChangeNotifier {
223223
break;
224224
case CombinedFeedNarrow():
225225
case MentionsNarrow():
226+
case StarredMessagesNarrow():
226227
assert(false, 'No compose box, thus no autocomplete is available in ${narrow.runtimeType}.');
227228
}
228229
return (userA, userB) => _compareByRelevance(userA, userB,

lib/model/message_list.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,7 @@ class MessageListView with ChangeNotifier, _MessageSequence {
385385
case TopicNarrow():
386386
case DmNarrow():
387387
case MentionsNarrow():
388+
case StarredMessagesNarrow():
388389
return true;
389390
}
390391
}
@@ -401,6 +402,7 @@ class MessageListView with ChangeNotifier, _MessageSequence {
401402
case TopicNarrow():
402403
case DmNarrow():
403404
case MentionsNarrow():
405+
case StarredMessagesNarrow():
404406
return true;
405407
}
406408
}
@@ -562,6 +564,7 @@ class MessageListView with ChangeNotifier, _MessageSequence {
562564

563565
case CombinedFeedNarrow():
564566
case MentionsNarrow():
567+
case StarredMessagesNarrow():
565568
// The messages were and remain in this narrow.
566569
// TODO(#421): … except they may have become muted or not.
567570
// We'll handle that at the same time as we handle muting itself changing.

lib/model/narrow.dart

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,3 +321,25 @@ class MentionsNarrow extends Narrow {
321321
@override
322322
int get hashCode => 'MentionsNarrow'.hashCode;
323323
}
324+
325+
class StarredMessagesNarrow extends Narrow {
326+
const StarredMessagesNarrow();
327+
328+
@override
329+
ApiNarrow apiEncode() => [ApiNarrowIs(IsOperand.starred)];
330+
331+
@override
332+
bool containsMessage(Message message) {
333+
return message.flags.contains(MessageFlag.starred);
334+
}
335+
336+
@override
337+
bool operator ==(Object other) {
338+
if (other is! StarredMessagesNarrow) return false;
339+
// Conceptually there's only one value of this type.
340+
return true;
341+
}
342+
343+
@override
344+
int get hashCode => 'StarredMessagesNarrow'.hashCode;
345+
}

lib/model/unreads.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,9 @@ class Unreads extends ChangeNotifier {
195195

196196
int countInMentionsNarrow() => mentions.length;
197197

198+
// TODO: Implement unreads handling.
199+
int countInStarredMessagesNarrow() => 0;
200+
198201
int countInNarrow(Narrow narrow) {
199202
switch (narrow) {
200203
case CombinedFeedNarrow():
@@ -207,6 +210,8 @@ class Unreads extends ChangeNotifier {
207210
return countInDmNarrow(narrow);
208211
case MentionsNarrow():
209212
return countInMentionsNarrow();
213+
case StarredMessagesNarrow():
214+
return countInStarredMessagesNarrow();
210215
}
211216
}
212217

lib/widgets/actions.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,5 +141,8 @@ Future<void> _legacyMarkNarrowAsRead(BuildContext context, Narrow narrow) async
141141
messages: unreadMentions,
142142
op: UpdateMessageFlagsOp.add,
143143
flag: MessageFlag.read);
144+
case StarredMessagesNarrow():
145+
// TODO: Implement unreads handling.
146+
return;
144147
}
145148
}

lib/widgets/compose_box.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1072,6 +1072,7 @@ class ComposeBox extends StatelessWidget {
10721072

10731073
case CombinedFeedNarrow():
10741074
case MentionsNarrow():
1075+
case StarredMessagesNarrow():
10751076
return false;
10761077
}
10771078
}
@@ -1088,6 +1089,7 @@ class ComposeBox extends StatelessWidget {
10881089
return _FixedDestinationComposeBox(key: controllerKey, narrow: narrow);
10891090
case CombinedFeedNarrow():
10901091
case MentionsNarrow():
1092+
case StarredMessagesNarrow():
10911093
return const SizedBox.shrink();
10921094
}
10931095
}

lib/widgets/message_list.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ class _MessageListPageState extends State<MessageListPage> implements MessageLis
249249
switch(narrow) {
250250
case CombinedFeedNarrow():
251251
case MentionsNarrow():
252+
case StarredMessagesNarrow():
252253
appBarBackgroundColor = null; // i.e., inherit
253254

254255
case ChannelNarrow(:final streamId):
@@ -338,6 +339,9 @@ class MessageListAppBarTitle extends StatelessWidget {
338339
case MentionsNarrow():
339340
return Text(zulipLocalizations.mentionsPageTitle);
340341

342+
case StarredMessagesNarrow():
343+
return Text(zulipLocalizations.starredMessagesPageTitle);
344+
341345
case ChannelNarrow(:var streamId):
342346
final store = PerAccountStoreWidget.of(context);
343347
final stream = store.streams[streamId];
@@ -835,6 +839,7 @@ class RecipientHeader extends StatelessWidget {
835839
switch (narrow) {
836840
case CombinedFeedNarrow():
837841
case MentionsNarrow():
842+
case StarredMessagesNarrow():
838843
return true;
839844

840845
case ChannelNarrow():

test/api/route/messages_test.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,9 @@ void main() {
191191
checkNarrow(const MentionsNarrow().apiEncode(), jsonEncode([
192192
{'operator': 'is', 'operand': 'mentioned'},
193193
]));
194+
checkNarrow(const StarredMessagesNarrow().apiEncode(), jsonEncode([
195+
{'operator': 'is', 'operand': 'starred'},
196+
]));
194197

195198
checkNarrow([ApiNarrowDm([123, 234])], jsonEncode([
196199
{'operator': 'dm', 'operand': [123, 234]},

test/model/autocomplete_test.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -676,6 +676,13 @@ void main() {
676676
check(() => MentionAutocompleteView.init(store: store, narrow: narrow))
677677
.throws<AssertionError>();
678678
});
679+
680+
test('StarredMessagesNarrow gives error', () async {
681+
await prepare(users: [eg.user(), eg.user()], messages: []);
682+
const narrow = StarredMessagesNarrow();
683+
check(() => MentionAutocompleteView.init(store: store, narrow: narrow))
684+
.throws<AssertionError>();
685+
});
679686
});
680687

681688
test('final results end-to-end', () async {

0 commit comments

Comments
 (0)