diff --git a/CHANGELOG.md b/CHANGELOG.md index f07390be..34e6035f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## [3.0.10] - Apr 19, 2021 +* Fixed register token endpoint +* Fixed typo +* Dropped some suffix `~Filter` from `GroupChannelListQuery` +* Changed `FileInfo.fromUrl` parameter `mimeType` as optional (default is `image/jpeg`) +* Changed `getCurrentUser` to `currentUser` getter +* Improved stability + ## [3.0.9] * Fixed metaData mapping for `User` * Renamed `ImageInfo` to `FileInfo` diff --git a/lib/constant/contants.dart b/lib/constant/contants.dart index aff122f9..ab5c0388 100644 --- a/lib/constant/contants.dart +++ b/lib/constant/contants.dart @@ -1,8 +1,11 @@ // extension sdk version -const String SbExtensionKeyUIKit = 'sb_uikit'; -const String SbExtensionKeySyncManager = 'sb_syncmanager'; +const String sbExtensionKeyUIKit = 'sb_uikit'; +const String sbExtensionKeySyncManager = 'sb_syncmanager'; -const String SbExtraDataPremiumFeatureList = 'premium_feature_list'; -const String SbExtraDataFileUploadSizeLimit = 'file_upload_size_limit'; -const String SbExtraDataEmojiHash = 'emoji_hash'; -const String SbExtraDataApplicationAttributes = 'application_attributes'; +const String sbExtraDataPremiumFeatureList = 'premium_feature_list'; +const String sbExtraDataFileUploadSizeLimit = 'file_upload_size_limit'; +const String sbExtraDataEmojiHash = 'emoji_hash'; +const String sbExtraDataApplicationAttributes = 'application_attributes'; + +const String sbPushTemplateDefault = 'default'; +const String sbPushTemplateAlternative = 'alternative'; diff --git a/lib/core/channel/base/base_channel_meta.dart b/lib/core/channel/base/base_channel_meta.dart index 72fcfc0c..f27cb8c6 100644 --- a/lib/core/channel/base/base_channel_meta.dart +++ b/lib/core/channel/base/base_channel_meta.dart @@ -344,7 +344,7 @@ extension Meta on BaseChannel { return BaseMessage.msgFromJson(result.payload); } - /// Removes list of [metaArrays] with given [message] + /// Removes values from list of [metaArrays] with given [message] Future removeMessageMetaArray( BaseMessage message, List metaArrays, diff --git a/lib/core/channel/group/group_channel_internal.dart b/lib/core/channel/group/group_channel_internal.dart index 0fe6a25a..c8eb1fb4 100644 --- a/lib/core/channel/group/group_channel_internal.dart +++ b/lib/core/channel/group/group_channel_internal.dart @@ -38,7 +38,7 @@ extension GroupChannelInternal on GroupChannel { bool updateUnreadCount(BaseMessage message) { if (message == null) return false; - final currentUser = SendbirdSdk().getCurrentUser(); + final currentUser = SendbirdSdk().currentUser; if (!message.isSilent) { if (!message.sender.isCurrentUser) { diff --git a/lib/core/message/base_message.dart b/lib/core/message/base_message.dart index 3e14011c..62edbd76 100644 --- a/lib/core/message/base_message.dart +++ b/lib/core/message/base_message.dart @@ -253,7 +253,7 @@ class BaseMessage { /// Retrieves threaded messages (replies) on this message with [timestamp] /// and [params]. - Future getThreadedMessageByTimestamp( + Future getThreadedMessagesByTimestamp( int timestamp, ThreadedMessageListParams params, ) async { diff --git a/lib/core/models/user.dart b/lib/core/models/user.dart index 834cf995..a5e5c8c3 100644 --- a/lib/core/models/user.dart +++ b/lib/core/models/user.dart @@ -123,7 +123,7 @@ class User { metaData.removeWhere((key, value) => true); } - bool get isCurrentUser => userId == SendbirdSdk().getCurrentUser()?.userId; + bool get isCurrentUser => userId == SendbirdSdk().currentUser?.userId; // json serialization diff --git a/lib/managers/command_manager.dart b/lib/managers/command_manager.dart index bc07175b..bbb94c59 100644 --- a/lib/managers/command_manager.dart +++ b/lib/managers/command_manager.dart @@ -67,10 +67,10 @@ class CommandManager with SdkAccessor { logger.e('sendCommand: command parameter is null'); throw InvalidParameterError(); } - if (!webSocket.isConnected()) { - logger.e('sendCommand: Websocket connection is closed'); - throw WebSocketConnectionClosedError(); - } + // if (!webSocket.isConnected()) { + // logger.e('sendCommand: Websocket connection is closed'); + // throw WebSocketConnectionClosedError(); + // } try { await ConnectionManager.readyToExecuteWSRequest(); diff --git a/lib/params/file_message_params.dart b/lib/params/file_message_params.dart index ef392f6f..dc626321 100644 --- a/lib/params/file_message_params.dart +++ b/lib/params/file_message_params.dart @@ -36,15 +36,15 @@ class FileMessageParams extends BaseMessageParams { } FileMessageParams.withUrl( - String fileUrl, - String mimeType, { + String fileUrl, { + String mimeType, int size, String name, FileMessage fileMessage, }) : super.withMessage(fileMessage, deepCopy: false) { uploadFile = FileInfo.fromUrl( name: name ?? 'image', - mimeType: mimeType, + mimeType: mimeType ?? 'image/jpeg', url: fileUrl, fileSize: size, ); diff --git a/lib/query/application_user_list_query.dart b/lib/query/application_user_list_query.dart index 1eab0df7..7b97f315 100644 --- a/lib/query/application_user_list_query.dart +++ b/lib/query/application_user_list_query.dart @@ -3,17 +3,25 @@ part of 'user_list_query.dart'; /// A query object to retrieve list of user on current application. @JsonSerializable() class ApplicationUserListQuery extends UserListQuery { - /// The meta data key filter. This query will return users - /// that has the meta data key and values + /// Filters users who have this meta data key. + /// + /// This query will return users that has the meta data key and values + /// This should be specified in conjunction with the metaDataValues. String metaDataKey; - /// The meta data values filter. This query will return users - /// that has the meta data key and values + /// Filters users who have this meta data values. + /// + /// This query will return users that has the meta data key and values + /// This should be specified in conjunction with the metaDataKey. List metaDataValues; + /// Filters users whose nicknames start with the this value + String nicknameStartsWith; + ApplicationUserListQuery({ this.metaDataKey, this.metaDataValues, + this.nicknameStartsWith, }) : super(queryType: UserListQueryType.filtered); @override @@ -29,6 +37,7 @@ class ApplicationUserListQuery extends UserListQuery { userIds: userIds, metaDataKey: metaDataKey, metaDataValues: metaDataValues, + nicknameStartsWith: nicknameStartsWith, ); loading = false; diff --git a/lib/query/group_channel_list_query.dart b/lib/query/group_channel_list_query.dart index d95ecb82..16008e58 100644 --- a/lib/query/group_channel_list_query.dart +++ b/lib/query/group_channel_list_query.dart @@ -32,44 +32,44 @@ class GroupChannelListQuery extends QueryBase { /// Sets to filter public channel. Default is `all` PublicChannelFilter publicChannelFilter; + /// Sets to filter channels by the unread messages. + /// The default value is `all` + UnreadChannelFilter unreadChannelFilter; + + /// Sets to filter channels by the hidden state. + /// The default value is `unhiddenOnly` + ChannelHiddenStateFilter channelHiddenStateFilter; + /// Sets to filter channels by custom type that starts with - String customTypeStartWithFilter; + String customTypeStartWith; /// Sets the custom type filter. - List customTypesFilter; + List customTypes; /// Sets the filter with nickname. /// /// Query result will contains /// channels that any one of member contains given nickname - String nicknameContainsFilter; + String nicknameContains; /// Sets the filter with user IDs /// /// Query result will return if any one of user id matches with channel's members - List userIdsIncludeFilter; + List userIdsIncludeIn; /// Sets the filter with user IDs /// /// Query result will return only if channel's members are exactly matched /// with this property - List userIdsExactFilter; + List userIdsExactlyIn; /// Sets a filter to return only channels that contains the /// specified group channel name - String channelNameContainsFilter; - - /// Sets to filter channels by the unread messages. - /// The default value is `all` - UnreadChannelFilter unreadChannelFilter; + String channelNameContains; /// Sets a key for ordering by value in the metadata. /// This is valid when the `order` is `channelMetaDataValueAlphabetical` only - String metaDataOrderKeyFilter; - - /// Sets to filter channels by the hidden state. - /// The default value is `unhiddenOnly` - ChannelHiddenStateFilter channelHiddenStateFilter; + String metaDataOrderKey; String searchQuery; List searchFields; @@ -86,31 +86,31 @@ class GroupChannelListQuery extends QueryBase { /// default value is `true` bool includeMemberList = true; - // Query result of channel object contains meta data if `true`. - // deault value is `false` + /// Query result of channel object contains meta data if `true`. + /// deault value is `false` bool includeMetaData = true; GroupChannelListQuery(); void setUserIdsExactFilter(List userIds) { - nicknameContainsFilter = null; - userIdsIncludeFilter = null; - userIdsExactFilter = userIds; + nicknameContains = null; + userIdsIncludeIn = null; + userIdsExactlyIn = userIds; queryType = GroupChannelListQueryType.and; } void setUserIdsIncludeFilter( List userIds, GroupChannelListQueryType type) { - nicknameContainsFilter = null; - userIdsExactFilter = null; - userIdsIncludeFilter = userIds; + nicknameContains = null; + userIdsExactlyIn = null; + userIdsIncludeIn = userIds; queryType = type; } void setNicknameContainsFilter(String nickname) { - userIdsIncludeFilter = null; - userIdsExactFilter = null; - nicknameContainsFilter = nickname; + userIdsIncludeIn = null; + userIdsExactlyIn = null; + nicknameContains = nickname; } void setSearchFilter( @@ -120,11 +120,11 @@ class GroupChannelListQuery extends QueryBase { } void setChannelUrlsFilter(List channelUrls) { - userIdsExactFilter = null; - userIdsIncludeFilter = null; + userIdsExactlyIn = null; + userIdsIncludeIn = null; searchFields = null; searchQuery = null; - nicknameContainsFilter = null; + nicknameContains = null; channelUrls = channelUrls; } @@ -145,17 +145,17 @@ class GroupChannelListQuery extends QueryBase { ]; final filter = GroupChannelFilter() - ..customTypeStartswith = customTypeStartWithFilter - ..customTypes = customTypesFilter + ..customTypeStartswith = customTypeStartWith + ..customTypes = customTypes ..memberStateFilter = memberStateFilter - ..membersExactlyIn = userIdsExactFilter - ..membersIncludeIn = userIdsIncludeFilter - ..membersNicknameContains = nicknameContainsFilter - ..nameContains = channelNameContainsFilter + ..membersExactlyIn = userIdsExactlyIn + ..membersIncludeIn = userIdsIncludeIn + ..membersNicknameContains = nicknameContains + ..nameContains = channelNameContains ..superMode = superChannelFilter ..publicMode = publicChannelFilter ..unreadFilter = unreadChannelFilter - ..metadataOrderKey = metaDataOrderKeyFilter + ..metadataOrderKey = metaDataOrderKey ..hiddenMode = channelHiddenStateFilter; final sdk = SendbirdSdk().getInternal(); diff --git a/lib/query/group_channel_list_query.g.dart b/lib/query/group_channel_list_query.g.dart index c9c16cef..1107cbc9 100644 --- a/lib/query/group_channel_list_query.g.dart +++ b/lib/query/group_channel_list_query.g.dart @@ -25,23 +25,20 @@ GroupChannelListQuery _$GroupChannelListQueryFromJson( _$SuperChannelFilterEnumMap, json['super_channel_filter']) ..publicChannelFilter = _$enumDecodeNullable( _$PublicChannelFilterEnumMap, json['public_channel_filter']) - ..customTypeStartWithFilter = - json['custom_type_start_with_filter'] as String - ..customTypesFilter = - (json['custom_types_filter'] as List)?.map((e) => e as String)?.toList() - ..nicknameContainsFilter = json['nickname_contains_filter'] as String - ..userIdsIncludeFilter = (json['user_ids_include_filter'] as List) - ?.map((e) => e as String) - ?.toList() - ..userIdsExactFilter = (json['user_ids_exact_filter'] as List) - ?.map((e) => e as String) - ?.toList() - ..channelNameContainsFilter = json['channel_name_contains_filter'] as String ..unreadChannelFilter = _$enumDecodeNullable( _$UnreadChannelFilterEnumMap, json['unread_channel_filter']) - ..metaDataOrderKeyFilter = json['meta_data_order_key_filter'] as String ..channelHiddenStateFilter = _$enumDecodeNullable( _$ChannelHiddenStateFilterEnumMap, json['channel_hidden_state_filter']) + ..customTypeStartWith = json['custom_type_start_with'] as String + ..customTypes = + (json['custom_types'] as List)?.map((e) => e as String)?.toList() + ..nicknameContains = json['nickname_contains'] as String + ..userIdsIncludeIn = + (json['user_ids_include_in'] as List)?.map((e) => e as String)?.toList() + ..userIdsExactlyIn = + (json['user_ids_exactly_in'] as List)?.map((e) => e as String)?.toList() + ..channelNameContains = json['channel_name_contains'] as String + ..metaDataOrderKey = json['meta_data_order_key'] as String ..searchQuery = json['search_query'] as String ..searchFields = (json['search_fields'] as List) ?.map((e) => @@ -69,17 +66,17 @@ Map _$GroupChannelListQueryToJson( _$SuperChannelFilterEnumMap[instance.superChannelFilter], 'public_channel_filter': _$PublicChannelFilterEnumMap[instance.publicChannelFilter], - 'custom_type_start_with_filter': instance.customTypeStartWithFilter, - 'custom_types_filter': instance.customTypesFilter, - 'nickname_contains_filter': instance.nicknameContainsFilter, - 'user_ids_include_filter': instance.userIdsIncludeFilter, - 'user_ids_exact_filter': instance.userIdsExactFilter, - 'channel_name_contains_filter': instance.channelNameContainsFilter, 'unread_channel_filter': _$UnreadChannelFilterEnumMap[instance.unreadChannelFilter], - 'meta_data_order_key_filter': instance.metaDataOrderKeyFilter, 'channel_hidden_state_filter': _$ChannelHiddenStateFilterEnumMap[instance.channelHiddenStateFilter], + 'custom_type_start_with': instance.customTypeStartWith, + 'custom_types': instance.customTypes, + 'nickname_contains': instance.nicknameContains, + 'user_ids_include_in': instance.userIdsIncludeIn, + 'user_ids_exactly_in': instance.userIdsExactlyIn, + 'channel_name_contains': instance.channelNameContains, + 'meta_data_order_key': instance.metaDataOrderKey, 'search_query': instance.searchQuery, 'search_fields': instance.searchFields ?.map((e) => _$GroupChannelListQuerySearchFieldEnumMap[e]) diff --git a/lib/sdk/internal/sendbird_sdk_internal.dart b/lib/sdk/internal/sendbird_sdk_internal.dart index 3d07a387..8a330c14 100644 --- a/lib/sdk/internal/sendbird_sdk_internal.dart +++ b/lib/sdk/internal/sendbird_sdk_internal.dart @@ -24,7 +24,7 @@ import 'package:sendbird_sdk/utils/async/async_queue.dart'; import 'package:sendbird_sdk/utils/logger.dart'; import 'package:sendbird_sdk/utils/parsers.dart'; -const sdk_version = '3.0.9'; +const sdk_version = '3.0.10'; const platform = 'flatter'; const platform_version = '1.22.5'; @@ -51,10 +51,10 @@ class SendbirdSdkInternal with WidgetsBindingObserver { AsyncQueue _commandQueue = AsyncQueue(); Map _extensions = {}; List _extraDatas = [ - Constants.SbExtraDataPremiumFeatureList, - Constants.SbExtraDataFileUploadSizeLimit, - Constants.SbExtraDataApplicationAttributes, - Constants.SbExtraDataEmojiHash, + Constants.sbExtraDataPremiumFeatureList, + Constants.sbExtraDataFileUploadSizeLimit, + Constants.sbExtraDataApplicationAttributes, + Constants.sbExtraDataEmojiHash, ]; //should only keep one instance @@ -330,7 +330,7 @@ class SendbirdSdkInternal with WidgetsBindingObserver { _state.connected = false; _state.connecting = false; _state.reconnecting = false; - _webSocket.close(); + _webSocket?.close(); } _handleEnterForeground() async { @@ -369,7 +369,7 @@ class SendbirdSdkInternal with WidgetsBindingObserver { } String get _sbUserAgent { - final uikitVersion = _extensions[Constants.SbExtensionKeyUIKit]; + final uikitVersion = _extensions[Constants.sbExtensionKeyUIKit]; final core = '/c$sdk_version'; final uikit = uikitVersion != null ? '/u$uikitVersion' : ''; final os = '/o${Platform.operatingSystem.toLowerCase()}'; @@ -377,8 +377,8 @@ class SendbirdSdkInternal with WidgetsBindingObserver { } void addVersionExtension(String key, String version) { - if (key != Constants.SbExtensionKeyUIKit || - key != Constants.SbExtensionKeySyncManager) { + if (key != Constants.sbExtensionKeyUIKit || + key != Constants.sbExtensionKeySyncManager) { return; } _extensions[key] = version; diff --git a/lib/sdk/sendbird_sdk_api.dart b/lib/sdk/sendbird_sdk_api.dart index f8597035..2bad8af2 100644 --- a/lib/sdk/sendbird_sdk_api.dart +++ b/lib/sdk/sendbird_sdk_api.dart @@ -102,7 +102,7 @@ class SendbirdSdk { /// Reconnects if previously connected and disconnect due to any reasons. /// It will return `false` if previous connection was not made. bool reconnect() { - if (getCurrentUser() == null && _int.state.sessionKey == null) { + if (currentUser == null && _int.state.sessionKey == null) { return false; } @@ -111,7 +111,7 @@ class SendbirdSdk { } /// Returns current connected [User], nullable. - User getCurrentUser() { + User get currentUser { return _int.state?.currentUser; } @@ -505,7 +505,7 @@ class SendbirdSdk { /// Returns a stream to listen message count has been changed Stream get totalUnreadMessageCountStream { - if (getCurrentUser() == null) return null; + if (currentUser == null) return null; return _int.streamManager.unread.stream; } @@ -513,7 +513,7 @@ class SendbirdSdk { /// /// It will be triggered every message update if [channelUrl] is not provided. Stream messageUpdateStream({String channelUrl}) async* { - if (getCurrentUser() == null) yield null; + if (currentUser == null) yield null; await for (final res in _int.streamManager.msgUpdated.stream) { if (channelUrl != null) { if (res.channel.channelUrl == channelUrl) yield res.message; @@ -527,7 +527,7 @@ class SendbirdSdk { /// /// It will be triggered every new message if [channelUrl] is not provided Stream messageReceiveStream({String channelUrl}) async* { - if (getCurrentUser() == null) yield null; + if (currentUser == null) yield null; await for (final res in _int.streamManager.msgReceived.stream) { if (channelUrl != null) { if (res.channel.channelUrl == channelUrl) yield res.message; @@ -541,7 +541,7 @@ class SendbirdSdk { /// /// It will be triggered every message deletion if [channelUrl] is not provided Stream messageDeleteStream({String channelUrl}) async* { - if (getCurrentUser() == null) yield null; + if (currentUser == null) yield null; await for (final res in _int.streamManager.msgDeletd.stream) { if (channelUrl != null) { if (res.channel.channelUrl == channelUrl) yield res.deletedId; @@ -555,7 +555,7 @@ class SendbirdSdk { /// /// It will be triggered every channel chaange if [channelUrl] is not provided Stream channelChangedStream({String channelUrl}) async* { - if (getCurrentUser() == null) yield null; + if (currentUser == null) yield null; await for (final res in _int.streamManager.channelChanged.stream) { if (channelUrl != null) { if (res.channelUrl == channelUrl) yield res; @@ -569,7 +569,7 @@ class SendbirdSdk { /// /// It will be triggered every read event if [channelUrl] is not provided Stream readStream({String channelUrl}) async* { - if (getCurrentUser() == null) yield null; + if (currentUser == null) yield null; await for (final res in _int.streamManager.read.stream) { if (channelUrl != null) { if (res.channelUrl == channelUrl) yield res; @@ -583,7 +583,7 @@ class SendbirdSdk { /// /// It will be triggered every delivery event if [channelUrl] is not provided Stream> deliveryStream({String channelUrl}) async* { - if (getCurrentUser() == null) yield null; + if (currentUser == null) yield null; await for (final res in _int.streamManager.delivery.stream) { if (channelUrl != null) { if (res.channelUrl == channelUrl) { @@ -603,7 +603,7 @@ class SendbirdSdk { /// /// It will be triggered for every typing event if [channelUrl] is not provided Stream> usersTypingStream({String channelUrl}) async* { - if (getCurrentUser() == null) yield null; + if (currentUser == null) yield null; await for (final res in _int.streamManager.typing.stream) { if (channelUrl != null) { if (res.channelUrl == channelUrl) yield res.getTypingUsers(); @@ -615,7 +615,7 @@ class SendbirdSdk { /// Returns a stream to listen connection events Stream get connectionStream { - if (getCurrentUser() == null) return null; + if (currentUser == null) return null; return _int.streamManager.connection.stream; } diff --git a/lib/services/network/api_client.dart b/lib/services/network/api_client.dart index 3d06b410..3cd76293 100644 --- a/lib/services/network/api_client.dart +++ b/lib/services/network/api_client.dart @@ -817,8 +817,9 @@ class ApiClient { // MetaData Future> createUserMetaData( - {Map metaData}) async { - final url = endpoint.Users.userid_metadata.format([currentUserId]); + {Map metaData, String userId}) async { + final url = + endpoint.Users.userid_metadata.format([userId ?? currentUserId]); final body = {'metadata': metaData, 'upsert': true}; final res = await client.post(url: url, body: body); return res; @@ -826,21 +827,25 @@ class ApiClient { Future> updateUserMetaData({ @required Map metaData, + String userId, bool upsert = true, }) async { - final url = endpoint.Users.userid_metadata.format([currentUserId]); + final url = + endpoint.Users.userid_metadata.format([userId ?? currentUserId]); final body = {'metadata': metaData, 'upsert': upsert}; final res = await client.put(url: url, body: body); return res; } - Future deleteUserMetaData(String key) async { - final url = endpoint.Users.userid_metadata_key.format([currentUserId, key]); + Future deleteUserMetaData(String key, {String userId}) async { + final url = endpoint.Users.userid_metadata_key + .format([userId ?? currentUserId, key]); await client.delete(url: url); } - Future deleteAllUserMetaData() async { - final url = endpoint.Users.userid_metadata.format([currentUserId]); + Future deleteAllUserMetaData({String userId}) async { + final url = + endpoint.Users.userid_metadata.format([userId ?? currentUserId]); await client.delete(url: url); } @@ -1214,9 +1219,10 @@ class ApiClient { @required String token, bool unique = true, }) async { + final typeString = type == PushTokenType.fcm ? "gcm" : type.asString(); final url = endpoint.Users.userid_push_tokentype.format([ currentUserId, - type.asString(), + typeString, ]); final body = { @@ -1230,9 +1236,10 @@ class ApiClient { } Future unregisterPushToken({PushTokenType type, String token}) async { + final typeString = type == PushTokenType.fcm ? "gcm" : type.asString(); final url = endpoint.Users.userid_push_tokentype_token.format([ currentUserId, - type.asString(), + typeString, token, ]); await client.delete(url: url); @@ -1509,6 +1516,7 @@ class ApiClient { List userIds, String metaDataKey, List metaDataValues, + String nicknameStartsWith, String token, int limit = 30, }) async { @@ -1519,6 +1527,7 @@ class ApiClient { 'user_ids': userIds, 'metadatakey': metaDataKey, 'metadatavalues_in': metaDataValues, + 'nickname_startswith': nicknameStartsWith, }; params.removeWhere((key, value) => value == null); final res = await client.get(url: url, queryParams: params); diff --git a/pubspec.lock b/pubspec.lock index 388c87ff..c09ae73f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -297,7 +297,7 @@ packages: source: hosted version: "2.2.0" http_parser: - dependency: transitive + dependency: "direct main" description: name: http_parser url: "https://pub.dartlang.org" @@ -360,7 +360,7 @@ packages: source: hosted version: "0.12.10-nullsafety.1" meta: - dependency: transitive + dependency: "direct main" description: name: meta url: "https://pub.dartlang.org" diff --git a/pubspec.yaml b/pubspec.yaml index af4484bc..544cb354 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: sendbird_sdk description: Sendbird Chat SDK Dart/Flutter package -version: 3.0.9 +version: 3.0.10 homepage: https://www.sendbird.com environment: @@ -21,6 +21,8 @@ dependencies: mime: ^0.9.7 yaml: ^2.2.1 connectivity: ^2.0.2 + meta: ^1.2.0 + http_parser: ^3.1.0 dev_dependencies: test: ^1.15.5