Skip to content

Commit 84604e0

Browse files
committed
channel: Add ChannelStore.compareChannelFolders
It'll be useful to have this encapsulated for when we implement the UI (#1765).
1 parent 3ff64be commit 84604e0

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

lib/model/channel.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,23 @@ mixin ChannelStore on UserStore {
6363
// ignore: valid_regexps
6464
static final _startsWithEmojiRegex = RegExp(r'^\p{Emoji}', unicode: true);
6565

66+
/// A compare function for [ChannelFolder]s, using [ChannelFolder.order].
67+
///
68+
/// Channels without [ChannelFolder.order] will come first,
69+
/// sorted alphabetically.
70+
// TODO(server-11) Once [ChannelFolder.order] is required,
71+
// remove alphabetical sorting.
72+
static int compareChannelFolders(ChannelFolder a, ChannelFolder b) {
73+
final orderA = a.order;
74+
final orderB = b.order;
75+
return switch ((orderA, orderB)) {
76+
(null, null) => a.name.toLowerCase().compareTo(b.name.toLowerCase()),
77+
(null, int()) => -1,
78+
(int(), null) => 1,
79+
(int a, int b) => a.compareTo(b),
80+
};
81+
}
82+
6683
/// The visibility policy that the self-user has for the given topic.
6784
///
6885
/// This does not incorporate the user's channel-level policy,

test/model/channel_test.dart

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:checks/checks.dart';
2+
import 'package:collection/collection.dart';
23
import 'package:test/scaffolding.dart';
34
import 'package:zulip/api/model/events.dart';
45
import 'package:zulip/api/model/initial_snapshot.dart';
@@ -91,6 +92,21 @@ void main() {
9192
});
9293
});
9394

95+
group('channelFolderComparator', () {
96+
final folder1 = eg.channelFolder(id: 1, order: null, name: 'M');
97+
final folder2 = eg.channelFolder(id: 2, order: null, name: 'n');
98+
final folder3 = eg.channelFolder(id: 3, order: 2, name: 'a');
99+
final folder4 = eg.channelFolder(id: 4, order: 0, name: 'b');
100+
final folder5 = eg.channelFolder(id: 5, order: 1, name: 'c');
101+
102+
final store = eg.store(initialSnapshot: eg.initialSnapshot(
103+
channelFolders: [folder1, folder2, folder3, folder4, folder5]));
104+
105+
final sorted = store.channelFolders.values.toList()
106+
.sorted(ChannelStore.compareChannelFolders);
107+
check(sorted).deepEquals([folder1, folder2, folder4, folder5, folder3]);
108+
});
109+
94110
group('SubscriptionEvent', () {
95111
final stream = eg.stream();
96112

0 commit comments

Comments
 (0)