Skip to content

Commit 87c6b5e

Browse files
Merge pull request #140 from sendbird/v4.4.0
Add 4.4.0.
2 parents 964a308 + 542ee82 commit 87c6b5e

30 files changed

+477
-62
lines changed

CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,16 @@
1+
## v4.4.0 (Jun 20, 2025)
2+
3+
### Features
4+
- Added `markAsUnread()` in `GroupChannel`
5+
- Added `eventUserMarkedRead` and `eventUserMarkedUnread` in `CollectionEventSource`
6+
- Added `eventDetail` in `BaseChannelContext`
7+
- Added `onUserMarkedRead()` and `onUserMarkedUnread()` events in `GroupChannelHandler`
8+
- Added `uikitConfigInfo` in `AppInfo`
9+
10+
### Improvements
11+
- Fixed a bug where writing `metaData` to db in `FeedChannel` failed
12+
- Fixed a bug regarding `ScheduledStatus` in `ScheduledInfo`
13+
114
## v4.3.2 (May 7, 2025)
215

316
### 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.3.2
53+
sendbird_chat_sdk: ^4.4.0
5454
```
5555
5656
- Run `flutter pub get` command in your project directory.

lib/src/internal/db/schema/channel/c_base_channel.dart

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class CBaseChannel {
2626
String? customType;
2727
bool? isFrozen;
2828
bool? isEphemeral;
29-
late String metaData; // Map<String, String>
29+
String? metaData; // Map<String, String>
3030

3131
// Internal
3232
late bool fromCache;
@@ -82,10 +82,12 @@ class CBaseChannel {
8282
..isFrozen = cBaseChannel.isFrozen
8383
..isEphemeral = cBaseChannel.isEphemeral;
8484

85-
final cachedMetaData =
86-
(jsonDecode(cBaseChannel.metaData) as Map<String, dynamic>)
87-
.map((key, value) => MapEntry(key, value.toString()));
88-
channel.setCachedMetaData(cachedMetaData);
85+
if (cBaseChannel.metaData != null) {
86+
final cachedMetaData =
87+
(jsonDecode(cBaseChannel.metaData!) as Map<String, dynamic>)
88+
.map((key, value) => MapEntry(key, value.toString()));
89+
channel.setCachedMetaData(cachedMetaData);
90+
}
8991
}
9092
return channel;
9193
}

lib/src/internal/db/schema/channel/c_feed_channel.g.dart

Lines changed: 32 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/src/internal/db/schema/channel/c_group_channel.g.dart

Lines changed: 32 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import 'package:sendbird_chat_sdk/src/internal/network/http/http_client/request/
3737
import 'package:sendbird_chat_sdk/src/internal/network/http/http_client/request/main/notifications/global_notification_channel_setting_get_request.dart';
3838
import 'package:sendbird_chat_sdk/src/internal/network/http/http_client/request/main/notifications/notification_template_get_request.dart';
3939
import 'package:sendbird_chat_sdk/src/internal/network/http/http_client/request/main/notifications/notification_template_list_get_request.dart';
40+
import 'package:sendbird_chat_sdk/src/internal/network/http/http_client/request/main/uikit_configuration_get_request.dart';
4041
import 'package:sendbird_chat_sdk/src/internal/network/http/http_client/request/user/auth/authenticate_feed_request.dart';
4142
import 'package:sendbird_chat_sdk/src/internal/network/http/http_client/request/user/block/user_block_request.dart';
4243
import 'package:sendbird_chat_sdk/src/internal/network/http/http_client/request/user/block/user_unblock_request.dart';
@@ -64,7 +65,7 @@ part 'chat_notifications.dart';
6465
part 'chat_push.dart';
6566
part 'chat_user.dart';
6667

67-
const sdkVersion = '4.3.2';
68+
const sdkVersion = '4.4.0';
6869

6970
// Internal implementation for main class. Do not directly access this class.
7071
class Chat with WidgetsBindingObserver {
@@ -205,8 +206,7 @@ class Chat with WidgetsBindingObserver {
205206
sbLog.i(StackTrace.current);
206207
if (chatContext.isChatConnected) {
207208
await connectionManager.enterForeground();
208-
}
209-
if (chatContext.isFeedAuthenticated) {
209+
} else if (chatContext.isFeedAuthenticated) {
210210
collectionManager.refreshNotificationCollections();
211211
}
212212
}
@@ -245,9 +245,7 @@ class Chat with WidgetsBindingObserver {
245245
if (chatContext.isChatConnected) {
246246
sbLog.d(StackTrace.current, 'reconnect()');
247247
await connectionManager.reconnect(reset: true);
248-
}
249-
250-
if (chatContext.isFeedAuthenticated) {
248+
} else if (chatContext.isFeedAuthenticated) {
251249
sbLog.d(StackTrace.current, 'refreshNotificationCollections()');
252250
collectionManager.refreshNotificationCollections();
253251
}
@@ -317,4 +315,9 @@ class Chat with WidgetsBindingObserver {
317315
if (key != extensionKeyUiKit) return;
318316
extensions[key] = version;
319317
}
318+
319+
Future<Map<String, dynamic>> getUIKitConfiguration() async {
320+
return await apiClient
321+
.send<Map<String, dynamic>>(UIKitConfigurationGetRequest(this));
322+
}
320323
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ extension ChatAuth on Chat {
2121
throw RequestFailedException(
2222
message:
2323
'Already logged in as a different user. Call disconnect() first.');
24-
}
25-
if (chatContext.isFeedAuthenticated) {
24+
} else if (chatContext.isFeedAuthenticated) {
2625
await disconnect();
2726
}
2827
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,24 @@ class InternalGroupChannelHandlerForCollectionManager
597597
);
598598
}
599599

600+
@override
601+
void onUserMarkedRead(GroupChannel channel, List<String> userIds) {
602+
_collectionManager.sendEventsToGroupChannelCollectionList(
603+
eventSource: CollectionEventSource.eventUserMarkedRead,
604+
updatedChannels: [channel],
605+
eventDetail: userIds,
606+
);
607+
}
608+
609+
@override
610+
void onUserMarkedUnread(GroupChannel channel, List<String> userIds) {
611+
_collectionManager.sendEventsToGroupChannelCollectionList(
612+
eventSource: CollectionEventSource.eventUserMarkedUnread,
613+
updatedChannels: [channel],
614+
eventDetail: userIds,
615+
);
616+
}
617+
600618
@override
601619
void onDeliveryStatusUpdated(GroupChannel channel) {
602620
_collectionManager.sendEventsToGroupChannelCollectionList(

0 commit comments

Comments
 (0)