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