fix(llc): channel clean up after dispose from cache (#1342)

* fix: channel clean up after dispose from cache

* chore(llc): update changelog

* fix(llc): refactor setter in add/remove methods

* fix tests

Co-authored-by: Salvatore Giordano <[email protected]>
This commit is contained in:
Daniel
2022-10-10 12:59:35 +02:00
committed by GitHub
co-authored by Salvatore Giordano
parent 25bc504125
commit 37e01b118b
5 changed files with 39 additions and 8 deletions
+6
View File
@@ -1,3 +1,9 @@
## Upcoming
🐞 Fixed
- Remove disposed channel clients from the client state.
## 5.0.0
- Included the changes from version [4.5.0](#450).
@@ -1237,7 +1237,7 @@ class Channel {
state = ChannelClientState(this, channelState);
if (cid != null) {
client.state.channels = {cid!: this};
client.state.addChannels({cid!: this});
}
if (!_initializedCompleter.isCompleted) {
_initializedCompleter.complete(true);
@@ -1544,6 +1544,7 @@ class Channel {
/// Call this method to dispose the channel client.
void dispose() {
client.state.removeChannel('$cid');
state?.dispose();
_keyStrokeHandler.cancel();
}
@@ -665,7 +665,7 @@ class StreamChatClient {
clearQueryCache: paginationParams.offset == 0,
);
this.state.channels = updateData.key;
this.state.addChannels(updateData.key);
return updateData.value;
}
@@ -682,7 +682,7 @@ class StreamChatClient {
)) ??
[];
final updatedData = _mapChannelStateToChannel(offlineChannels);
state.channels = updatedData.key;
state.addChannels(updatedData.key);
return updatedData.value;
}
@@ -1549,7 +1549,6 @@ class ClientState {
final eventChannel = event.channel!;
await _client.chatPersistenceClient?.deleteChannels([eventChannel.cid]);
channels[eventChannel.cid]?.dispose();
channels = channels..remove(eventChannel.cid);
}),
);
}
@@ -1589,7 +1588,6 @@ class ClientState {
final eventChannel = event.channel!;
await _client.chatPersistenceClient?.deleteChannels([eventChannel.cid]);
channels[eventChannel.cid]?.dispose();
channels = channels..remove(eventChannel.cid);
}),
);
}
@@ -1648,11 +1646,24 @@ class ClientState {
/// The current list of channels in memory
Map<String, Channel> get channels => _channelsController.value;
set channels(Map<String, Channel> channelMap) {
final newChannels = {...channels, ...channelMap};
set channels(Map<String, Channel> newChannels) {
_channelsController.add(newChannels);
}
/// Adds a list of channels to the current list of cached channels
void addChannels(Map<String, Channel> channelMap) {
final newChannels = {
...channels,
...channelMap,
};
channels = newChannels;
}
/// Removes the channel from the cached list of [channels]
void removeChannel(String channelCid) {
channels = channels..remove(channelCid);
}
/// Used internally for optimistic update of unread count
set totalUnreadCount(int unreadCount) {
_totalUnreadCountController.add(unreadCount);
@@ -1682,7 +1693,11 @@ class ClientState {
_currentUserController.close();
_unreadChannelsController.close();
_totalUnreadCountController.close();
channels.values.forEach((c) => c.dispose());
final channels = this.channels.values.toList();
for (final channel in channels) {
channel.dispose();
}
_channelsController.close();
}
}
@@ -50,6 +50,10 @@ void main() {
// client logger
when(() => client.logger).thenReturn(_createLogger('mock-client-logger'));
// fake clientState
final clientState = FakeClientState();
when(() => client.state).thenReturn(clientState);
});
setUp(() {
+5
View File
@@ -91,6 +91,11 @@ class FakeClientState extends Fake implements ClientState {
@override
int totalUnreadCount = 0;
@override
void removeChannel(String channelCid) {
return;
}
}
class FakeMessage extends Fake implements Message {}