diff --git a/analysis_options.yaml b/analysis_options.yaml index e5eaf7ca..03a4220e 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -154,18 +154,6 @@ dart_code_metrics: # Dart Specific - binary-expression-operand-order - double-literal-format - - prefer-match-file-name: - exclude: - - packages/*/test/** - - packages/*/example/** - - packages/**/util/** - - packages/**/utils.dart - - packages/stream_chat/lib/src/client/client.dart - - packages/stream_chat/lib/src/core/api/responses.dart - - packages/stream_chat/lib/src/core/api/requests.dart - - packages/stream_chat/lib/src/core/platform_detector/** - - packages/stream_chat_persistence/lib/src/db/shared/** - - packages/stream_chat_localizations/lib/src/stream_chat_localizations.dart - no-boolean-literal-compare - no-equal-then-else - no-empty-block: diff --git a/packages/stream_chat/CHANGELOG.md b/packages/stream_chat/CHANGELOG.md index 6e983127..7e172a23 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -2,12 +2,17 @@ ✅ Added +- Added `client.enrichUrl` endpoint for enriching URLs with metadata. +- Fixed `unreadCount` after removing user from a channel. - `ChannelModel` now supplies individual user capabilities. +## 3.3.1 + 🐞 Fixed - [[#799]](https://github.com/GetStream/stream-chat-flutter/issues/799) Fixed `totalUnreadCount` is not updating when - app is resumed from background mode + app is resumed from background mode. +- Fix retry mechanism failing in some cases. ## 3.3.0 diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index 657b8617..258122a7 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -1538,6 +1538,7 @@ class ChannelClientState { members: List.from( channelState.members..removeWhere((m) => m.userId == user!.id), ), + read: channelState.read..removeWhere((r) => r.user.id == user!.id), )); })); } @@ -1698,7 +1699,7 @@ class ChannelClientState { } _channelState = _channelState.copyWith( - messages: newMessages, + messages: newMessages..sort(_sortByCreatedAt), channel: _channelState.channel?.copyWith( lastMessageAt: message.createdAt, ), diff --git a/packages/stream_chat/lib/src/client/client.dart b/packages/stream_chat/lib/src/client/client.dart index 29e500ce..b2ae3657 100644 --- a/packages/stream_chat/lib/src/client/client.dart +++ b/packages/stream_chat/lib/src/client/client.dart @@ -1316,6 +1316,10 @@ class StreamChatClient { }, ); + /// Get OpenGraph data of the given [url]. + Future enrichUrl(String url) => + _chatApi.general.enrichUrl(url); + /// Closes the [_ws] connection and resets the [state] /// If [flushChatPersistence] is true the client deletes all offline /// user's data. diff --git a/packages/stream_chat/lib/src/client/retry_queue.dart b/packages/stream_chat/lib/src/client/retry_queue.dart index c441b5fb..e1b6df70 100644 --- a/packages/stream_chat/lib/src/client/retry_queue.dart +++ b/packages/stream_chat/lib/src/client/retry_queue.dart @@ -71,14 +71,15 @@ class RetryQueue { /// Add a list of messages void add(List messages) { if (messages.isEmpty) return; - if (_messageQueue.containsAllMessage(messages)) return; + if (!_messageQueue.containsAllMessage(messages)) { + logger?.info('Adding ${messages.length} messages'); + final messageList = _messageQueue.toList(); + // we should not add message if already available in the queue + _messageQueue.addAll(messages.where( + (it) => !messageList.any((m) => m.id == it.id), + )); + } - logger?.info('Adding ${messages.length} messages'); - final messageList = _messageQueue.toList(); - // we should not add message if already available in the queue - _messageQueue.addAll(messages.where( - (it) => !messageList.any((m) => m.id == it.id), - )); _startRetrying(); } @@ -90,17 +91,21 @@ class RetryQueue { while (_messageQueue.isNotEmpty) { logger?.info('${_messageQueue.length} messages remaining in the queue'); final message = _messageQueue.first; - await _runAndRetry(message); + final succeeded = await _runAndRetry(message); + if (!succeeded) { + _messageQueue.toList().forEach(_sendFailedEvent); + break; + } } _isRetrying = false; } - Future _runAndRetry(Message message) async { + Future _runAndRetry(Message message) async { var attempt = 1; final maxAttempt = _retryPolicy.maxRetryAttempts; // early return in case maxAttempt is less than 0 - if (attempt > maxAttempt) return; + if (attempt > maxAttempt) return false; // ignore: literal_only_boolean_expressions while (true) { @@ -109,8 +114,12 @@ class RetryQueue { await _retryMessage(message); logger?.info('Message (${message.id}) sent successfully'); _messageQueue.removeMessage(message); - break; - } on StreamChatError catch (e) { + return true; + } catch (e) { + if (e is! StreamChatNetworkError || !e.isRetriable) { + _messageQueue.removeMessage(message); + return true; + } // retry logic final maxAttempt = _retryPolicy.maxRetryAttempts; if (attempt < maxAttempt) { @@ -143,16 +152,9 @@ class RetryQueue { _sendFailedEvent(message); break; } - } catch (e) { - logger?.info( - 'API call failed due to unknown error (attempt $attempt). ' - 'Giving up for now, will retry when connection recovers. ' - 'Error was $e', - ); - _sendFailedEvent(message); - break; } } + return false; } void _sendFailedEvent(Message message) { diff --git a/packages/stream_chat/lib/src/core/api/general_api.dart b/packages/stream_chat/lib/src/core/api/general_api.dart index fa08a475..9a2e773c 100644 --- a/packages/stream_chat/lib/src/core/api/general_api.dart +++ b/packages/stream_chat/lib/src/core/api/general_api.dart @@ -96,4 +96,16 @@ class GeneralApi { return QueryMembersResponse.fromJson(response.data); } + + /// Get OpenGraph data of the given [url]. + Future enrichUrl(String url) async { + final response = await _client.get( + '/og', + queryParameters: { + 'url': url, + }, + ); + + return OGAttachmentResponse.fromJson(response.data); + } } diff --git a/packages/stream_chat/lib/src/core/api/responses.dart b/packages/stream_chat/lib/src/core/api/responses.dart index 5b52b65d..937e0150 100644 --- a/packages/stream_chat/lib/src/core/api/responses.dart +++ b/packages/stream_chat/lib/src/core/api/responses.dart @@ -442,3 +442,43 @@ class ChannelStateResponse extends _BaseResponse { static ChannelStateResponse fromJson(Map json) => _$ChannelStateResponseFromJson(json); } + +/// Model response for [Client.enrichUrl] api call. +@JsonSerializable(createToJson: false) +class OGAttachmentResponse extends _BaseResponse { + /// The URL of the page that was scraped. + late String ogScrapeUrl; + + /// The URL of the asset. + String? assetUrl; + + /// The URL of the author. + String? authorLink; + + /// The name of the author. + String? authorName; + + /// The URL of the image. + String? imageUrl; + + /// The text of the attachment. + String? text; + + /// The URL of the thumbnail. + String? thumbUrl; + + /// The title of the attachment. + String? title; + + /// The URL of the title. + String? titleLink; + + /// The type of the attachment. + /// + /// 'video' | 'audio' | 'image' + String? type; + + /// Create a new instance from a [json]. + static OGAttachmentResponse fromJson(Map json) => + _$OGAttachmentResponseFromJson(json); +} diff --git a/packages/stream_chat/lib/src/core/api/responses.g.dart b/packages/stream_chat/lib/src/core/api/responses.g.dart index 13d7d77b..fbcdd252 100644 --- a/packages/stream_chat/lib/src/core/api/responses.g.dart +++ b/packages/stream_chat/lib/src/core/api/responses.g.dart @@ -273,3 +273,18 @@ ChannelStateResponse _$ChannelStateResponseFromJson( ?.map((e) => Read.fromJson(e as Map)) .toList() ?? []; + +OGAttachmentResponse _$OGAttachmentResponseFromJson( + Map json) => + OGAttachmentResponse() + ..duration = json['duration'] as String? + ..ogScrapeUrl = json['og_scrape_url'] as String + ..assetUrl = json['asset_url'] as String? + ..authorLink = json['author_link'] as String? + ..authorName = json['author_name'] as String? + ..imageUrl = json['image_url'] as String? + ..text = json['text'] as String? + ..thumbUrl = json['thumb_url'] as String? + ..title = json['title'] as String? + ..titleLink = json['title_link'] as String? + ..type = json['type'] as String?; diff --git a/packages/stream_chat/lib/version.dart b/packages/stream_chat/lib/version.dart index cc19a375..ed6d9b09 100644 --- a/packages/stream_chat/lib/version.dart +++ b/packages/stream_chat/lib/version.dart @@ -3,4 +3,4 @@ import 'package:stream_chat/src/client/client.dart'; /// Current package version /// Used in [StreamChatClient] to build the `x-stream-client` header // ignore: constant_identifier_names -const PACKAGE_VERSION = '3.3.0'; +const PACKAGE_VERSION = '3.3.1'; diff --git a/packages/stream_chat/pubspec.yaml b/packages/stream_chat/pubspec.yaml index 38ee620c..599b6ed8 100644 --- a/packages/stream_chat/pubspec.yaml +++ b/packages/stream_chat/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat homepage: https://getstream.io/ description: The official Dart client for Stream Chat, a service for building chat applications. -version: 3.3.0 +version: 3.3.1 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues diff --git a/packages/stream_chat/test/src/client/client_test.dart b/packages/stream_chat/test/src/client/client_test.dart index 36c5919e..22e0edf8 100644 --- a/packages/stream_chat/test/src/client/client_test.dart +++ b/packages/stream_chat/test/src/client/client_test.dart @@ -1,20 +1,7 @@ import 'package:mocktail/mocktail.dart'; -import 'package:stream_chat/src/client/client.dart'; import 'package:stream_chat/src/core/api/device_api.dart'; -import 'package:stream_chat/src/core/api/requests.dart'; -import 'package:stream_chat/src/core/api/responses.dart'; -import 'package:stream_chat/src/core/error/error.dart'; import 'package:stream_chat/src/core/http/token.dart'; -import 'package:stream_chat/src/core/models/channel_model.dart'; -import 'package:stream_chat/src/core/models/event.dart'; -import 'package:stream_chat/src/core/models/filter.dart'; -import 'package:stream_chat/src/core/models/message.dart'; -import 'package:stream_chat/src/core/models/own_user.dart'; -import 'package:stream_chat/src/core/models/user.dart'; -import 'package:stream_chat/src/event_type.dart'; -import 'package:stream_chat/src/ws/connection_status.dart'; import 'package:stream_chat/stream_chat.dart'; -import 'package:test/scaffolding.dart'; import 'package:test/test.dart'; import '../fakes.dart'; @@ -2314,6 +2301,33 @@ void main() { verifyNoMoreInteractions(api.message); }); + test('`.enrichUrl`', () async { + const url = + 'https://www.techyourchance.com/finite-state-machine-with-unit-tests-real-world-example'; + + when(() => api.general.enrichUrl(url)).thenAnswer( + (_) async => OGAttachmentResponse() + ..type = 'image' + ..ogScrapeUrl = url + ..authorName = 'TechYourChance' + ..title = 'Finite State Machine with Unit Tests: Real World Example', + ); + + final res = await client.enrichUrl(url); + + expect(res, isNotNull); + expect(res.type, 'image'); + expect(res.ogScrapeUrl, url); + expect(res.authorName, 'TechYourChance'); + expect( + res.title, + 'Finite State Machine with Unit Tests: Real World Example', + ); + + verify(() => api.general.enrichUrl(url)).called(1); + verifyNoMoreInteractions(api.general); + }); + test( '''setting the `currentUser` should also compute and update the unreadCounts''', () { diff --git a/packages/stream_chat/test/src/core/api/general_api_test.dart b/packages/stream_chat/test/src/core/api/general_api_test.dart index 570d7c77..0a27cce4 100644 --- a/packages/stream_chat/test/src/core/api/general_api_test.dart +++ b/packages/stream_chat/test/src/core/api/general_api_test.dart @@ -3,10 +3,6 @@ import 'dart:convert'; import 'package:dio/dio.dart'; import 'package:mocktail/mocktail.dart'; import 'package:stream_chat/src/core/api/general_api.dart'; -import 'package:stream_chat/src/core/api/requests.dart'; -import 'package:stream_chat/src/core/models/channel_model.dart'; -import 'package:stream_chat/src/core/models/event.dart'; -import 'package:stream_chat/src/core/models/filter.dart'; import 'package:stream_chat/stream_chat.dart'; import 'package:test/test.dart'; @@ -281,4 +277,39 @@ void main() { verifyNoMoreInteractions(client); }); }); + + test('enrichUrl', () async { + const path = '/og'; + const url = + 'https://www.techyourchance.com/finite-state-machine-with-unit-tests-real-world-example'; + + when(() => client.get( + path, + queryParameters: {'url': url}, + )).thenAnswer((_) async => successResponse(path, data: { + 'type': 'image', + 'og_scrape_url': url, + 'author_name': 'TechYourChance', + 'title': 'Finite State Machine with Unit Tests: Real World Example', + })); + + final res = await generalApi.enrichUrl(url); + + expect(res, isNotNull); + expect(res.type, 'image'); + expect(res.ogScrapeUrl, url); + expect(res.authorName, 'TechYourChance'); + expect( + res.title, + 'Finite State Machine with Unit Tests: Real World Example', + ); + + verify( + () => client.get( + path, + queryParameters: {'url': url}, + ), + ).called(1); + verifyNoMoreInteractions(client); + }); } diff --git a/packages/stream_chat_flutter/CHANGELOG.md b/packages/stream_chat_flutter/CHANGELOG.md index acd97c9e..65fe9767 100644 --- a/packages/stream_chat_flutter/CHANGELOG.md +++ b/packages/stream_chat_flutter/CHANGELOG.md @@ -1,9 +1,22 @@ ## Upcoming -🛑️ Breaking Changes from `3.2.0` +🛑️ Breaking Changes - `pinPermissions` is no longer needed in `MessageListView`. +🐞 Fixed + +- SVG rendering fixes +- Use file extension instead of mimeType for downloading files + +✅ Added + +- Videos can now be auto-played in `FullScreenMedia` + +## 3.3.2 + +- Updated `stream_chat_flutter_core` dependency to [`3.3.1`](https://pub.dev/packages/stream_chat_flutter_core/changelog). + ## 3.3.1 ✅ Added diff --git a/packages/stream_chat_flutter/lib/src/attachment/giphy_attachment.dart b/packages/stream_chat_flutter/lib/src/attachment/giphy_attachment.dart index fc0fb586..cc29f0b2 100644 --- a/packages/stream_chat_flutter/lib/src/attachment/giphy_attachment.dart +++ b/packages/stream_chat_flutter/lib/src/attachment/giphy_attachment.dart @@ -246,7 +246,8 @@ class GiphyAttachment extends AttachmentWidget { return StreamChannel( channel: channel, child: FullScreenMedia( - mediaAttachments: [attachment], + mediaAttachments: message.attachments, + startIndex: message.attachments.indexOf(attachment), userName: message.user?.name, message: message, onShowMessage: onShowMessage, diff --git a/packages/stream_chat_flutter/lib/src/attachment/image_attachment.dart b/packages/stream_chat_flutter/lib/src/attachment/image_attachment.dart index 41b8d039..ff01eea3 100644 --- a/packages/stream_chat_flutter/lib/src/attachment/image_attachment.dart +++ b/packages/stream_chat_flutter/lib/src/attachment/image_attachment.dart @@ -141,7 +141,9 @@ class ImageAttachment extends AttachmentWidget { return StreamChannel( channel: channel, child: FullScreenMedia( - mediaAttachments: [attachment], + mediaAttachments: message.attachments, + startIndex: + message.attachments.indexOf(attachment), userName: message.user?.name, message: message, onShowMessage: onShowMessage, diff --git a/packages/stream_chat_flutter/lib/src/attachment/video_attachment.dart b/packages/stream_chat_flutter/lib/src/attachment/video_attachment.dart index ce4ac804..0fc97d5e 100644 --- a/packages/stream_chat_flutter/lib/src/attachment/video_attachment.dart +++ b/packages/stream_chat_flutter/lib/src/attachment/video_attachment.dart @@ -87,7 +87,9 @@ class VideoAttachment extends AttachmentWidget { builder: (_) => StreamChannel( channel: channel, child: FullScreenMedia( - mediaAttachments: [attachment], + mediaAttachments: message.attachments, + startIndex: + message.attachments.indexOf(attachment), userName: message.user?.name, message: message, onShowMessage: onShowMessage, diff --git a/packages/stream_chat_flutter/lib/src/attachment_actions_modal.dart b/packages/stream_chat_flutter/lib/src/attachment_actions_modal.dart index 0c10ae46..ac9213b6 100644 --- a/packages/stream_chat_flutter/lib/src/attachment_actions_modal.dart +++ b/packages/stream_chat_flutter/lib/src/attachment_actions_modal.dart @@ -365,12 +365,13 @@ class AttachmentActionsModal extends StatelessWidget { }) async { String? filePath; final appDocDir = await getTemporaryDirectory(); + final url = + attachment.assetUrl ?? attachment.imageUrl ?? attachment.thumbUrl!; await Dio().download( - attachment.assetUrl ?? attachment.imageUrl ?? attachment.thumbUrl!, + url, (Headers responseHeaders) { - final contentType = responseHeaders[Headers.contentTypeHeader]!; - final mimeType = contentType.first.split('/').last; - filePath ??= '${appDocDir.path}/${attachment.id}.$mimeType'; + final ext = Uri.parse(url).pathSegments.last; + filePath ??= '${appDocDir.path}/${attachment.id}.$ext'; return filePath!; }, onReceiveProgress: progressCallback, diff --git a/packages/stream_chat_flutter/lib/src/full_screen_media.dart b/packages/stream_chat_flutter/lib/src/full_screen_media.dart index 6547a93d..84ddb803 100644 --- a/packages/stream_chat_flutter/lib/src/full_screen_media.dart +++ b/packages/stream_chat_flutter/lib/src/full_screen_media.dart @@ -34,6 +34,7 @@ class FullScreenMedia extends StatefulWidget { String? userName, this.onShowMessage, this.attachmentActionsModalBuilder, + this.autoplayVideos = false, }) : userName = userName ?? '', super(key: key); @@ -57,6 +58,9 @@ class FullScreenMedia extends StatefulWidget { /// Use [defaultActionsModal.copyWith] to easily customize it final AttachmentActionsBuilder? attachmentActionsModalBuilder; + /// Auto-play videos when page is opened + final bool autoplayVideos; + @override _FullScreenMediaState createState() => _FullScreenMediaState(); } @@ -81,7 +85,8 @@ class _FullScreenMediaState extends State ); _pageController = PageController(initialPage: widget.startIndex); _currentPage = widget.startIndex; - for (final attachment in widget.mediaAttachments) { + for (var i = 0; i < widget.mediaAttachments.length; i++) { + final attachment = widget.mediaAttachments[i]; if (attachment.type != 'video') continue; final package = VideoPackage(attachment, showControls: true); videoPackages[attachment.id] = package; @@ -90,9 +95,21 @@ class _FullScreenMediaState extends State } Future initializePlayers() async { + if (videoPackages.isEmpty) { + return; + } + + final currentAttachment = widget.mediaAttachments[widget.startIndex]; + await Future.wait(videoPackages.values.map( (it) => it.initialize(), )); + + if (widget.autoplayVideos && currentAttachment.type == 'video') { + final package = videoPackages.values + .firstWhere((e) => e._attachment == currentAttachment); + package._chewieController?.play(); + } setState(() {}); // ignore: no-empty-block } @@ -109,6 +126,24 @@ class _FullScreenMediaState extends State setState(() { _currentPage = val; }); + + if (videoPackages.isEmpty) { + return; + } + + final currentAttachment = widget.mediaAttachments[val]; + + for (final e in videoPackages.values) { + if (e._attachment != currentAttachment) { + e._chewieController?.pause(); + } + } + + if (widget.autoplayVideos && + currentAttachment.type == 'video') { + final controller = videoPackages[currentAttachment.id]!; + controller._chewieController?.play(); + } }, itemBuilder: (context, index) { final attachment = widget.mediaAttachments[index]; @@ -243,15 +278,16 @@ class _FullScreenMediaState extends State class VideoPackage { /// Constructor for creating [VideoPackage] VideoPackage( - Attachment attachment, { + this._attachment, { bool showControls = false, bool autoInitialize = true, }) : _showControls = showControls, _autoInitialize = autoInitialize, - _videoPlayerController = attachment.localUri != null - ? VideoPlayerController.file(File.fromUri(attachment.localUri!)) - : VideoPlayerController.network(attachment.assetUrl!); + _videoPlayerController = _attachment.localUri != null + ? VideoPlayerController.file(File.fromUri(_attachment.localUri!)) + : VideoPlayerController.network(_attachment.assetUrl!); + final Attachment _attachment; final bool _showControls; final bool _autoInitialize; final VideoPlayerController _videoPlayerController; diff --git a/packages/stream_chat_flutter/lib/src/message_widget.dart b/packages/stream_chat_flutter/lib/src/message_widget.dart index f1ae1efa..60bacc29 100644 --- a/packages/stream_chat_flutter/lib/src/message_widget.dart +++ b/packages/stream_chat_flutter/lib/src/message_widget.dart @@ -832,8 +832,8 @@ class _MessageWidgetState extends State ), if (isFailedState) Positioned( - left: widget.reverse ? 0 : null, - right: widget.reverse ? null : 0, + right: widget.reverse ? 0 : null, + left: widget.reverse ? null : 0, bottom: showBottomRow ? 18 : -2, child: StreamSvgIcon.error(size: 20), ), diff --git a/packages/stream_chat_flutter/lib/svgs/STREAM MARK 1.svg b/packages/stream_chat_flutter/lib/svgs/STREAM MARK 1.svg index 57ccef0f..91fedc05 100644 --- a/packages/stream_chat_flutter/lib/svgs/STREAM MARK 1.svg +++ b/packages/stream_chat_flutter/lib/svgs/STREAM MARK 1.svg @@ -1,10 +1,10 @@ + + + + + - - - - - diff --git a/packages/stream_chat_flutter/lib/svgs/UI_Reverse Pagination Loading.svg b/packages/stream_chat_flutter/lib/svgs/UI_Reverse Pagination Loading.svg index dfc3754f..487388a5 100644 --- a/packages/stream_chat_flutter/lib/svgs/UI_Reverse Pagination Loading.svg +++ b/packages/stream_chat_flutter/lib/svgs/UI_Reverse Pagination Loading.svg @@ -1,14 +1,14 @@ + + + + + + + + + - - - - - - - - - diff --git a/packages/stream_chat_flutter/lib/svgs/filetype_DOC.svg b/packages/stream_chat_flutter/lib/svgs/filetype_DOC.svg index 4233055a..36ce7610 100644 --- a/packages/stream_chat_flutter/lib/svgs/filetype_DOC.svg +++ b/packages/stream_chat_flutter/lib/svgs/filetype_DOC.svg @@ -1,12 +1,12 @@ + + + + + + - - - - - - diff --git a/packages/stream_chat_flutter/lib/svgs/filetype_DOCX.svg b/packages/stream_chat_flutter/lib/svgs/filetype_DOCX.svg index 3077f515..dea4b040 100644 --- a/packages/stream_chat_flutter/lib/svgs/filetype_DOCX.svg +++ b/packages/stream_chat_flutter/lib/svgs/filetype_DOCX.svg @@ -1,12 +1,12 @@ + + + + + + - - - - - - diff --git a/packages/stream_chat_flutter/lib/svgs/filetype_Generic.svg b/packages/stream_chat_flutter/lib/svgs/filetype_Generic.svg index 3ec0f239..453ee694 100644 --- a/packages/stream_chat_flutter/lib/svgs/filetype_Generic.svg +++ b/packages/stream_chat_flutter/lib/svgs/filetype_Generic.svg @@ -1,11 +1,11 @@ + + + + + + - - - - - - diff --git a/packages/stream_chat_flutter/lib/svgs/filetype_PPT.svg b/packages/stream_chat_flutter/lib/svgs/filetype_PPT.svg index 0541a496..1d3d429c 100644 --- a/packages/stream_chat_flutter/lib/svgs/filetype_PPT.svg +++ b/packages/stream_chat_flutter/lib/svgs/filetype_PPT.svg @@ -1,12 +1,12 @@ + + + + + + - - - - - - diff --git a/packages/stream_chat_flutter/lib/svgs/filetype_PPTX-1.svg b/packages/stream_chat_flutter/lib/svgs/filetype_PPTX-1.svg index a50efd64..c6d866a1 100644 --- a/packages/stream_chat_flutter/lib/svgs/filetype_PPTX-1.svg +++ b/packages/stream_chat_flutter/lib/svgs/filetype_PPTX-1.svg @@ -1,12 +1,12 @@ + + + + + + - - - - - - diff --git a/packages/stream_chat_flutter/lib/svgs/filetype_PPTX.svg b/packages/stream_chat_flutter/lib/svgs/filetype_PPTX.svg index 83339acc..920fbb62 100644 --- a/packages/stream_chat_flutter/lib/svgs/filetype_PPTX.svg +++ b/packages/stream_chat_flutter/lib/svgs/filetype_PPTX.svg @@ -1,12 +1,12 @@ + + + + + + - - - - - - diff --git a/packages/stream_chat_flutter/lib/svgs/filetype_XLS.svg b/packages/stream_chat_flutter/lib/svgs/filetype_XLS.svg index eec9a05d..60820220 100644 --- a/packages/stream_chat_flutter/lib/svgs/filetype_XLS.svg +++ b/packages/stream_chat_flutter/lib/svgs/filetype_XLS.svg @@ -1,12 +1,12 @@ + + + + + + - - - - - - diff --git a/packages/stream_chat_flutter/lib/svgs/filetype_XLSX.svg b/packages/stream_chat_flutter/lib/svgs/filetype_XLSX.svg index 6203aa27..c71ff20b 100644 --- a/packages/stream_chat_flutter/lib/svgs/filetype_XLSX.svg +++ b/packages/stream_chat_flutter/lib/svgs/filetype_XLSX.svg @@ -1,12 +1,12 @@ + + + + + + - - - - - - diff --git a/packages/stream_chat_flutter/lib/svgs/imgur.svg b/packages/stream_chat_flutter/lib/svgs/imgur.svg index 1df5d71f..71ab1fc5 100644 --- a/packages/stream_chat_flutter/lib/svgs/imgur.svg +++ b/packages/stream_chat_flutter/lib/svgs/imgur.svg @@ -1,12 +1,12 @@ + + + + + - - - - - diff --git a/packages/stream_chat_flutter/pubspec.yaml b/packages/stream_chat_flutter/pubspec.yaml index 40894d3a..86dcd0f6 100644 --- a/packages/stream_chat_flutter/pubspec.yaml +++ b/packages/stream_chat_flutter/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat_flutter homepage: https://github.com/GetStream/stream-chat-flutter description: Stream Chat official Flutter SDK. Build your own chat experience using Dart and Flutter. -version: 3.3.1 +version: 3.3.2 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -36,7 +36,7 @@ dependencies: rxdart: ^0.27.0 share_plus: ^3.0.4 shimmer: ^2.0.0 - stream_chat_flutter_core: ^3.3.0 + stream_chat_flutter_core: ^3.3.1 substring_highlight: ^1.0.26 synchronized: ^3.0.0 url_launcher: ^6.0.3 diff --git a/packages/stream_chat_flutter_core/CHANGELOG.md b/packages/stream_chat_flutter_core/CHANGELOG.md index 9d0731aa..b69c4262 100644 --- a/packages/stream_chat_flutter_core/CHANGELOG.md +++ b/packages/stream_chat_flutter_core/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.3.1 + +- Updated `stream_chat` dependency to [`3.3.1`](https://pub.dev/packages/stream_chat/changelog). + ## 3.3.0 - Updated `stream_chat` dependency to [`3.3.0`](https://pub.dev/packages/stream_chat/changelog). diff --git a/packages/stream_chat_flutter_core/pubspec.yaml b/packages/stream_chat_flutter_core/pubspec.yaml index 48d104f3..1b1734be 100644 --- a/packages/stream_chat_flutter_core/pubspec.yaml +++ b/packages/stream_chat_flutter_core/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat_flutter_core homepage: https://github.com/GetStream/stream-chat-flutter description: Stream Chat official Flutter SDK Core. Build your own chat experience using Dart and Flutter. -version: 3.3.0 +version: 3.3.1 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -11,12 +11,12 @@ environment: dependencies: collection: ^1.15.0 - connectivity_plus: ^2.0.2 + connectivity_plus: ^2.1.0 flutter: sdk: flutter meta: ^1.3.0 rxdart: ^0.27.0 - stream_chat: ^3.3.0 + stream_chat: ^3.3.1 dev_dependencies: dart_code_metrics: ^4.4.0