Skip to content

Commit 33924e6

Browse files
committed
channel: Ensure SubscriptionRemoveEvent updates all collections
1 parent be92ef5 commit 33924e6

File tree

3 files changed

+32
-0
lines changed

3 files changed

+32
-0
lines changed

lib/api/model/model.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,24 @@ class Subscription extends ZulipStream {
495495

496496
@override
497497
Map<String, dynamic> toJson() => _$SubscriptionToJson(this);
498+
499+
/// Returns a plain `ZulipStream` with same values as `this`
500+
///
501+
/// This is helpful when unsubscribing from a stream.
502+
ZulipStream toStream() => ZulipStream(
503+
streamId: streamId,
504+
name: name,
505+
description: description,
506+
renderedDescription: renderedDescription,
507+
dateCreated: dateCreated,
508+
firstMessageId: firstMessageId,
509+
inviteOnly: inviteOnly,
510+
isWebPublic: isWebPublic,
511+
historyPublicToSubscribers: historyPublicToSubscribers,
512+
messageRetentionDays: messageRetentionDays,
513+
channelPostPolicy: channelPostPolicy,
514+
canRemoveSubscribersGroup: canRemoveSubscribersGroup,
515+
streamWeeklyTraffic: streamWeeklyTraffic);
498516
}
499517

500518
@JsonEnum(fieldRename: FieldRename.snake, valueField: "apiValue")

lib/model/channel.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,9 @@ class ChannelStoreImpl with ChannelStore {
310310
}
311311
assert(streamsByName[subscription.name] is Subscription);
312312
assert(subscriptions.containsKey(streamId));
313+
final unsubscribedStream = subscription.toStream();
314+
streams[streamId] = unsubscribedStream;
315+
streamsByName[subscription.name] = unsubscribedStream;
313316
subscriptions.remove(streamId);
314317
}
315318

test/model/channel_test.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,17 @@ void main() {
114114
value: false));
115115
check(store.subscriptions[stream.streamId]!.isMuted).isTrue();
116116
});
117+
118+
test('SubscriptionRemoveEvent updates streams and streamsByName', () async {
119+
final store = eg.store(initialSnapshot: eg.initialSnapshot(
120+
streams: [eg.subscription(stream)],
121+
subscriptions: [eg.subscription(stream)],
122+
));
123+
124+
check(store.streams[stream.streamId] is Subscription).isTrue();
125+
await store.handleEvent(SubscriptionRemoveEvent(id: 1, streamIds: [stream.streamId]));
126+
check(store.streams[stream.streamId] is Subscription).isFalse();
127+
});
117128
});
118129

119130
group('topic visibility', () {

0 commit comments

Comments
 (0)