Skip to content

Commit aa39620

Browse files
Merge pull request #120 from sendbird/v4.2.22
Add 4.2.22.
2 parents 57876e9 + d2e8cce commit aa39620

File tree

11 files changed

+95
-55
lines changed

11 files changed

+95
-55
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## v4.2.22 (Aug 23, 2024)
2+
3+
### Improvements
4+
- Fixed the bugs regarding the channel change logs on multi `GroupChannelCollection`s
5+
16
## v4.2.21 (Aug 16, 2024)
27

38
### Improvements

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ Before installing Sendbird Chat SDK, you need to create a Sendbird application o
5050

5151
```yaml
5252
dependencies:
53-
sendbird_chat_sdk: ^4.2.21
53+
sendbird_chat_sdk: ^4.2.22
5454
```
5555
5656
- Run `flutter pub get` command in your project directory.

lib/src/internal/db/schema/channel/meta/c_channel_info.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class CChannelInfo {
3232
Chat chat, Isar isar, ChannelInfo info) async {
3333
final cChannelInfo = CChannelInfo.fromChannelInfo(info);
3434

35-
// ChangeLogInfo
35+
// ChannelInfo
3636
await chat.dbManager.write(() async {
3737
await isar.cChannelInfos.clear();
3838
await isar.cChannelInfos.put(cChannelInfo);

lib/src/internal/main/chat/chat.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ part 'chat_notifications.dart';
6262
part 'chat_push.dart';
6363
part 'chat_user.dart';
6464

65-
const sdkVersion = '4.2.21';
65+
const sdkVersion = '4.2.22';
6666

6767
// Internal implementation for main class. Do not directly access this class.
6868
class Chat with WidgetsBindingObserver {

lib/src/internal/main/chat/chat_caching.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ extension ChatCaching on Chat {
1212
}
1313

1414
Future<void> clearCachedMessages(String channelUrl) async {
15-
await dbManager.deleteGroupChannels([channelUrl]);
16-
await dbManager.deleteFeedChannels([channelUrl]);
15+
await dbManager.clearMessagesInChannel(channelUrl);
1716
}
1817
}

lib/src/internal/main/chat_manager/collection_manager/collection_manager.dart

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// Copyright (c) 2023 Sendbird, Inc. All rights reserved.
22

3+
import 'dart:async';
4+
35
import 'package:collection/collection.dart';
46
import 'package:sendbird_chat_sdk/sendbird_chat_sdk.dart';
57
import 'package:sendbird_chat_sdk/src/internal/db/schema/channel/meta/channel_info.dart';
@@ -25,6 +27,7 @@ class CollectionManager {
2527
final List<GroupChannelCollection> groupChannelCollections = [];
2628
int lastRequestTsForGroupChannelChangeLogs = 0;
2729
String? lastRequestTokenForGroupChannelChangeLogs;
30+
bool isDoingGroupChannelBackSync = false;
2831

2932
// MessageCollection
3033
final List<BaseMessageCollection> baseMessageCollections = [];
@@ -34,7 +37,8 @@ class CollectionManager {
3437
String? lastRequestTokenForPollChangeLogs;
3538
int lastRequestTsForMessagesGap = 0;
3639

37-
bool isGroupChannelCollectionsRefreshing = false;
40+
Completer<GroupChannelChangeLogsResult>?
41+
groupChannelCollectionsRefreshingCompleter;
3842
bool isBaseMessageCollectionsRefreshing = false;
3943

4044
CollectionManager({required Chat chat}) : _chat = chat {
@@ -96,19 +100,28 @@ class CollectionManager {
96100
Future<void> refreshGroupChannelCollections() async {
97101
sbLog.d(StackTrace.current);
98102

99-
isGroupChannelCollectionsRefreshing = true;
100-
101-
List<Future<dynamic>> futures = [];
102-
103103
if (groupChannelCollections.isNotEmpty) {
104-
futures.add(_requestGroupChannelChangeLogs());
105-
}
104+
GroupChannelChangeLogsResult result;
105+
106+
if (groupChannelCollectionsRefreshingCompleter == null) {
107+
groupChannelCollectionsRefreshingCompleter =
108+
Completer<GroupChannelChangeLogsResult>();
109+
result = await _requestGroupChannelChangeLogs();
110+
groupChannelCollectionsRefreshingCompleter?.complete(result);
111+
groupChannelCollectionsRefreshingCompleter = null;
112+
} else {
113+
result = await groupChannelCollectionsRefreshingCompleter!.future;
114+
}
106115

107-
if (futures.isNotEmpty) {
108-
await Future.wait(futures);
116+
if (result.updatedChannels.isNotEmpty ||
117+
result.deletedChannelUrls.isNotEmpty) {
118+
sendEventsToGroupChannelCollectionList(
119+
eventSource: CollectionEventSource.channelChangeLogs,
120+
updatedChannels: result.updatedChannels,
121+
deletedChannelUrls: result.deletedChannelUrls,
122+
);
123+
}
109124
}
110-
111-
isGroupChannelCollectionsRefreshing = false;
112125
}
113126

114127
Future<void> _refreshBaseMessageCollections() async {
@@ -844,3 +857,13 @@ class InternalFeedChannelHandlerForCollectionManager
844857
// }
845858
// }
846859
}
860+
861+
class GroupChannelChangeLogsResult {
862+
final List<GroupChannel> updatedChannels;
863+
final List<String> deletedChannelUrls;
864+
865+
GroupChannelChangeLogsResult({
866+
required this.updatedChannels,
867+
required this.deletedChannelUrls,
868+
});
869+
}

lib/src/internal/main/chat_manager/collection_manager/group_channel_collection_manager.dart

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,8 @@ extension GroupChannelCollectionManager on CollectionManager {
3131
//------------------------------//
3232
// GroupChannel changeLogs
3333
//------------------------------//
34-
Future<void> _requestGroupChannelChangeLogs({
35-
CollectionEventSource? eventSource,
36-
}) async {
37-
sbLog.d(StackTrace.current, '${eventSource?.toString()}');
34+
Future<GroupChannelChangeLogsResult> _requestGroupChannelChangeLogs() async {
35+
sbLog.d(StackTrace.current);
3836

3937
final params = GroupChannelChangeLogsParams();
4038
final List<GroupChannel> updatedChannels = [];
@@ -102,8 +100,7 @@ extension GroupChannelCollectionManager on CollectionManager {
102100
}
103101
//- [DBManager]
104102

105-
sendEventsToGroupChannelCollectionList(
106-
eventSource: eventSource ?? CollectionEventSource.channelChangeLogs,
103+
return GroupChannelChangeLogsResult(
107104
updatedChannels: updatedChannels,
108105
deletedChannelUrls: deletedChannelUrls,
109106
);

lib/src/internal/main/chat_manager/collection_manager/message_collection_manager.dart

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -174,14 +174,16 @@ extension MessageCollectionManager on CollectionManager {
174174
}
175175
//- [DBManager]
176176

177-
sendEventsToMessageCollection(
178-
messageCollection: messageCollection,
179-
baseChannel: channel,
180-
eventSource: CollectionEventSource.messageChangeLogs,
181-
sendingStatus: SendingStatus.succeeded,
182-
updatedMessages: updatedMessages,
183-
deletedMessageIds: deletedMessageIds,
184-
);
177+
if (updatedMessages.isNotEmpty || deletedMessageIds.isNotEmpty) {
178+
sendEventsToMessageCollection(
179+
messageCollection: messageCollection,
180+
baseChannel: channel,
181+
eventSource: CollectionEventSource.messageChangeLogs,
182+
sendingStatus: SendingStatus.succeeded,
183+
updatedMessages: updatedMessages,
184+
deletedMessageIds: deletedMessageIds,
185+
);
186+
}
185187
}
186188

187189
//------------------------------//
@@ -271,14 +273,16 @@ extension MessageCollectionManager on CollectionManager {
271273
}
272274
//- [DBManager]
273275

274-
sendEventsToMessageCollection(
275-
messageCollection: messageCollection,
276-
baseChannel: groupChannel,
277-
eventSource: CollectionEventSource.pollChangeLogs,
278-
sendingStatus: SendingStatus.succeeded,
279-
updatedMessages: updatedMessages,
280-
deletedMessageIds: deletedMessageIds,
281-
);
276+
if (updatedMessages.isNotEmpty || deletedMessageIds.isNotEmpty) {
277+
sendEventsToMessageCollection(
278+
messageCollection: messageCollection,
279+
baseChannel: groupChannel,
280+
eventSource: CollectionEventSource.pollChangeLogs,
281+
sendingStatus: SendingStatus.succeeded,
282+
updatedMessages: updatedMessages,
283+
deletedMessageIds: deletedMessageIds,
284+
);
285+
}
282286
}
283287

284288
//------------------------------//

lib/src/internal/main/chat_manager/db_manager.dart

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ class DBManager {
143143
}
144144

145145
Future<void> write(Function writeFunc, {bool force = false}) async {
146-
if (isEnabled() || force) {
146+
if (isEnabled() || (_isInitialized && force)) {
147147
try {
148148
await _db.write(writeFunc);
149149
} catch (e) {
@@ -310,9 +310,6 @@ class DBManager {
310310
// ChannelAccess
311311
await _db.deleteChannelAccess(channelUrl);
312312

313-
// ChannelInfo
314-
await _db.deleteChannelInfo();
315-
316313
// Messages
317314
await deleteMessagesInDeletedChannel(channelUrl);
318315

@@ -322,6 +319,14 @@ class DBManager {
322319
}
323320
}
324321

322+
Future<void> clearMessagesInChannel(String channelUrl) async {
323+
// Messages
324+
await deleteMessagesInDeletedChannel(channelUrl);
325+
326+
// MessageChangeLogInfo
327+
await _db.deleteMessageChangeLogInfo(channelUrl);
328+
}
329+
325330
// FeedChannel
326331
Future<void> upsertFeedChannels(List<FeedChannel> channels) async {
327332
if (isEnabled()) {
@@ -356,9 +361,6 @@ class DBManager {
356361
// ChannelAccess
357362
await _db.deleteChannelAccess(channelUrl);
358363

359-
// ChannelInfo
360-
await _db.deleteChannelInfo();
361-
362364
// Messages
363365
await deleteMessagesInDeletedChannel(channelUrl);
364366

lib/src/public/main/collection/group_channel_collection/group_channel_collection.dart

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class GroupChannelCollection {
3636
//+ [DBManager]
3737
int _fetchedCount = 0;
3838
int _offset = 0;
39+
bool _areGroupChannelChangeLogsFetchedOnce = false;
3940

4041
//- [DBManager]
4142

@@ -51,9 +52,15 @@ class GroupChannelCollection {
5152

5253
//+ [DBManager]
5354
if (_chat.dbManager.isEnabled()) {
54-
runZonedGuarded(() {
55-
_doBackSync(); // Do not await for performance
56-
}, (error, stack) {});
55+
if (_chat.collectionManager.isDoingGroupChannelBackSync == false) {
56+
_chat.collectionManager.isDoingGroupChannelBackSync = true;
57+
runZonedGuarded(() async {
58+
await _doBackSync(); // Do not await for performance
59+
_chat.collectionManager.isDoingGroupChannelBackSync = false;
60+
}, (error, stack) {
61+
_chat.collectionManager.isDoingGroupChannelBackSync = false;
62+
});
63+
}
5764
}
5865
//- [DBManager]
5966

@@ -124,6 +131,7 @@ class GroupChannelCollection {
124131
if (info != null && info.isChannelBackSyncCompleted) {
125132
final channels = await _chat.dbManager
126133
.getGroupChannels(query: _query, offset: _offset);
134+
127135
if (channels.isNotEmpty) {
128136
localChannels.addAll(channels);
129137
}
@@ -144,15 +152,17 @@ class GroupChannelCollection {
144152
);
145153
}
146154

147-
// Check
148-
runZonedGuarded(() {
149-
_chat.collectionManager
150-
.refreshGroupChannelCollections(); // Do not await for performance
151-
}, (error, stack) {});
155+
if (_areGroupChannelChangeLogsFetchedOnce == false) {
156+
_areGroupChannelChangeLogsFetchedOnce = true;
157+
// Check
158+
runZonedGuarded(() {
159+
_chat.collectionManager
160+
.refreshGroupChannelCollections(); // Do not await for performance
161+
}, (error, stack) {});
162+
}
152163
}
153164
}
154165
//- [DBManager]
155-
156166
try {
157167
if (localChannels.isNotEmpty) {
158168
//+ [DBManager]

0 commit comments

Comments
 (0)