Skip to content

Commit 7962e3d

Browse files
committed
channel: Ensure SubscriptionRemoveEvent updates all collections
1 parent b8b58f3 commit 7962e3d

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
@@ -489,6 +489,24 @@ class Subscription extends ZulipStream {
489489

490490
@override
491491
Map<String, dynamic> toJson() => _$SubscriptionToJson(this);
492+
493+
/// Returns a plain `ZulipStream` with same values as `this`
494+
///
495+
/// This is helpful when unsubscribing from a stream.
496+
ZulipStream toStream() => ZulipStream(
497+
streamId: streamId,
498+
name: name,
499+
description: description,
500+
renderedDescription: renderedDescription,
501+
dateCreated: dateCreated,
502+
firstMessageId: firstMessageId,
503+
inviteOnly: inviteOnly,
504+
isWebPublic: isWebPublic,
505+
historyPublicToSubscribers: historyPublicToSubscribers,
506+
messageRetentionDays: messageRetentionDays,
507+
channelPostPolicy: channelPostPolicy,
508+
canRemoveSubscribersGroup: canRemoveSubscribersGroup,
509+
streamWeeklyTraffic: streamWeeklyTraffic);
492510
}
493511

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

lib/model/channel.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,9 @@ class ChannelStoreImpl with ChannelStore {
268268
}
269269
assert(streamsByName[subscription.name] is Subscription);
270270
assert(subscriptions.containsKey(streamId));
271+
final unsubscribedStream = subscription.toStream();
272+
streams[streamId] = unsubscribedStream;
273+
streamsByName[subscription.name] = unsubscribedStream;
271274
subscriptions.remove(streamId);
272275
}
273276

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)