diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index 1f722427..64713f38 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -10,6 +10,8 @@ assignees: '' **Describe the bug** A clear and concise description of what the bug is. +**What package are you using? What version?** + **To Reproduce** Steps to reproduce the behavior: 1. Go to '...' diff --git a/README.md b/README.md index 8f46dfbd..6260cf24 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ **Quick Links** - [Register](https://getstream.io/chat/trial/) to get an API key for Stream Chat -- [Flutter Chat Tutorial](https://getstream.io/chat/flutter/tutorial/) +- [Flutter Chat SDK Tutorial](https://getstream.io/chat/flutter/tutorial/) - [Chat UI Kit](https://getstream.io/chat/ui-kit/) - [Sample apps](https://github.com/GetStream/flutter-samples) diff --git a/packages/stream_chat/CHANGELOG.md b/packages/stream_chat/CHANGELOG.md index 676dbec4..30ae46f7 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -1,3 +1,14 @@ +## 1.3.1-beta + +- Debounced frequent db calls + +## 1.3.0-beta + +- Save pinned messages in offline storage +- Minor fixes +- `StreamClient.QueryChannels` now returns a Stream and fetches the channels from storage before calling the api +- Added `StreamClient.QueryChannelsOnline` and `StreamClient.QueryChannelsOffline` to fetch channels only from online or offline + ## 1.2.0-beta - 🛑 **BREAKING** Changed signature of `StreamClient.search` method diff --git a/packages/stream_chat/lib/src/api/channel.dart b/packages/stream_chat/lib/src/api/channel.dart index 1f5da466..97ce9a96 100644 --- a/packages/stream_chat/lib/src/api/channel.dart +++ b/packages/stream_chat/lib/src/api/channel.dart @@ -7,6 +7,7 @@ import 'package:dio/dio.dart'; import 'package:logging/logging.dart'; import 'package:rxdart/rxdart.dart'; import 'package:stream_chat/src/api/retry_queue.dart'; +import 'package:stream_chat/src/debounce.dart'; import 'package:stream_chat/src/event_type.dart'; import 'package:stream_chat/src/models/attachment_file.dart'; import 'package:stream_chat/src/models/channel_state.dart'; @@ -237,9 +238,15 @@ class Channel { } void onSendProgress(int sent, int total) { - updateAttachment(it.copyWith( - uploadState: UploadState.inProgress(uploaded: sent, total: total), - )); + debounce( + timeout: Duration(seconds: 1), + target: updateAttachment, + positionalArguments: [ + it.copyWith( + uploadState: UploadState.inProgress(uploaded: sent, total: total), + ), + ], + ); } final isImage = it.type == 'image'; @@ -1441,7 +1448,7 @@ class ChannelClientState { final oldIndex = newMessages.indexWhere((m) => m.id == message.id); if (oldIndex != -1) { - newMessages[oldIndex] = newMessages[oldIndex].merge(message); + newMessages[oldIndex] = message; } else { newMessages.add(message); } @@ -1685,7 +1692,11 @@ class ChannelClientState { set _channelState(ChannelState v) { _channelStateController.add(v); - _channel._client.chatPersistenceClient?.updateChannelState(v); + debounce( + timeout: Duration(milliseconds: 500), + target: _channel._client.chatPersistenceClient?.updateChannelState, + positionalArguments: [v], + ); } /// The channel threads related to this channel diff --git a/packages/stream_chat/lib/src/api/retry_queue.dart b/packages/stream_chat/lib/src/api/retry_queue.dart index de3ca610..34046545 100644 --- a/packages/stream_chat/lib/src/api/retry_queue.dart +++ b/packages/stream_chat/lib/src/api/retry_queue.dart @@ -47,6 +47,7 @@ class RetryQueue { /// Add a list of messages void add(List messages) { + logger?.info('added ${messages.length} messages'); final messageList = _messageQueue.toList(); _messageQueue.addAll(messages .where((element) => !messageList.any((m) => m.id == element.id))); diff --git a/packages/stream_chat/lib/src/client.dart b/packages/stream_chat/lib/src/client.dart index 2c36f4f6..cf68a4ca 100644 --- a/packages/stream_chat/lib/src/client.dart +++ b/packages/stream_chat/lib/src/client.dart @@ -350,7 +350,7 @@ class StreamChatClient { Map get _httpHeaders => { 'Authorization': token, 'stream-auth-type': _authType, - 'x-stream-client': _userAgent, + 'X-Stream-Client': _userAgent, 'Content-Encoding': 'gzip', }; @@ -468,9 +468,9 @@ class StreamChatClient { user: state.user, connectParams: { 'api_key': apiKey, - 'authorization': token, + 'Authorization': token, 'stream-auth-type': _authType, - 'x-stream-client': _userAgent, + 'X-Stream-Client': _userAgent, }, connectPayload: { 'user_id': state.user.id, diff --git a/packages/stream_chat/lib/src/debounce.dart b/packages/stream_chat/lib/src/debounce.dart new file mode 100644 index 00000000..f1cf05a4 --- /dev/null +++ b/packages/stream_chat/lib/src/debounce.dart @@ -0,0 +1,28 @@ +import 'dart:async'; + +import 'package:meta/meta.dart'; + +/// Map of timeouts being debounced +Map timeouts = {}; + +/// Runs a function avoiding calling it too many times in a [timeoutMS] window +void debounce({ + @required Duration timeout, + @required Function target, + List positionalArguments, + Map namedArguments, +}) { + if (timeouts.containsKey(target)) { + timeouts[target].cancel(); + } + + final timer = Timer(timeout, () { + Function.apply( + target, + positionalArguments, + namedArguments, + ); + }); + + timeouts[target] = timer; +} diff --git a/packages/stream_chat/lib/src/platform_detector/platform_detector.dart b/packages/stream_chat/lib/src/platform_detector/platform_detector.dart index 8f601501..32748256 100644 --- a/packages/stream_chat/lib/src/platform_detector/platform_detector.dart +++ b/packages/stream_chat/lib/src/platform_detector/platform_detector.dart @@ -2,26 +2,56 @@ import 'platform_detector_stub.dart' if (dart.library.html) 'platform_detector_web.dart' if (dart.library.io) 'platform_detector_io.dart'; +/// Possible platforms enum PlatformType { + /// Android, + + /// Ios, + + /// Web, + + /// MacOS, + + /// Windows, + + /// Linux, + + /// Fuchsia, } +/// Utility class that provides information on the current platform class CurrentPlatform { CurrentPlatform._(); + + /// True if the app is running on android static bool get isAndroid => type == PlatformType.Android; + + /// True if the app is running on ios static bool get isIos => type == PlatformType.Ios; + + /// True if the app is running on web static bool get isWeb => type == PlatformType.Web; + + /// True if the app is running on macos static bool get isMacOS => type == PlatformType.MacOS; + + /// True if the app is running on windows static bool get isWindows => type == PlatformType.Windows; + + /// True if the app is running on linux static bool get isLinux => type == PlatformType.Linux; + + /// True if the app is running on fuchsia static bool get isFuchsia => type == PlatformType.Fuchsia; + /// Returns a string version of the platform static String get name { switch (type) { case PlatformType.Android: @@ -43,5 +73,6 @@ class CurrentPlatform { } } + /// Get current platform type static PlatformType get type => currentPlatform; } diff --git a/packages/stream_chat/lib/src/platform_detector/platform_detector_io.dart b/packages/stream_chat/lib/src/platform_detector/platform_detector_io.dart index 6cca45b6..df74f5d8 100644 --- a/packages/stream_chat/lib/src/platform_detector/platform_detector_io.dart +++ b/packages/stream_chat/lib/src/platform_detector/platform_detector_io.dart @@ -1,6 +1,7 @@ import 'dart:io'; import 'platform_detector.dart'; +/// Version running on native systems PlatformType get currentPlatform { if (Platform.isWindows) return PlatformType.Windows; if (Platform.isFuchsia) return PlatformType.Fuchsia; diff --git a/packages/stream_chat/lib/src/platform_detector/platform_detector_stub.dart b/packages/stream_chat/lib/src/platform_detector/platform_detector_stub.dart index 4469fc46..f9143deb 100644 --- a/packages/stream_chat/lib/src/platform_detector/platform_detector_stub.dart +++ b/packages/stream_chat/lib/src/platform_detector/platform_detector_stub.dart @@ -1,5 +1,6 @@ import 'platform_detector.dart'; +/// Stub implementation PlatformType get currentPlatform { throw UnimplementedError(); } diff --git a/packages/stream_chat/lib/src/platform_detector/platform_detector_web.dart b/packages/stream_chat/lib/src/platform_detector/platform_detector_web.dart index b1613afb..4274bf71 100644 --- a/packages/stream_chat/lib/src/platform_detector/platform_detector_web.dart +++ b/packages/stream_chat/lib/src/platform_detector/platform_detector_web.dart @@ -1,3 +1,4 @@ import 'platform_detector.dart'; +/// Version running on web PlatformType get currentPlatform => PlatformType.Web; diff --git a/packages/stream_chat/lib/version.dart b/packages/stream_chat/lib/version.dart index 6cd8c4bc..9f8f93a9 100644 --- a/packages/stream_chat/lib/version.dart +++ b/packages/stream_chat/lib/version.dart @@ -1,5 +1,5 @@ import 'package:stream_chat/src/client.dart'; /// Current package version -/// Used in [StreamChatClient] to build the `x-stream-client` header -const PACKAGE_VERSION = '1.2.0-beta'; +/// Used in [StreamChatClient] to build the `X-Stream-Client` header +const PACKAGE_VERSION = '1.3.1-beta'; diff --git a/packages/stream_chat/pubspec.yaml b/packages/stream_chat/pubspec.yaml index a625f95b..63d41615 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: 1.2.0-beta +version: 1.3.1-beta repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues diff --git a/packages/stream_chat_flutter/CHANGELOG.md b/packages/stream_chat_flutter/CHANGELOG.md index 1e04d3cc..967536dd 100644 --- a/packages/stream_chat_flutter/CHANGELOG.md +++ b/packages/stream_chat_flutter/CHANGELOG.md @@ -1,7 +1,21 @@ +## 1.3.1-beta + +- Updated `stream_chat_core` dependency +- Fixed minor bugs + +## 1.3.0-beta + +- Added `MessageInputTheme` +- Fixed overflow in `MessageInput` animation +- Delete only image on imagegallery +- Close keyboard after sending a command +- Exposed `customAttachmentBuilders` through `MessageListView` +- Updated `stream_chat_core` dependency + ## 1.2.0-beta - Minor fixes -- Update stream_chat_core dependency +- Updated `stream_chat_core` dependency ## 1.1.1-beta diff --git a/packages/stream_chat_flutter/example/pubspec.yaml b/packages/stream_chat_flutter/example/pubspec.yaml index 7a1863b0..4d32fb58 100644 --- a/packages/stream_chat_flutter/example/pubspec.yaml +++ b/packages/stream_chat_flutter/example/pubspec.yaml @@ -25,8 +25,7 @@ dependencies: sdk: flutter stream_chat_flutter: path: ../ - stream_chat_persistence: - path: ../../stream_chat_persistence + stream_chat_persistence: ^1.3.0-beta # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. diff --git a/packages/stream_chat_flutter/lib/src/channel_file_display_screen.dart b/packages/stream_chat_flutter/lib/src/channel_file_display_screen.dart index a010a500..a6be5555 100644 --- a/packages/stream_chat_flutter/lib/src/channel_file_display_screen.dart +++ b/packages/stream_chat_flutter/lib/src/channel_file_display_screen.dart @@ -38,7 +38,7 @@ class _ChannelFileDisplayScreenState extends State { messageSearchBloc.search( filter: { 'cid': { - r'$in': ['messaging:${StreamChannel.of(context).channel.id}'] + r'$in': [StreamChannel.of(context).channel.cid] } }, messageFilter: { @@ -146,7 +146,7 @@ class _ChannelFileDisplayScreenState extends State { onEndOfPage: () => messageSearchBloc.loadMore( filter: { 'cid': { - r'$in': ['messaging:${StreamChannel.of(context).channel.id}'] + r'$in': [StreamChannel.of(context).channel.cid] } }, messageFilter: { diff --git a/packages/stream_chat_flutter/lib/src/channel_list_view.dart b/packages/stream_chat_flutter/lib/src/channel_list_view.dart index 9edd39ff..3bab76b2 100644 --- a/packages/stream_chat_flutter/lib/src/channel_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/channel_list_view.dart @@ -1,6 +1,3 @@ -import 'dart:async'; -import 'dart:convert'; - import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_slidable/flutter_slidable.dart'; diff --git a/packages/stream_chat_flutter/lib/src/channel_media_display_screen.dart b/packages/stream_chat_flutter/lib/src/channel_media_display_screen.dart index ab2e2055..87ab2f3b 100644 --- a/packages/stream_chat_flutter/lib/src/channel_media_display_screen.dart +++ b/packages/stream_chat_flutter/lib/src/channel_media_display_screen.dart @@ -44,7 +44,7 @@ class _ChannelMediaDisplayScreenState extends State { messageSearchBloc.search( filter: { 'cid': { - r'$in': ['messaging:${StreamChannel.of(context).channel.id}'] + r'$in': [StreamChannel.of(context).channel.cid], } }, messageFilter: { @@ -169,7 +169,7 @@ class _ChannelMediaDisplayScreenState extends State { onEndOfPage: () => messageSearchBloc.loadMore( filter: { 'cid': { - r'$in': ['messaging:${StreamChannel.of(context).channel.id}'] + r'$in': [StreamChannel.of(context).channel.cid] } }, messageFilter: { diff --git a/packages/stream_chat_flutter/lib/src/stream_chat_theme.dart b/packages/stream_chat_flutter/lib/src/stream_chat_theme.dart index 338e2603..aa4f51f0 100644 --- a/packages/stream_chat_flutter/lib/src/stream_chat_theme.dart +++ b/packages/stream_chat_flutter/lib/src/stream_chat_theme.dart @@ -845,7 +845,9 @@ class ChannelHeaderTheme { } } +/// Defines the theme dedicated to the [MessageInput] widget class MessageInputTheme { + /// Duration of the [MessageInput] send button animation final Duration sendAnimationDuration; /// Background color of [MessageInput] send button @@ -863,6 +865,7 @@ class MessageInputTheme { /// Background color of [MessageInput] final Color inputBackground; + /// Returns a new [MessageInputTheme] const MessageInputTheme({ this.sendAnimationDuration, this.actionButtonColor, @@ -872,6 +875,7 @@ class MessageInputTheme { this.inputBackground, }); + /// Returns a new [MessageInputTheme] replacing some of its properties MessageInputTheme copyWith({ Duration sendAnimationDuration, Color inputBackground, @@ -891,6 +895,7 @@ class MessageInputTheme { sendButtonIdleColor: sendButtonIdleColor ?? this.sendButtonIdleColor, ); + /// Merges [this] [MessageInputTheme] with the [other] MessageInputTheme merge(MessageInputTheme other) { if (other == null) return this; return copyWith( diff --git a/packages/stream_chat_flutter/lib/src/system_message.dart b/packages/stream_chat_flutter/lib/src/system_message.dart index 7b4dc243..941db18d 100644 --- a/packages/stream_chat_flutter/lib/src/system_message.dart +++ b/packages/stream_chat_flutter/lib/src/system_message.dart @@ -56,19 +56,20 @@ class SystemMessage extends StatelessWidget { onMessageTap(message); } }, - child: Container( - width: double.infinity, - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - divider, - Padding( - padding: const EdgeInsets.symmetric(horizontal: 32.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + divider, + Flexible( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 2.0), child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( message.text, + softWrap: true, style: TextStyle( fontSize: 10, color: Theme.of(context) @@ -107,9 +108,9 @@ class SystemMessage extends StatelessWidget { ], ), ), - divider, - ], - ), + ), + divider, + ], ), ); } diff --git a/packages/stream_chat_flutter/pubspec.yaml b/packages/stream_chat_flutter/pubspec.yaml index 8fcf99a7..b0192aa1 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: 1.2.0-beta +version: 1.3.1-beta repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -11,7 +11,7 @@ environment: dependencies: flutter: sdk: flutter - stream_chat_flutter_core: ^1.2.0-beta + stream_chat_flutter_core: ^1.3.0-beta flutter_app_badger: ^1.1.2 photo_view: ^0.10.3 rxdart: ^0.25.0 diff --git a/packages/stream_chat_flutter_core/CHANGELOG.md b/packages/stream_chat_flutter_core/CHANGELOG.md index 737fe5cc..bbf8b9f5 100644 --- a/packages/stream_chat_flutter_core/CHANGELOG.md +++ b/packages/stream_chat_flutter_core/CHANGELOG.md @@ -1,3 +1,12 @@ +## 1.3.1-beta + +* Update llc dependency + +## 1.3.0-beta + +* Update llc dependency +* Minor fixes + ## 1.2.0-beta * Update llc dependency diff --git a/packages/stream_chat_flutter_core/pubspec.yaml b/packages/stream_chat_flutter_core/pubspec.yaml index e9ce119b..bbb58a13 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: 1.2.0-beta +version: 1.3.1-beta repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -10,7 +10,7 @@ environment: flutter: ">=1.17.0" dependencies: - stream_chat: ^1.2.0-beta + stream_chat: ^1.3.1-beta flutter: sdk: flutter rxdart: ^0.25.0 diff --git a/packages/stream_chat_persistence/CHANGELOG.md b/packages/stream_chat_persistence/CHANGELOG.md index c214c008..fab0e874 100644 --- a/packages/stream_chat_persistence/CHANGELOG.md +++ b/packages/stream_chat_persistence/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.3.0-beta + +* Update llc dependency + ## 1.2.0-beta * Update llc dependency diff --git a/packages/stream_chat_persistence/example/pubspec.yaml b/packages/stream_chat_persistence/example/pubspec.yaml index 2586bea6..f70d9d93 100644 --- a/packages/stream_chat_persistence/example/pubspec.yaml +++ b/packages/stream_chat_persistence/example/pubspec.yaml @@ -11,8 +11,7 @@ dependencies: flutter: sdk: flutter cupertino_icons: ^1.0.0 - stream_chat: - path: ../../stream_chat + stream_chat: ^1.3.0 stream_chat_persistence: path: ../ diff --git a/packages/stream_chat_persistence/pubspec.yaml b/packages/stream_chat_persistence/pubspec.yaml index 9551507e..bd32d8f3 100644 --- a/packages/stream_chat_persistence/pubspec.yaml +++ b/packages/stream_chat_persistence/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat_persistence homepage: https://github.com/GetStream/stream-chat-flutter description: Official Stream Chat Persistence library. Build your own chat experience using Dart and Flutter. -version: 1.2.0-beta +version: 1.3.0-beta repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -13,8 +13,7 @@ dependencies: path: ^1.7.0 path_provider: ^1.6.27 sqlite3_flutter_libs: ^0.4.0+1 - stream_chat: - path: ../stream_chat + stream_chat: ^1.3.0-beta dev_dependencies: test: ^1.15.7