From 3ab1e1956ecea5c30bb68347bf872f9db09fb6f8 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 19 May 2021 12:43:52 +0200 Subject: [PATCH 01/27] bump changelogs and pubspecs --- packages/stream_chat/CHANGELOG.md | 6 ++++++ packages/stream_chat/lib/version.dart | 2 +- packages/stream_chat/pubspec.yaml | 4 ++-- packages/stream_chat_flutter/CHANGELOG.md | 6 ++++++ packages/stream_chat_flutter/pubspec.yaml | 8 ++++---- packages/stream_chat_flutter_core/CHANGELOG.md | 5 +++++ packages/stream_chat_flutter_core/pubspec.yaml | 8 ++++---- packages/stream_chat_persistence/CHANGELOG.md | 6 ++++++ packages/stream_chat_persistence/pubspec.yaml | 6 +++--- 9 files changed, 37 insertions(+), 14 deletions(-) diff --git a/packages/stream_chat/CHANGELOG.md b/packages/stream_chat/CHANGELOG.md index 7fc05197..75fecc34 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -1,3 +1,9 @@ +## 2.0.0-nullsafety.2 + +- Added new `Filter.raw` constructor +- Changed extraData +- Minor fixes + ## 2.0.0-nullsafety.1 - Migrate this package to null safety diff --git a/packages/stream_chat/lib/version.dart b/packages/stream_chat/lib/version.dart index ef903a2a..6c68818a 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.dart'; /// Current package version /// Used in [StreamChatClient] to build the `x-stream-client` header // ignore: constant_identifier_names -const PACKAGE_VERSION = '2.0.0-nullsafety.1'; +const PACKAGE_VERSION = '2.0.0-nullsafety.2'; diff --git a/packages/stream_chat/pubspec.yaml b/packages/stream_chat/pubspec.yaml index 6b8ee0aa..d473beea 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: 2.0.0-nullsafety.1 +version: 2.0.0-nullsafety.2 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -19,7 +19,7 @@ dependencies: logging: ^1.0.1 meta: ^1.3.0 mime: ^1.0.0 - rxdart: ^0.26.0 + rxdart: ^0.27.0 uuid: ^3.0.4 web_socket_channel: ^2.0.0 diff --git a/packages/stream_chat_flutter/CHANGELOG.md b/packages/stream_chat_flutter/CHANGELOG.md index 9d3b372e..e0b60fad 100644 --- a/packages/stream_chat_flutter/CHANGELOG.md +++ b/packages/stream_chat_flutter/CHANGELOG.md @@ -1,3 +1,9 @@ +## 2.0.0-nullsafety.4 + +- Minor fixes and improvements +- Updated `stream_chat_core` dependency +- Improved performance of `MessageWidget` component + ## 2.0.0-nullsafety.3 - Fix MessageInput overflow when there are no actions diff --git a/packages/stream_chat_flutter/pubspec.yaml b/packages/stream_chat_flutter/pubspec.yaml index 1b2dbe2f..2aa5ab4a 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: 2.0.0-nullsafety.3 +version: 2.0.0-nullsafety.4 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -30,13 +30,13 @@ dependencies: lottie: ^1.0.1 meta: ^1.3.0 path_provider: ^2.0.1 - photo_manager: ^1.1.4 + photo_manager: ^1.1.6 photo_view: ^0.11.1 - rxdart: ^0.26.0 + rxdart: ^0.27.0 scrollable_positioned_list: ^0.2.0-nullsafety.0 share_plus: ^2.0.3 shimmer: ^2.0.0 - stream_chat_flutter_core: ^2.0.0-nullsafety.2 + stream_chat_flutter_core: ^2.0.0-nullsafety.3 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 f07b49bd..1930e36a 100644 --- a/packages/stream_chat_flutter_core/CHANGELOG.md +++ b/packages/stream_chat_flutter_core/CHANGELOG.md @@ -1,3 +1,8 @@ +## 2.0.0-nullsafety.3 + +* Update llc dependency +* Minor fixes and improvements + ## 2.0.0-nullsafety.2 * Fix ChannelsBloc not performing calls if pagination ended diff --git a/packages/stream_chat_flutter_core/pubspec.yaml b/packages/stream_chat_flutter_core/pubspec.yaml index c84242b8..e8d1014d 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: 2.0.0-nullsafety.2 +version: 2.0.0-nullsafety.3 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -10,12 +10,12 @@ environment: flutter: ">=1.17.0" dependencies: - collection: ^1.15.0-nullsafety.4 + collection: ^1.15.0 flutter: sdk: flutter meta: ^1.3.0 - rxdart: ^0.26.0 - stream_chat: ^2.0.0-nullsafety.1 + rxdart: ^0.27.0 + stream_chat: ^2.0.0-nullsafety.2 dev_dependencies: fake_async: ^1.2.0 diff --git a/packages/stream_chat_persistence/CHANGELOG.md b/packages/stream_chat_persistence/CHANGELOG.md index 961e3de0..c35459ca 100644 --- a/packages/stream_chat_persistence/CHANGELOG.md +++ b/packages/stream_chat_persistence/CHANGELOG.md @@ -1,3 +1,9 @@ +## 2.0.0-nullsafety.2 + +* Update llc dependency +* Minor fixes and improvements +* Fixed bug not saving message.mentioned_users + ## 2.0.0-nullsafety.1 * Migrate this package to null safety diff --git a/packages/stream_chat_persistence/pubspec.yaml b/packages/stream_chat_persistence/pubspec.yaml index 5d1927c3..661f55bb 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: 2.0.0-nullsafety.1 +version: 2.0.0-nullsafety.2 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -17,8 +17,8 @@ dependencies: mutex: ^3.0.0 path: ^1.8.0 path_provider: ^2.0.1 - sqlite3_flutter_libs: ^0.4.1 - stream_chat: ^2.0.0-nullsafety.0 + sqlite3_flutter_libs: ^0.4.2 + stream_chat: ^2.0.0-nullsafety.2 dev_dependencies: build_runner: ^2.0.1 From f5e73d3cc61c2073da6df5c6d43e7aceb8891268 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 19 May 2021 12:59:21 +0200 Subject: [PATCH 02/27] update rxdart --- packages/stream_chat/lib/src/api/channel.dart | 12 ++++++------ packages/stream_chat/lib/src/client.dart | 4 ++-- .../lib/src/channel_list_core.dart | 2 ++ .../lib/src/channels_bloc.dart | 4 ++-- .../lib/src/message_search_bloc.dart | 3 +-- .../stream_chat_flutter_core/lib/src/users_bloc.dart | 2 +- 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/packages/stream_chat/lib/src/api/channel.dart b/packages/stream_chat/lib/src/api/channel.dart index cb3cfe37..69d967fe 100644 --- a/packages/stream_chat/lib/src/api/channel.dart +++ b/packages/stream_chat/lib/src/api/channel.dart @@ -1427,7 +1427,7 @@ class ChannelClientState { /// This flag should be managed by UI sdks. /// When false, any new message (received by WebSocket event /// - [EventType.messageNew]) will not be pushed on to message list. - bool get isUpToDate => _isUpToDateController.value ?? true; + bool get isUpToDate => _isUpToDateController.value; set isUpToDate(bool isUpToDate) => _isUpToDateController.add(isUpToDate); @@ -1528,7 +1528,7 @@ class ChannelClientState { } if (_countMessageAsUnread(message)) { - _unreadCountController.add(_unreadCountController.value! + 1); + _unreadCountController.add(_unreadCountController.value + 1); } })); } @@ -1766,13 +1766,13 @@ class ChannelClientState { a.createdAt.compareTo(b.createdAt); /// The channel state related to this client - ChannelState get _channelState => _channelStateController.value!; + ChannelState get _channelState => _channelStateController.value; /// The channel state related to this client as a stream Stream get channelStateStream => _channelStateController.stream; /// The channel state related to this client - ChannelState get channelState => _channelStateController.value!; + ChannelState get channelState => _channelStateController.value; late BehaviorSubject _channelStateController; final Debounce _debouncedUpdatePersistenceChannelState; @@ -1784,7 +1784,7 @@ class ChannelClientState { /// The channel threads related to this channel Map> get threads => - _threadsController.value!.map((key, value) => MapEntry(key, value)); + _threadsController.value.map((key, value) => MapEntry(key, value)); /// The channel threads related to this channel as a stream Stream>> get threadsStream => @@ -1801,7 +1801,7 @@ class ChannelClientState { } /// Channel related typing users last value - List get typingEvents => _typingEventsController.value!; + List get typingEvents => _typingEventsController.value; /// Channel related typing users stream Stream> get typingEventsStream => _typingEventsController.stream; diff --git a/packages/stream_chat/lib/src/client.dart b/packages/stream_chat/lib/src/client.dart index 3cabe274..b6efb6a5 100644 --- a/packages/stream_chat/lib/src/client.dart +++ b/packages/stream_chat/lib/src/client.dart @@ -1495,7 +1495,7 @@ class ClientState { Stream get userStream => _userController.stream; /// The current user - Map get users => _usersController.value!; + Map get users => _usersController.value; /// The current user as a stream Stream> get usersStream => _usersController.stream; @@ -1517,7 +1517,7 @@ class ClientState { _channelsController.stream; /// The current list of channels in memory - Map get channels => _channelsController.value!; + Map get channels => _channelsController.value; set channels(Map v) { _channelsController.add(v); diff --git a/packages/stream_chat_flutter_core/lib/src/channel_list_core.dart b/packages/stream_chat_flutter_core/lib/src/channel_list_core.dart index a3be273d..dbd57269 100644 --- a/packages/stream_chat_flutter_core/lib/src/channel_list_core.dart +++ b/packages/stream_chat_flutter_core/lib/src/channel_list_core.dart @@ -132,6 +132,8 @@ class ChannelListCoreState extends State { stream: channelsBlocState.channelsStream, builder: (context, snapshot) { if (snapshot.hasError) { + print(snapshot.error); + print(snapshot.stackTrace); return widget.errorBuilder(context, snapshot.error!); } if (!snapshot.hasData) { diff --git a/packages/stream_chat_flutter_core/lib/src/channels_bloc.dart b/packages/stream_chat_flutter_core/lib/src/channels_bloc.dart index d46ee4bd..a3f0b58c 100644 --- a/packages/stream_chat_flutter_core/lib/src/channels_bloc.dart +++ b/packages/stream_chat_flutter_core/lib/src/channels_bloc.dart @@ -71,7 +71,7 @@ class ChannelsBlocState extends State } /// The current channel list - List? get channels => _channelsController.value; + List? get channels => _channelsController.valueOrNull; /// The current channel list as a stream Stream> get channelsStream => _channelsController.stream; @@ -128,7 +128,7 @@ class ChannelsBlocState extends State _channelsController.add(temp); } if (_channelsController.hasValue && - _queryChannelsLoadingController.value!) { + _queryChannelsLoadingController.value) { _queryChannelsLoadingController.sink.add(false); } } diff --git a/packages/stream_chat_flutter_core/lib/src/message_search_bloc.dart b/packages/stream_chat_flutter_core/lib/src/message_search_bloc.dart index 386ba388..70e6df11 100644 --- a/packages/stream_chat_flutter_core/lib/src/message_search_bloc.dart +++ b/packages/stream_chat_flutter_core/lib/src/message_search_bloc.dart @@ -93,8 +93,7 @@ class MessageSearchBlocState extends State final temp = oldMessages + messages.results; _messageResponses.add(temp); } - if (_messageResponses.hasValue && - _queryMessagesLoadingController.value!) { + if (_messageResponses.hasValue && _queryMessagesLoadingController.value) { _queryMessagesLoadingController.add(false); } } catch (e, stk) { diff --git a/packages/stream_chat_flutter_core/lib/src/users_bloc.dart b/packages/stream_chat_flutter_core/lib/src/users_bloc.dart index 57edfecb..0c0d46cd 100644 --- a/packages/stream_chat_flutter_core/lib/src/users_bloc.dart +++ b/packages/stream_chat_flutter_core/lib/src/users_bloc.dart @@ -92,7 +92,7 @@ class UsersBlocState extends State final temp = oldUsers + usersResponse.users; _usersController.add(temp); } - if (_usersController.hasValue && _queryUsersLoadingController.value!) { + if (_usersController.hasValue && _queryUsersLoadingController.value) { _queryUsersLoadingController.add(false); } } catch (e, stk) { From d7edb844f77453d9eb9f5a72496c1e5d539d2b0f Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 19 May 2021 13:11:23 +0200 Subject: [PATCH 03/27] regenerate files --- .../lib/src/db/moor_chat_database.g.dart | 296 +++++++++--------- 1 file changed, 142 insertions(+), 154 deletions(-) diff --git a/packages/stream_chat_persistence/lib/src/db/moor_chat_database.g.dart b/packages/stream_chat_persistence/lib/src/db/moor_chat_database.g.dart index b8d404b2..8da71717 100644 --- a/packages/stream_chat_persistence/lib/src/db/moor_chat_database.g.dart +++ b/packages/stream_chat_persistence/lib/src/db/moor_chat_database.g.dart @@ -60,31 +60,30 @@ class ChannelEntity extends DataClass implements Insertable { Map data, GeneratedDatabase db, {String? prefix}) { final effectivePrefix = prefix ?? ''; - final stringType = db.typeSystem.forDartType(); - final boolType = db.typeSystem.forDartType(); - final dateTimeType = db.typeSystem.forDartType(); - final intType = db.typeSystem.forDartType(); return ChannelEntity( - id: stringType.mapFromDatabaseResponse(data['${effectivePrefix}id'])!, - type: stringType.mapFromDatabaseResponse(data['${effectivePrefix}type'])!, - cid: stringType.mapFromDatabaseResponse(data['${effectivePrefix}cid'])!, - config: $ChannelsTable.$converter0.mapToDart(stringType + id: const StringType() + .mapFromDatabaseResponse(data['${effectivePrefix}id'])!, + type: const StringType() + .mapFromDatabaseResponse(data['${effectivePrefix}type'])!, + cid: const StringType() + .mapFromDatabaseResponse(data['${effectivePrefix}cid'])!, + config: $ChannelsTable.$converter0.mapToDart(const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}config']))!, - frozen: - boolType.mapFromDatabaseResponse(data['${effectivePrefix}frozen'])!, - lastMessageAt: dateTimeType + frozen: const BoolType() + .mapFromDatabaseResponse(data['${effectivePrefix}frozen'])!, + lastMessageAt: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}last_message_at']), - createdAt: dateTimeType + createdAt: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}created_at'])!, - updatedAt: dateTimeType + updatedAt: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}updated_at'])!, - deletedAt: dateTimeType + deletedAt: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}deleted_at']), - memberCount: intType + memberCount: const IntType() .mapFromDatabaseResponse(data['${effectivePrefix}member_count'])!, - createdById: stringType + createdById: const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}created_by_id']), - extraData: $ChannelsTable.$converter1.mapToDart(stringType + extraData: $ChannelsTable.$converter1.mapToDart(const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}extra_data'])), ); } @@ -226,7 +225,7 @@ class ChannelEntity extends DataClass implements Insertable { $mrjc(createdById.hashCode, extraData.hashCode)))))))))))); @override - bool operator ==(dynamic other) => + bool operator ==(Object other) => identical(this, other) || (other is ChannelEntity && other.id == this.id && @@ -742,56 +741,54 @@ class MessageEntity extends DataClass implements Insertable { Map data, GeneratedDatabase db, {String? prefix}) { final effectivePrefix = prefix ?? ''; - final stringType = db.typeSystem.forDartType(); - final intType = db.typeSystem.forDartType(); - final boolType = db.typeSystem.forDartType(); - final dateTimeType = db.typeSystem.forDartType(); return MessageEntity( - id: stringType.mapFromDatabaseResponse(data['${effectivePrefix}id'])!, - messageText: stringType + id: const StringType() + .mapFromDatabaseResponse(data['${effectivePrefix}id'])!, + messageText: const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}message_text']), - attachments: $MessagesTable.$converter0.mapToDart(stringType + attachments: $MessagesTable.$converter0.mapToDart(const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}attachments']))!, - status: $MessagesTable.$converter1.mapToDart( - intType.mapFromDatabaseResponse(data['${effectivePrefix}status']))!, - type: stringType.mapFromDatabaseResponse(data['${effectivePrefix}type'])!, - mentionedUsers: $MessagesTable.$converter2.mapToDart(stringType + status: $MessagesTable.$converter1.mapToDart(const IntType() + .mapFromDatabaseResponse(data['${effectivePrefix}status']))!, + type: const StringType() + .mapFromDatabaseResponse(data['${effectivePrefix}type'])!, + mentionedUsers: $MessagesTable.$converter2.mapToDart(const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}mentioned_users']))!, - reactionCounts: $MessagesTable.$converter3.mapToDart(stringType + reactionCounts: $MessagesTable.$converter3.mapToDart(const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}reaction_counts'])), - reactionScores: $MessagesTable.$converter4.mapToDart(stringType + reactionScores: $MessagesTable.$converter4.mapToDart(const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}reaction_scores'])), - parentId: stringType + parentId: const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}parent_id']), - quotedMessageId: stringType + quotedMessageId: const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}quoted_message_id']), - replyCount: intType + replyCount: const IntType() .mapFromDatabaseResponse(data['${effectivePrefix}reply_count']), - showInChannel: boolType + showInChannel: const BoolType() .mapFromDatabaseResponse(data['${effectivePrefix}show_in_channel']), - shadowed: - boolType.mapFromDatabaseResponse(data['${effectivePrefix}shadowed'])!, - command: - stringType.mapFromDatabaseResponse(data['${effectivePrefix}command']), - createdAt: dateTimeType + shadowed: const BoolType() + .mapFromDatabaseResponse(data['${effectivePrefix}shadowed'])!, + command: const StringType() + .mapFromDatabaseResponse(data['${effectivePrefix}command']), + createdAt: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}created_at'])!, - updatedAt: dateTimeType + updatedAt: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}updated_at'])!, - deletedAt: dateTimeType + deletedAt: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}deleted_at']), - userId: - stringType.mapFromDatabaseResponse(data['${effectivePrefix}user_id']), - pinned: - boolType.mapFromDatabaseResponse(data['${effectivePrefix}pinned'])!, - pinnedAt: dateTimeType + userId: const StringType() + .mapFromDatabaseResponse(data['${effectivePrefix}user_id']), + pinned: const BoolType() + .mapFromDatabaseResponse(data['${effectivePrefix}pinned'])!, + pinnedAt: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}pinned_at']), - pinExpires: dateTimeType + pinExpires: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}pin_expires']), - pinnedByUserId: stringType + pinnedByUserId: const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}pinned_by_user_id']), - channelCid: stringType + channelCid: const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}channel_cid']), - extraData: $MessagesTable.$converter5.mapToDart(stringType + extraData: $MessagesTable.$converter5.mapToDart(const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}extra_data'])), ); } @@ -1066,7 +1063,7 @@ class MessageEntity extends DataClass implements Insertable { pinned.hashCode, $mrjc(pinnedAt.hashCode, $mrjc(pinExpires.hashCode, $mrjc(pinnedByUserId.hashCode, $mrjc(channelCid.hashCode, extraData.hashCode)))))))))))))))))))))))); @override - bool operator ==(dynamic other) => + bool operator ==(Object other) => identical(this, other) || (other is MessageEntity && other.id == this.id && @@ -1923,56 +1920,57 @@ class PinnedMessageEntity extends DataClass Map data, GeneratedDatabase db, {String? prefix}) { final effectivePrefix = prefix ?? ''; - final stringType = db.typeSystem.forDartType(); - final intType = db.typeSystem.forDartType(); - final boolType = db.typeSystem.forDartType(); - final dateTimeType = db.typeSystem.forDartType(); return PinnedMessageEntity( - id: stringType.mapFromDatabaseResponse(data['${effectivePrefix}id'])!, - messageText: stringType + id: const StringType() + .mapFromDatabaseResponse(data['${effectivePrefix}id'])!, + messageText: const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}message_text']), - attachments: $PinnedMessagesTable.$converter0.mapToDart(stringType + attachments: $PinnedMessagesTable.$converter0.mapToDart(const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}attachments']))!, - status: $PinnedMessagesTable.$converter1.mapToDart( - intType.mapFromDatabaseResponse(data['${effectivePrefix}status']))!, - type: stringType.mapFromDatabaseResponse(data['${effectivePrefix}type'])!, - mentionedUsers: $PinnedMessagesTable.$converter2.mapToDart(stringType - .mapFromDatabaseResponse(data['${effectivePrefix}mentioned_users']))!, - reactionCounts: $PinnedMessagesTable.$converter3.mapToDart(stringType - .mapFromDatabaseResponse(data['${effectivePrefix}reaction_counts'])), - reactionScores: $PinnedMessagesTable.$converter4.mapToDart(stringType - .mapFromDatabaseResponse(data['${effectivePrefix}reaction_scores'])), - parentId: stringType + status: $PinnedMessagesTable.$converter1.mapToDart(const IntType() + .mapFromDatabaseResponse(data['${effectivePrefix}status']))!, + type: const StringType() + .mapFromDatabaseResponse(data['${effectivePrefix}type'])!, + mentionedUsers: $PinnedMessagesTable.$converter2.mapToDart( + const StringType().mapFromDatabaseResponse( + data['${effectivePrefix}mentioned_users']))!, + reactionCounts: $PinnedMessagesTable.$converter3.mapToDart( + const StringType().mapFromDatabaseResponse( + data['${effectivePrefix}reaction_counts'])), + reactionScores: $PinnedMessagesTable.$converter4.mapToDart( + const StringType().mapFromDatabaseResponse( + data['${effectivePrefix}reaction_scores'])), + parentId: const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}parent_id']), - quotedMessageId: stringType + quotedMessageId: const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}quoted_message_id']), - replyCount: intType + replyCount: const IntType() .mapFromDatabaseResponse(data['${effectivePrefix}reply_count']), - showInChannel: boolType + showInChannel: const BoolType() .mapFromDatabaseResponse(data['${effectivePrefix}show_in_channel']), - shadowed: - boolType.mapFromDatabaseResponse(data['${effectivePrefix}shadowed'])!, - command: - stringType.mapFromDatabaseResponse(data['${effectivePrefix}command']), - createdAt: dateTimeType + shadowed: const BoolType() + .mapFromDatabaseResponse(data['${effectivePrefix}shadowed'])!, + command: const StringType() + .mapFromDatabaseResponse(data['${effectivePrefix}command']), + createdAt: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}created_at'])!, - updatedAt: dateTimeType + updatedAt: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}updated_at'])!, - deletedAt: dateTimeType + deletedAt: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}deleted_at']), - userId: - stringType.mapFromDatabaseResponse(data['${effectivePrefix}user_id']), - pinned: - boolType.mapFromDatabaseResponse(data['${effectivePrefix}pinned'])!, - pinnedAt: dateTimeType + userId: const StringType() + .mapFromDatabaseResponse(data['${effectivePrefix}user_id']), + pinned: const BoolType() + .mapFromDatabaseResponse(data['${effectivePrefix}pinned'])!, + pinnedAt: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}pinned_at']), - pinExpires: dateTimeType + pinExpires: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}pin_expires']), - pinnedByUserId: stringType + pinnedByUserId: const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}pinned_by_user_id']), - channelCid: stringType + channelCid: const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}channel_cid']), - extraData: $PinnedMessagesTable.$converter5.mapToDart(stringType + extraData: $PinnedMessagesTable.$converter5.mapToDart(const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}extra_data'])), ); } @@ -2247,7 +2245,7 @@ class PinnedMessageEntity extends DataClass pinned.hashCode, $mrjc(pinnedAt.hashCode, $mrjc(pinExpires.hashCode, $mrjc(pinnedByUserId.hashCode, $mrjc(channelCid.hashCode, extraData.hashCode)))))))))))))))))))))))); @override - bool operator ==(dynamic other) => + bool operator ==(Object other) => identical(this, other) || (other is PinnedMessageEntity && other.id == this.id && @@ -3031,19 +3029,18 @@ class ReactionEntity extends DataClass implements Insertable { Map data, GeneratedDatabase db, {String? prefix}) { final effectivePrefix = prefix ?? ''; - final stringType = db.typeSystem.forDartType(); - final dateTimeType = db.typeSystem.forDartType(); - final intType = db.typeSystem.forDartType(); return ReactionEntity( - userId: stringType + userId: const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}user_id'])!, - messageId: stringType + messageId: const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}message_id'])!, - type: stringType.mapFromDatabaseResponse(data['${effectivePrefix}type'])!, - createdAt: dateTimeType + type: const StringType() + .mapFromDatabaseResponse(data['${effectivePrefix}type'])!, + createdAt: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}created_at'])!, - score: intType.mapFromDatabaseResponse(data['${effectivePrefix}score'])!, - extraData: $ReactionsTable.$converter0.mapToDart(stringType + score: const IntType() + .mapFromDatabaseResponse(data['${effectivePrefix}score'])!, + extraData: $ReactionsTable.$converter0.mapToDart(const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}extra_data'])), ); } @@ -3125,7 +3122,7 @@ class ReactionEntity extends DataClass implements Insertable { $mrjc(createdAt.hashCode, $mrjc(score.hashCode, extraData.hashCode)))))); @override - bool operator ==(dynamic other) => + bool operator ==(Object other) => identical(this, other) || (other is ReactionEntity && other.userId == this.userId && @@ -3395,23 +3392,22 @@ class UserEntity extends DataClass implements Insertable { factory UserEntity.fromData(Map data, GeneratedDatabase db, {String? prefix}) { final effectivePrefix = prefix ?? ''; - final stringType = db.typeSystem.forDartType(); - final dateTimeType = db.typeSystem.forDartType(); - final boolType = db.typeSystem.forDartType(); return UserEntity( - id: stringType.mapFromDatabaseResponse(data['${effectivePrefix}id'])!, - role: stringType.mapFromDatabaseResponse(data['${effectivePrefix}role']), - createdAt: dateTimeType + id: const StringType() + .mapFromDatabaseResponse(data['${effectivePrefix}id'])!, + role: const StringType() + .mapFromDatabaseResponse(data['${effectivePrefix}role']), + createdAt: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}created_at'])!, - updatedAt: dateTimeType + updatedAt: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}updated_at'])!, - lastActive: dateTimeType + lastActive: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}last_active']), - online: - boolType.mapFromDatabaseResponse(data['${effectivePrefix}online'])!, - banned: - boolType.mapFromDatabaseResponse(data['${effectivePrefix}banned'])!, - extraData: $UsersTable.$converter0.mapToDart(stringType + online: const BoolType() + .mapFromDatabaseResponse(data['${effectivePrefix}online'])!, + banned: const BoolType() + .mapFromDatabaseResponse(data['${effectivePrefix}banned'])!, + extraData: $UsersTable.$converter0.mapToDart(const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}extra_data']))!, ); } @@ -3513,7 +3509,7 @@ class UserEntity extends DataClass implements Insertable { $mrjc(online.hashCode, $mrjc(banned.hashCode, extraData.hashCode)))))))); @override - bool operator ==(dynamic other) => + bool operator ==(Object other) => identical(this, other) || (other is UserEntity && other.id == this.id && @@ -3554,7 +3550,7 @@ class UsersCompanion extends UpdateCompanion { this.online = const Value.absent(), this.banned = const Value.absent(), required Map extraData, - }) : id = Value(id), + }) : id = Value(id), extraData = Value(extraData); static Insertable custom({ Expression? id, @@ -3841,30 +3837,28 @@ class MemberEntity extends DataClass implements Insertable { factory MemberEntity.fromData(Map data, GeneratedDatabase db, {String? prefix}) { final effectivePrefix = prefix ?? ''; - final stringType = db.typeSystem.forDartType(); - final dateTimeType = db.typeSystem.forDartType(); - final boolType = db.typeSystem.forDartType(); return MemberEntity( - userId: stringType + userId: const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}user_id'])!, - channelCid: stringType + channelCid: const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}channel_cid'])!, - role: stringType.mapFromDatabaseResponse(data['${effectivePrefix}role']), - inviteAcceptedAt: dateTimeType.mapFromDatabaseResponse( + role: const StringType() + .mapFromDatabaseResponse(data['${effectivePrefix}role']), + inviteAcceptedAt: const DateTimeType().mapFromDatabaseResponse( data['${effectivePrefix}invite_accepted_at']), - inviteRejectedAt: dateTimeType.mapFromDatabaseResponse( + inviteRejectedAt: const DateTimeType().mapFromDatabaseResponse( data['${effectivePrefix}invite_rejected_at']), - invited: - boolType.mapFromDatabaseResponse(data['${effectivePrefix}invited'])!, - banned: - boolType.mapFromDatabaseResponse(data['${effectivePrefix}banned'])!, - shadowBanned: boolType + invited: const BoolType() + .mapFromDatabaseResponse(data['${effectivePrefix}invited'])!, + banned: const BoolType() + .mapFromDatabaseResponse(data['${effectivePrefix}banned'])!, + shadowBanned: const BoolType() .mapFromDatabaseResponse(data['${effectivePrefix}shadow_banned'])!, - isModerator: boolType + isModerator: const BoolType() .mapFromDatabaseResponse(data['${effectivePrefix}is_moderator'])!, - createdAt: dateTimeType + createdAt: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}created_at'])!, - updatedAt: dateTimeType + updatedAt: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}updated_at'])!, ); } @@ -3997,7 +3991,7 @@ class MemberEntity extends DataClass implements Insertable { $mrjc(createdAt.hashCode, updatedAt.hashCode))))))))))); @override - bool operator ==(dynamic other) => + bool operator ==(Object other) => identical(this, other) || (other is MemberEntity && other.userId == this.userId && @@ -4396,17 +4390,14 @@ class ReadEntity extends DataClass implements Insertable { factory ReadEntity.fromData(Map data, GeneratedDatabase db, {String? prefix}) { final effectivePrefix = prefix ?? ''; - final dateTimeType = db.typeSystem.forDartType(); - final stringType = db.typeSystem.forDartType(); - final intType = db.typeSystem.forDartType(); return ReadEntity( - lastRead: dateTimeType + lastRead: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}last_read'])!, - userId: stringType + userId: const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}user_id'])!, - channelCid: stringType + channelCid: const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}channel_cid'])!, - unreadMessages: intType + unreadMessages: const IntType() .mapFromDatabaseResponse(data['${effectivePrefix}unread_messages'])!, ); } @@ -4469,7 +4460,7 @@ class ReadEntity extends DataClass implements Insertable { $mrjc(userId.hashCode, $mrjc(channelCid.hashCode, unreadMessages.hashCode)))); @override - bool operator ==(dynamic other) => + bool operator ==(Object other) => identical(this, other) || (other is ReadEntity && other.lastRead == this.lastRead && @@ -4666,11 +4657,10 @@ class ChannelQueryEntity extends DataClass Map data, GeneratedDatabase db, {String? prefix}) { final effectivePrefix = prefix ?? ''; - final stringType = db.typeSystem.forDartType(); return ChannelQueryEntity( - queryHash: stringType + queryHash: const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}query_hash'])!, - channelCid: stringType + channelCid: const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}channel_cid'])!, ); } @@ -4716,7 +4706,7 @@ class ChannelQueryEntity extends DataClass @override int get hashCode => $mrjf($mrjc(queryHash.hashCode, channelCid.hashCode)); @override - bool operator ==(dynamic other) => + bool operator ==(Object other) => identical(this, other) || (other is ChannelQueryEntity && other.queryHash == this.queryHash && @@ -4733,7 +4723,7 @@ class ChannelQueriesCompanion extends UpdateCompanion { ChannelQueriesCompanion.insert({ required String queryHash, required String channelCid, - }) : queryHash = Value(queryHash), + }) : queryHash = Value(queryHash), channelCid = Value(channelCid); static Insertable custom({ Expression? queryHash, @@ -4876,20 +4866,18 @@ class ConnectionEventEntity extends DataClass Map data, GeneratedDatabase db, {String? prefix}) { final effectivePrefix = prefix ?? ''; - final intType = db.typeSystem.forDartType(); - final stringType = db.typeSystem.forDartType(); - final dateTimeType = db.typeSystem.forDartType(); return ConnectionEventEntity( - id: intType.mapFromDatabaseResponse(data['${effectivePrefix}id'])!, - ownUser: $ConnectionEventsTable.$converter0.mapToDart(stringType + id: const IntType() + .mapFromDatabaseResponse(data['${effectivePrefix}id'])!, + ownUser: $ConnectionEventsTable.$converter0.mapToDart(const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}own_user'])), - totalUnreadCount: intType.mapFromDatabaseResponse( + totalUnreadCount: const IntType().mapFromDatabaseResponse( data['${effectivePrefix}total_unread_count']), - unreadChannels: intType + unreadChannels: const IntType() .mapFromDatabaseResponse(data['${effectivePrefix}unread_channels']), - lastEventAt: dateTimeType + lastEventAt: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}last_event_at']), - lastSyncAt: dateTimeType + lastSyncAt: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}last_sync_at']), ); } @@ -4982,7 +4970,7 @@ class ConnectionEventEntity extends DataClass $mrjc(unreadChannels.hashCode, $mrjc(lastEventAt.hashCode, lastSyncAt.hashCode)))))); @override - bool operator ==(dynamic other) => + bool operator ==(Object other) => identical(this, other) || (other is ConnectionEventEntity && other.id == this.id && From b67db631e4ef64ffc26774fab53bff04dc688b5e Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 19 May 2021 13:30:37 +0200 Subject: [PATCH 04/27] use specific analysis option files --- .../stream_chat/analysis_options.yaml | 0 .../stream_chat_flutter/analysis_options.yaml | 150 ++++++++++++++++++ .../analysis_options.yaml | 150 ++++++++++++++++++ .../analysis_options.yaml | 150 ++++++++++++++++++ 4 files changed, 450 insertions(+) rename analysis_options.yaml => packages/stream_chat/analysis_options.yaml (100%) create mode 100644 packages/stream_chat_flutter/analysis_options.yaml create mode 100644 packages/stream_chat_flutter_core/analysis_options.yaml create mode 100644 packages/stream_chat_persistence/analysis_options.yaml diff --git a/analysis_options.yaml b/packages/stream_chat/analysis_options.yaml similarity index 100% rename from analysis_options.yaml rename to packages/stream_chat/analysis_options.yaml diff --git a/packages/stream_chat_flutter/analysis_options.yaml b/packages/stream_chat_flutter/analysis_options.yaml new file mode 100644 index 00000000..f0a87ea5 --- /dev/null +++ b/packages/stream_chat_flutter/analysis_options.yaml @@ -0,0 +1,150 @@ +analyzer: + enable-experiment: + - extension-methods + exclude: + - lib/**/*.g.dart + - example/** + - lib/src/emoji + - lib/**/*.freezed.dart + - test/** + +linter: + rules: + # these rules are documented on and in the same order as + # the Dart Lint rules page to make maintenance easier + # https://github.com/dart-lang/linter/blob/master/example/all.yaml + - always_use_package_imports + - avoid_empty_else + - avoid_relative_lib_imports + - avoid_slow_async_io + - avoid_types_as_parameter_names + - cancel_subscriptions + - close_sinks + - control_flow_in_finally + - empty_statements + - hash_and_equals + - invariant_booleans + - iterable_contains_unrelated_type + - list_remove_unrelated_type + - literal_only_boolean_expressions + - no_adjacent_strings_in_list + - no_duplicate_case_values + - no_logic_in_create_state + - prefer_void_to_null + - test_types_in_equals + - throw_in_finally + - unnecessary_statements + - unrelated_type_equality_checks + - omit_local_variable_types + - use_key_in_widget_constructors + - valid_regexps + - always_declare_return_types + - always_require_non_null_named_parameters + - annotate_overrides + - avoid_bool_literals_in_conditional_expressions + - avoid_catching_errors + - avoid_init_to_null + - avoid_null_checks_in_equality_operators + - avoid_positional_boolean_parameters + - avoid_private_typedef_functions + - avoid_redundant_argument_values + - avoid_return_types_on_setters + - avoid_returning_null_for_void + - avoid_shadowing_type_parameters + - avoid_single_cascade_in_expression_statements + - avoid_unnecessary_containers + - avoid_unused_constructor_parameters + - await_only_futures + - camel_case_extensions + - camel_case_types + - cascade_invocations + + - constant_identifier_names + - curly_braces_in_flow_control_structures + - directives_ordering + - empty_catches + - empty_constructor_bodies + - exhaustive_cases + - file_names + - implementation_imports + - join_return_with_assignment + - leading_newlines_in_multiline_strings + - library_names + - library_prefixes + - lines_longer_than_80_chars + - missing_whitespace_between_adjacent_strings + - non_constant_identifier_names + - null_closures + - one_member_abstracts + - only_throw_errors + - package_api_docs + - package_prefixed_library_names + - parameter_assignments + - prefer_adjacent_string_concatenation + - prefer_asserts_in_initializer_lists + - prefer_asserts_with_message + - prefer_collection_literals + - prefer_conditional_assignment + - prefer_const_constructors + - prefer_const_constructors_in_immutables + - prefer_const_declarations + - prefer_const_literals_to_create_immutables + - prefer_constructors_over_static_methods + - prefer_contains + - prefer_equal_for_default_values + - prefer_expression_function_bodies + - prefer_final_fields + - prefer_final_in_for_each + - prefer_final_locals + - prefer_function_declarations_over_variables + - prefer_generic_function_type_aliases + - prefer_if_elements_to_conditional_expressions + - prefer_if_null_operators + - prefer_initializing_formals + - prefer_inlined_adds + - prefer_int_literals + - prefer_interpolation_to_compose_strings + - prefer_is_empty + - prefer_is_not_empty + - prefer_is_not_operator + - prefer_null_aware_operators + - prefer_single_quotes + - prefer_spread_collections + - prefer_typing_uninitialized_variables + - provide_deprecation_message + - public_member_api_docs + - recursive_getters + - sized_box_for_whitespace + - slash_for_doc_comments + - sort_child_properties_last + - sort_constructors_first + - sort_unnamed_constructors_first + + - type_annotate_public_apis + - type_init_formals + - unnecessary_await_in_return + - unnecessary_brace_in_string_interps + - unnecessary_const + - unnecessary_getters_setters + - unnecessary_lambdas + - unnecessary_new + - unnecessary_null_aware_assignments + - unnecessary_null_in_if_null_operators + - unnecessary_nullable_for_final_variable_declarations + - unnecessary_parenthesis + - unnecessary_raw_strings + - unnecessary_string_escapes + - unnecessary_string_interpolations + - unnecessary_this + - use_is_even_rather_than_modulo + - use_late_for_private_fields_and_variables + - use_rethrow_when_possible + - use_setters_to_change_properties + - use_to_and_as_if_applicable + - package_names + - sort_pub_dependencies + + - cast_nullable_to_non_nullable + - unnecessary_null_checks + - tighten_type_of_initializing_formals + - null_check_on_nullable_type_parameter diff --git a/packages/stream_chat_flutter_core/analysis_options.yaml b/packages/stream_chat_flutter_core/analysis_options.yaml new file mode 100644 index 00000000..f0a87ea5 --- /dev/null +++ b/packages/stream_chat_flutter_core/analysis_options.yaml @@ -0,0 +1,150 @@ +analyzer: + enable-experiment: + - extension-methods + exclude: + - lib/**/*.g.dart + - example/** + - lib/src/emoji + - lib/**/*.freezed.dart + - test/** + +linter: + rules: + # these rules are documented on and in the same order as + # the Dart Lint rules page to make maintenance easier + # https://github.com/dart-lang/linter/blob/master/example/all.yaml + - always_use_package_imports + - avoid_empty_else + - avoid_relative_lib_imports + - avoid_slow_async_io + - avoid_types_as_parameter_names + - cancel_subscriptions + - close_sinks + - control_flow_in_finally + - empty_statements + - hash_and_equals + - invariant_booleans + - iterable_contains_unrelated_type + - list_remove_unrelated_type + - literal_only_boolean_expressions + - no_adjacent_strings_in_list + - no_duplicate_case_values + - no_logic_in_create_state + - prefer_void_to_null + - test_types_in_equals + - throw_in_finally + - unnecessary_statements + - unrelated_type_equality_checks + - omit_local_variable_types + - use_key_in_widget_constructors + - valid_regexps + - always_declare_return_types + - always_require_non_null_named_parameters + - annotate_overrides + - avoid_bool_literals_in_conditional_expressions + - avoid_catching_errors + - avoid_init_to_null + - avoid_null_checks_in_equality_operators + - avoid_positional_boolean_parameters + - avoid_private_typedef_functions + - avoid_redundant_argument_values + - avoid_return_types_on_setters + - avoid_returning_null_for_void + - avoid_shadowing_type_parameters + - avoid_single_cascade_in_expression_statements + - avoid_unnecessary_containers + - avoid_unused_constructor_parameters + - await_only_futures + - camel_case_extensions + - camel_case_types + - cascade_invocations + + - constant_identifier_names + - curly_braces_in_flow_control_structures + - directives_ordering + - empty_catches + - empty_constructor_bodies + - exhaustive_cases + - file_names + - implementation_imports + - join_return_with_assignment + - leading_newlines_in_multiline_strings + - library_names + - library_prefixes + - lines_longer_than_80_chars + - missing_whitespace_between_adjacent_strings + - non_constant_identifier_names + - null_closures + - one_member_abstracts + - only_throw_errors + - package_api_docs + - package_prefixed_library_names + - parameter_assignments + - prefer_adjacent_string_concatenation + - prefer_asserts_in_initializer_lists + - prefer_asserts_with_message + - prefer_collection_literals + - prefer_conditional_assignment + - prefer_const_constructors + - prefer_const_constructors_in_immutables + - prefer_const_declarations + - prefer_const_literals_to_create_immutables + - prefer_constructors_over_static_methods + - prefer_contains + - prefer_equal_for_default_values + - prefer_expression_function_bodies + - prefer_final_fields + - prefer_final_in_for_each + - prefer_final_locals + - prefer_function_declarations_over_variables + - prefer_generic_function_type_aliases + - prefer_if_elements_to_conditional_expressions + - prefer_if_null_operators + - prefer_initializing_formals + - prefer_inlined_adds + - prefer_int_literals + - prefer_interpolation_to_compose_strings + - prefer_is_empty + - prefer_is_not_empty + - prefer_is_not_operator + - prefer_null_aware_operators + - prefer_single_quotes + - prefer_spread_collections + - prefer_typing_uninitialized_variables + - provide_deprecation_message + - public_member_api_docs + - recursive_getters + - sized_box_for_whitespace + - slash_for_doc_comments + - sort_child_properties_last + - sort_constructors_first + - sort_unnamed_constructors_first + + - type_annotate_public_apis + - type_init_formals + - unnecessary_await_in_return + - unnecessary_brace_in_string_interps + - unnecessary_const + - unnecessary_getters_setters + - unnecessary_lambdas + - unnecessary_new + - unnecessary_null_aware_assignments + - unnecessary_null_in_if_null_operators + - unnecessary_nullable_for_final_variable_declarations + - unnecessary_parenthesis + - unnecessary_raw_strings + - unnecessary_string_escapes + - unnecessary_string_interpolations + - unnecessary_this + - use_is_even_rather_than_modulo + - use_late_for_private_fields_and_variables + - use_rethrow_when_possible + - use_setters_to_change_properties + - use_to_and_as_if_applicable + - package_names + - sort_pub_dependencies + + - cast_nullable_to_non_nullable + - unnecessary_null_checks + - tighten_type_of_initializing_formals + - null_check_on_nullable_type_parameter diff --git a/packages/stream_chat_persistence/analysis_options.yaml b/packages/stream_chat_persistence/analysis_options.yaml new file mode 100644 index 00000000..f0a87ea5 --- /dev/null +++ b/packages/stream_chat_persistence/analysis_options.yaml @@ -0,0 +1,150 @@ +analyzer: + enable-experiment: + - extension-methods + exclude: + - lib/**/*.g.dart + - example/** + - lib/src/emoji + - lib/**/*.freezed.dart + - test/** + +linter: + rules: + # these rules are documented on and in the same order as + # the Dart Lint rules page to make maintenance easier + # https://github.com/dart-lang/linter/blob/master/example/all.yaml + - always_use_package_imports + - avoid_empty_else + - avoid_relative_lib_imports + - avoid_slow_async_io + - avoid_types_as_parameter_names + - cancel_subscriptions + - close_sinks + - control_flow_in_finally + - empty_statements + - hash_and_equals + - invariant_booleans + - iterable_contains_unrelated_type + - list_remove_unrelated_type + - literal_only_boolean_expressions + - no_adjacent_strings_in_list + - no_duplicate_case_values + - no_logic_in_create_state + - prefer_void_to_null + - test_types_in_equals + - throw_in_finally + - unnecessary_statements + - unrelated_type_equality_checks + - omit_local_variable_types + - use_key_in_widget_constructors + - valid_regexps + - always_declare_return_types + - always_require_non_null_named_parameters + - annotate_overrides + - avoid_bool_literals_in_conditional_expressions + - avoid_catching_errors + - avoid_init_to_null + - avoid_null_checks_in_equality_operators + - avoid_positional_boolean_parameters + - avoid_private_typedef_functions + - avoid_redundant_argument_values + - avoid_return_types_on_setters + - avoid_returning_null_for_void + - avoid_shadowing_type_parameters + - avoid_single_cascade_in_expression_statements + - avoid_unnecessary_containers + - avoid_unused_constructor_parameters + - await_only_futures + - camel_case_extensions + - camel_case_types + - cascade_invocations + + - constant_identifier_names + - curly_braces_in_flow_control_structures + - directives_ordering + - empty_catches + - empty_constructor_bodies + - exhaustive_cases + - file_names + - implementation_imports + - join_return_with_assignment + - leading_newlines_in_multiline_strings + - library_names + - library_prefixes + - lines_longer_than_80_chars + - missing_whitespace_between_adjacent_strings + - non_constant_identifier_names + - null_closures + - one_member_abstracts + - only_throw_errors + - package_api_docs + - package_prefixed_library_names + - parameter_assignments + - prefer_adjacent_string_concatenation + - prefer_asserts_in_initializer_lists + - prefer_asserts_with_message + - prefer_collection_literals + - prefer_conditional_assignment + - prefer_const_constructors + - prefer_const_constructors_in_immutables + - prefer_const_declarations + - prefer_const_literals_to_create_immutables + - prefer_constructors_over_static_methods + - prefer_contains + - prefer_equal_for_default_values + - prefer_expression_function_bodies + - prefer_final_fields + - prefer_final_in_for_each + - prefer_final_locals + - prefer_function_declarations_over_variables + - prefer_generic_function_type_aliases + - prefer_if_elements_to_conditional_expressions + - prefer_if_null_operators + - prefer_initializing_formals + - prefer_inlined_adds + - prefer_int_literals + - prefer_interpolation_to_compose_strings + - prefer_is_empty + - prefer_is_not_empty + - prefer_is_not_operator + - prefer_null_aware_operators + - prefer_single_quotes + - prefer_spread_collections + - prefer_typing_uninitialized_variables + - provide_deprecation_message + - public_member_api_docs + - recursive_getters + - sized_box_for_whitespace + - slash_for_doc_comments + - sort_child_properties_last + - sort_constructors_first + - sort_unnamed_constructors_first + + - type_annotate_public_apis + - type_init_formals + - unnecessary_await_in_return + - unnecessary_brace_in_string_interps + - unnecessary_const + - unnecessary_getters_setters + - unnecessary_lambdas + - unnecessary_new + - unnecessary_null_aware_assignments + - unnecessary_null_in_if_null_operators + - unnecessary_nullable_for_final_variable_declarations + - unnecessary_parenthesis + - unnecessary_raw_strings + - unnecessary_string_escapes + - unnecessary_string_interpolations + - unnecessary_this + - use_is_even_rather_than_modulo + - use_late_for_private_fields_and_variables + - use_rethrow_when_possible + - use_setters_to_change_properties + - use_to_and_as_if_applicable + - package_names + - sort_pub_dependencies + + - cast_nullable_to_non_nullable + - unnecessary_null_checks + - tighten_type_of_initializing_formals + - null_check_on_nullable_type_parameter From 80cbb266d2f8e85386143bc7f4a3adc1d9edb834 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 19 May 2021 13:45:22 +0200 Subject: [PATCH 05/27] fix tests --- packages/stream_chat/lib/src/client.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/stream_chat/lib/src/client.dart b/packages/stream_chat/lib/src/client.dart index b6efb6a5..05f2559b 100644 --- a/packages/stream_chat/lib/src/client.dart +++ b/packages/stream_chat/lib/src/client.dart @@ -1489,7 +1489,7 @@ class ClientState { void _updateUser(User? user) => _updateUsers([user]); /// The current user - OwnUser? get user => _userController.value; + OwnUser? get user => _userController.valueOrNull; /// The current user as a stream Stream get userStream => _userController.stream; @@ -1501,13 +1501,13 @@ class ClientState { Stream> get usersStream => _usersController.stream; /// The current unread channels count - int? get unreadChannels => _unreadChannelsController.value; + int? get unreadChannels => _unreadChannelsController.valueOrNull; /// The current unread channels count as a stream Stream get unreadChannelsStream => _unreadChannelsController.stream; /// The current total unread messages count - int? get totalUnreadCount => _totalUnreadCountController.value; + int? get totalUnreadCount => _totalUnreadCountController.valueOrNull; /// The current total unread messages count as a stream Stream get totalUnreadCountStream => _totalUnreadCountController.stream; From d5820d25d9d2b56a8927ee7eec8402e1a0fe328d Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 19 May 2021 13:50:25 +0200 Subject: [PATCH 06/27] fix rxdart --- .../stream_chat_flutter_core/lib/src/message_search_bloc.dart | 3 ++- packages/stream_chat_flutter_core/lib/src/users_bloc.dart | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/stream_chat_flutter_core/lib/src/message_search_bloc.dart b/packages/stream_chat_flutter_core/lib/src/message_search_bloc.dart index 70e6df11..daffadfe 100644 --- a/packages/stream_chat_flutter_core/lib/src/message_search_bloc.dart +++ b/packages/stream_chat_flutter_core/lib/src/message_search_bloc.dart @@ -44,7 +44,8 @@ class MessageSearchBlocState extends State late StreamChatCoreState _streamChatCoreState; /// The current messages list - List? get messageResponses => _messageResponses.value; + List? get messageResponses => + _messageResponses.valueOrNull; /// The current messages list as a stream Stream> get messagesStream => diff --git a/packages/stream_chat_flutter_core/lib/src/users_bloc.dart b/packages/stream_chat_flutter_core/lib/src/users_bloc.dart index 0c0d46cd..1806ec36 100644 --- a/packages/stream_chat_flutter_core/lib/src/users_bloc.dart +++ b/packages/stream_chat_flutter_core/lib/src/users_bloc.dart @@ -43,7 +43,7 @@ class UsersBloc extends StatefulWidget { class UsersBlocState extends State with AutomaticKeepAliveClientMixin { /// The current users list - List? get users => _usersController.value; + List? get users => _usersController.valueOrNull; /// The current users list as a stream Stream> get usersStream => _usersController.stream; From 9e71299cb686e4dd2b384fe8ef8b4b8ea65bcc54 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 19 May 2021 14:30:48 +0200 Subject: [PATCH 07/27] remove transform --- .../lib/src/message_input.dart | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/packages/stream_chat_flutter/lib/src/message_input.dart b/packages/stream_chat_flutter/lib/src/message_input.dart index ed098903..c71fd341 100644 --- a/packages/stream_chat_flutter/lib/src/message_input.dart +++ b/packages/stream_chat_flutter/lib/src/message_input.dart @@ -1473,16 +1473,12 @@ class MessageInputState extends State { final containsUrl = widget.quotedMessage!.attachments .any((element) => element.ogScrapeUrl != null) == true; - return Transform( - transform: Matrix4.rotationY(pi), - alignment: Alignment.center, - child: QuotedMessageWidget( - reverse: true, - showBorder: !containsUrl, - message: widget.quotedMessage!, - messageTheme: StreamChatTheme.of(context).otherMessageTheme, - padding: const EdgeInsets.fromLTRB(8, 8, 8, 0), - ), + return QuotedMessageWidget( + reverse: true, + showBorder: !containsUrl, + message: widget.quotedMessage!, + messageTheme: StreamChatTheme.of(context).otherMessageTheme, + padding: const EdgeInsets.fromLTRB(8, 8, 8, 0), ); } From 99562d9ba4e076f6e96cc6507ae77a578bedf0d8 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 19 May 2021 15:01:50 +0200 Subject: [PATCH 08/27] fix quoted message --- packages/stream_chat_flutter/lib/src/message_input.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/stream_chat_flutter/lib/src/message_input.dart b/packages/stream_chat_flutter/lib/src/message_input.dart index c71fd341..91f16b7b 100644 --- a/packages/stream_chat_flutter/lib/src/message_input.dart +++ b/packages/stream_chat_flutter/lib/src/message_input.dart @@ -1474,7 +1474,6 @@ class MessageInputState extends State { .any((element) => element.ogScrapeUrl != null) == true; return QuotedMessageWidget( - reverse: true, showBorder: !containsUrl, message: widget.quotedMessage!, messageTheme: StreamChatTheme.of(context).otherMessageTheme, From be0378e4f0351914181917e096bcca74734f8790 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 19 May 2021 15:14:36 +0200 Subject: [PATCH 09/27] fix quoted message --- .../lib/src/message_input.dart | 1 + .../lib/src/quoted_message_widget.dart | 31 ++++++++++--------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/packages/stream_chat_flutter/lib/src/message_input.dart b/packages/stream_chat_flutter/lib/src/message_input.dart index 91f16b7b..c71fd341 100644 --- a/packages/stream_chat_flutter/lib/src/message_input.dart +++ b/packages/stream_chat_flutter/lib/src/message_input.dart @@ -1474,6 +1474,7 @@ class MessageInputState extends State { .any((element) => element.ogScrapeUrl != null) == true; return QuotedMessageWidget( + reverse: true, showBorder: !containsUrl, message: widget.quotedMessage!, messageTheme: StreamChatTheme.of(context).otherMessageTheme, diff --git a/packages/stream_chat_flutter/lib/src/quoted_message_widget.dart b/packages/stream_chat_flutter/lib/src/quoted_message_widget.dart index a7c7c798..4b45494c 100644 --- a/packages/stream_chat_flutter/lib/src/quoted_message_widget.dart +++ b/packages/stream_chat_flutter/lib/src/quoted_message_widget.dart @@ -102,21 +102,24 @@ class QuotedMessageWidget extends StatelessWidget { bool get _containsText => message.text?.isNotEmpty == true; @override - Widget build(BuildContext context) => Padding( - padding: padding, - child: InkWell( - onTap: onTap, - child: Row( - crossAxisAlignment: CrossAxisAlignment.end, - mainAxisSize: MainAxisSize.min, - children: [ - Flexible(child: _buildMessage(context)), - const SizedBox(width: 8), - if (message.user != null) _buildUserAvatar(), - ], - ), + Widget build(BuildContext context) { + final children = [ + Flexible(child: _buildMessage(context)), + const SizedBox(width: 8), + if (message.user != null) _buildUserAvatar(), + ]; + return Padding( + padding: padding, + child: InkWell( + onTap: onTap, + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisSize: MainAxisSize.min, + children: reverse ? children.reversed.toList() : children, ), - ); + ), + ); + } Widget _buildMessage(BuildContext context) { final isOnlyEmoji = message.text!.isOnlyEmoji; From 52739738c3dec37a2352172bc38a0c31ac2d7cd4 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 19 May 2021 15:29:58 +0200 Subject: [PATCH 10/27] fix quoted message --- .../lib/src/quoted_message_widget.dart | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/stream_chat_flutter/lib/src/quoted_message_widget.dart b/packages/stream_chat_flutter/lib/src/quoted_message_widget.dart index 4b45494c..07a820b9 100644 --- a/packages/stream_chat_flutter/lib/src/quoted_message_widget.dart +++ b/packages/stream_chat_flutter/lib/src/quoted_message_widget.dart @@ -157,10 +157,11 @@ class QuotedMessageWidget extends StatelessWidget { color: StreamChatTheme.of(context).colorTheme.greyGainsboro, ) : null, - borderRadius: const BorderRadius.only( - topRight: Radius.circular(12), - topLeft: Radius.circular(12), - bottomLeft: Radius.circular(12), + borderRadius: BorderRadius.only( + topRight: const Radius.circular(12), + topLeft: const Radius.circular(12), + bottomRight: reverse ? const Radius.circular(12) : Radius.zero, + bottomLeft: reverse ? Radius.zero : const Radius.circular(12), ), ), padding: const EdgeInsets.all(8), From 4c90b7229fde6746ec1c1ad95a208d6cffe7b910 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 19 May 2021 15:58:49 +0200 Subject: [PATCH 11/27] remove prints --- .../stream_chat_flutter_core/lib/src/channel_list_core.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/stream_chat_flutter_core/lib/src/channel_list_core.dart b/packages/stream_chat_flutter_core/lib/src/channel_list_core.dart index dbd57269..a3be273d 100644 --- a/packages/stream_chat_flutter_core/lib/src/channel_list_core.dart +++ b/packages/stream_chat_flutter_core/lib/src/channel_list_core.dart @@ -132,8 +132,6 @@ class ChannelListCoreState extends State { stream: channelsBlocState.channelsStream, builder: (context, snapshot) { if (snapshot.hasError) { - print(snapshot.error); - print(snapshot.stackTrace); return widget.errorBuilder(context, snapshot.error!); } if (!snapshot.hasData) { From fd9bd99792500f9c12a5d8e0ad2e7b89250a1a62 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 19 May 2021 17:12:04 +0200 Subject: [PATCH 12/27] fix prent message --- .../lib/src/message_list_view.dart | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/stream_chat_flutter/lib/src/message_list_view.dart b/packages/stream_chat_flutter/lib/src/message_list_view.dart index c24ceb00..e07d9358 100644 --- a/packages/stream_chat_flutter/lib/src/message_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/message_list_view.dart @@ -815,11 +815,13 @@ class _MessageListViewState extends State { padding: const EdgeInsets.all(8), showSendingIndicator: false, onThreadTap: _onThreadTap, - borderRadiusGeometry: const BorderRadius.only( - topLeft: Radius.circular(16), - bottomLeft: Radius.circular(2), - topRight: Radius.circular(16), - bottomRight: Radius.circular(16), + borderRadiusGeometry: BorderRadius.only( + topLeft: const Radius.circular(16), + bottomLeft: + isMyMessage ? const Radius.circular(16) : const Radius.circular(2), + topRight: const Radius.circular(16), + bottomRight: + isMyMessage ? const Radius.circular(2) : const Radius.circular(16), ), textPadding: EdgeInsets.symmetric( vertical: 8, From e1981492430feb48201ad0edd03f1935e1b520ae Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 19 May 2021 17:14:37 +0200 Subject: [PATCH 13/27] update readme --- packages/stream_chat_flutter_core/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/stream_chat_flutter_core/README.md b/packages/stream_chat_flutter_core/README.md index 8e74c881..952caf05 100644 --- a/packages/stream_chat_flutter_core/README.md +++ b/packages/stream_chat_flutter_core/README.md @@ -1,4 +1,4 @@ -# Official Core [Flutter SDK](https://getstream.io/chat/sdk/flutter/) for [Stream Chat API](https://getstream.io/chat/) +# Official Core [Flutter SDK](https://getstream.io/chat/sdk/flutter/) for [Stream Chat](https://getstream.io/chat/) > The official Flutter core components for Stream Chat, a service for > building chat applications. From 229a30bd651d1f047589e9e61e2f645a5b3428e9 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Thu, 20 May 2021 11:59:43 +0200 Subject: [PATCH 14/27] fix persistence not building for web --- .../lib/src/db/moor_chat_database.dart | 6 ------ .../test/src/dao/channel_dao_test.dart | 4 +++- .../test/src/dao/channel_query_dao_test.dart | 3 ++- .../test/src/dao/connection_event_dao_test.dart | 3 ++- .../test/src/dao/member_dao_test.dart | 3 ++- .../test/src/dao/message_dao_test.dart | 4 +++- .../test/src/dao/pinned_message_dao_test.dart | 4 +++- .../test/src/dao/reaction_dao_test.dart | 4 +++- .../test/src/dao/read_dao_test.dart | 3 ++- .../test/src/dao/user_dao_test.dart | 4 +++- .../test/stream_chat_persistence_client_test.dart | 13 +++++++------ 11 files changed, 30 insertions(+), 21 deletions(-) diff --git a/packages/stream_chat_persistence/lib/src/db/moor_chat_database.dart b/packages/stream_chat_persistence/lib/src/db/moor_chat_database.dart index fbb53fd3..efc8610b 100644 --- a/packages/stream_chat_persistence/lib/src/db/moor_chat_database.dart +++ b/packages/stream_chat_persistence/lib/src/db/moor_chat_database.dart @@ -1,5 +1,3 @@ -import 'package:meta/meta.dart'; -import 'package:moor/ffi.dart'; import 'package:moor/moor.dart'; import 'package:stream_chat/stream_chat.dart'; @@ -46,10 +44,6 @@ class MoorChatDatabase extends _$MoorChatDatabase { DatabaseConnection connection, ) : super.connect(connection); - /// Custom constructor used only for testing - @visibleForTesting - MoorChatDatabase.testable(this._userId) : super(VmDatabase.memory()); - final String _userId; /// User id to which the database is connected diff --git a/packages/stream_chat_persistence/test/src/dao/channel_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/channel_dao_test.dart index d6ac8123..9a458574 100644 --- a/packages/stream_chat_persistence/test/src/dao/channel_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/channel_dao_test.dart @@ -3,12 +3,14 @@ import 'package:stream_chat_persistence/src/dao/channel_dao.dart'; import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; import 'package:test/test.dart'; +import '../../stream_chat_persistence_client_test.dart'; + void main() { late ChannelDao channelDao; late MoorChatDatabase database; setUp(() { - database = MoorChatDatabase.testable('testUserId'); + database = testDatabaseProvider('testUserId'); channelDao = database.channelDao; }); diff --git a/packages/stream_chat_persistence/test/src/dao/channel_query_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/channel_query_dao_test.dart index 9b5e3470..a69a07ee 100644 --- a/packages/stream_chat_persistence/test/src/dao/channel_query_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/channel_query_dao_test.dart @@ -5,6 +5,7 @@ import 'package:stream_chat_persistence/src/dao/channel_query_dao.dart'; import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; import 'package:test/test.dart'; +import '../../stream_chat_persistence_client_test.dart'; import '../utils/date_matcher.dart'; void main() { @@ -12,7 +13,7 @@ void main() { late ChannelQueryDao channelQueryDao; setUp(() { - database = MoorChatDatabase.testable('testUserId'); + database = testDatabaseProvider('testUserId'); channelQueryDao = database.channelQueryDao; }); diff --git a/packages/stream_chat_persistence/test/src/dao/connection_event_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/connection_event_dao_test.dart index 536fe3bc..40c385ba 100644 --- a/packages/stream_chat_persistence/test/src/dao/connection_event_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/connection_event_dao_test.dart @@ -3,6 +3,7 @@ import 'package:stream_chat_persistence/src/dao/connection_event_dao.dart'; import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; import 'package:test/test.dart'; +import '../../stream_chat_persistence_client_test.dart'; import '../utils/date_matcher.dart'; void main() { @@ -10,7 +11,7 @@ void main() { late MoorChatDatabase database; setUp(() { - database = MoorChatDatabase.testable('testUserId'); + database = testDatabaseProvider('testUserId'); eventDao = database.connectionEventDao; }); diff --git a/packages/stream_chat_persistence/test/src/dao/member_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/member_dao_test.dart index 6654de4c..8ce704a4 100644 --- a/packages/stream_chat_persistence/test/src/dao/member_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/member_dao_test.dart @@ -5,6 +5,7 @@ import 'package:stream_chat_persistence/src/dao/dao.dart'; import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; import 'package:test/test.dart'; +import '../../stream_chat_persistence_client_test.dart'; import '../utils/date_matcher.dart'; void main() { @@ -12,7 +13,7 @@ void main() { late MoorChatDatabase database; setUp(() { - database = MoorChatDatabase.testable('testUserId'); + database = testDatabaseProvider('testUserId'); memberDao = database.memberDao; }); diff --git a/packages/stream_chat_persistence/test/src/dao/message_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/message_dao_test.dart index 0d986590..54cc219a 100644 --- a/packages/stream_chat_persistence/test/src/dao/message_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/message_dao_test.dart @@ -5,12 +5,14 @@ import 'package:stream_chat_persistence/src/dao/dao.dart'; import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; import 'package:test/test.dart'; +import '../../stream_chat_persistence_client_test.dart'; + void main() { late MessageDao messageDao; late MoorChatDatabase database; setUp(() { - database = MoorChatDatabase.testable('testUserId'); + database = testDatabaseProvider('testUserId'); messageDao = database.messageDao; }); diff --git a/packages/stream_chat_persistence/test/src/dao/pinned_message_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/pinned_message_dao_test.dart index 33bf96b1..42a54107 100644 --- a/packages/stream_chat_persistence/test/src/dao/pinned_message_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/pinned_message_dao_test.dart @@ -5,12 +5,14 @@ import 'package:stream_chat_persistence/src/dao/dao.dart'; import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; import 'package:test/test.dart'; +import '../../stream_chat_persistence_client_test.dart'; + void main() { late PinnedMessageDao pinnedMessageDao; late MoorChatDatabase database; setUp(() { - database = MoorChatDatabase.testable('testUserId'); + database = testDatabaseProvider('testUserId'); pinnedMessageDao = database.pinnedMessageDao; }); diff --git a/packages/stream_chat_persistence/test/src/dao/reaction_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/reaction_dao_test.dart index 73ff63fe..4edda680 100644 --- a/packages/stream_chat_persistence/test/src/dao/reaction_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/reaction_dao_test.dart @@ -5,12 +5,14 @@ import 'package:stream_chat_persistence/src/dao/reaction_dao.dart'; import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; import 'package:test/test.dart'; +import '../../stream_chat_persistence_client_test.dart'; + void main() { late ReactionDao reactionDao; late MoorChatDatabase database; setUp(() { - database = MoorChatDatabase.testable('testUserId'); + database = testDatabaseProvider('testUserId'); reactionDao = database.reactionDao; }); diff --git a/packages/stream_chat_persistence/test/src/dao/read_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/read_dao_test.dart index 77b7a7f9..287dcad4 100644 --- a/packages/stream_chat_persistence/test/src/dao/read_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/read_dao_test.dart @@ -3,6 +3,7 @@ import 'package:stream_chat_persistence/src/dao/dao.dart'; import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; import 'package:test/test.dart'; +import '../../stream_chat_persistence_client_test.dart'; import '../utils/date_matcher.dart'; void main() { @@ -10,7 +11,7 @@ void main() { late MoorChatDatabase database; setUp(() { - database = MoorChatDatabase.testable('testUserId'); + database = testDatabaseProvider('testUserId'); readDao = database.readDao; }); diff --git a/packages/stream_chat_persistence/test/src/dao/user_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/user_dao_test.dart index 5332a298..ffb50edd 100644 --- a/packages/stream_chat_persistence/test/src/dao/user_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/user_dao_test.dart @@ -5,12 +5,14 @@ import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; import 'package:test/test.dart'; import 'package:stream_chat/stream_chat.dart'; +import '../../stream_chat_persistence_client_test.dart'; + void main() { late UserDao userDao; late MoorChatDatabase database; setUp(() { - database = MoorChatDatabase.testable('testUserId'); + database = testDatabaseProvider('testUserId'); userDao = database.userDao; }); diff --git a/packages/stream_chat_persistence/test/stream_chat_persistence_client_test.dart b/packages/stream_chat_persistence/test/stream_chat_persistence_client_test.dart index 8a275201..83524870 100644 --- a/packages/stream_chat_persistence/test/stream_chat_persistence_client_test.dart +++ b/packages/stream_chat_persistence/test/stream_chat_persistence_client_test.dart @@ -1,4 +1,5 @@ import 'package:mocktail/mocktail.dart'; +import 'package:moor/ffi.dart'; import 'package:stream_chat/stream_chat.dart'; import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; import 'package:stream_chat_persistence/src/stream_chat_persistence_client.dart'; @@ -6,8 +7,8 @@ import 'package:test/test.dart'; import 'mock_chat_database.dart'; import 'src/utils/date_matcher.dart'; -MoorChatDatabase _testDatabaseProvider(String userId, ConnectionMode mode) => - MoorChatDatabase.testable(userId); +MoorChatDatabase testDatabaseProvider(String userId, [ConnectionMode? mode]) => + MoorChatDatabase(userId, VmDatabase.memory()); void main() { group('connect', () { @@ -15,7 +16,7 @@ void main() { test('successfully connects with the Database', () async { final client = StreamChatPersistenceClient(logLevel: Level.ALL); expect(client.db, isNull); - await client.connect(userId, databaseProvider: _testDatabaseProvider); + await client.connect(userId, databaseProvider: testDatabaseProvider); expect(client.db, isNotNull); expect(client.db, isA()); expect(client.db!.userId, userId); @@ -28,13 +29,13 @@ void main() { test('throws if already connected', () async { final client = StreamChatPersistenceClient(logLevel: Level.ALL); expect(client.db, isNull); - await client.connect(userId, databaseProvider: _testDatabaseProvider); + await client.connect(userId, databaseProvider: testDatabaseProvider); expect(client.db, isNotNull); expect(client.db, isNotNull); expect(client.db, isA()); expect(client.db!.userId, userId); expect( - () => client.connect(userId, databaseProvider: _testDatabaseProvider), + () => client.connect(userId, databaseProvider: testDatabaseProvider), throwsException, ); @@ -47,7 +48,7 @@ void main() { test('disconnect', () async { const userId = 'testUserId'; final client = StreamChatPersistenceClient(logLevel: Level.ALL); - await client.connect(userId, databaseProvider: _testDatabaseProvider); + await client.connect(userId, databaseProvider: testDatabaseProvider); expect(client.db, isNotNull); await client.disconnect(flush: true); expect(client.db, isNull); From ecf0f42d6c2b750d1b3089f392b25de0f7b8220a Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Thu, 20 May 2021 15:52:03 +0200 Subject: [PATCH 15/27] add MessageInput.maxAttachmentSize prop --- .../lib/src/message_input.dart | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/stream_chat_flutter/lib/src/message_input.dart b/packages/stream_chat_flutter/lib/src/message_input.dart index c71fd341..6d3ec5cf 100644 --- a/packages/stream_chat_flutter/lib/src/message_input.dart +++ b/packages/stream_chat_flutter/lib/src/message_input.dart @@ -76,7 +76,7 @@ enum SendButtonLocation { const _kMinMediaPickerSize = 360.0; -const _kMaxAttachmentSize = 20971520; // 20MB in Bytes +const _kDefaultMaxAttachmentSize = 20971520; // 20MB in Bytes /// Inactive state /// ![screenshot](https://raw.githubusercontent.com/GetStream/stream-chat-flutter/master/screenshots/message_input.png) @@ -148,11 +148,16 @@ class MessageInput extends StatefulWidget { this.activeSendButton, this.showCommandsButton = true, this.mentionsTileBuilder, + this.maxAttachmentSize = _kDefaultMaxAttachmentSize, }) : super(key: key); /// Message to edit final Message? editMessage; + /// Max attachment size in bytes + /// If you're using our default CDN do not set it + final int maxAttachmentSize; + /// Message to start with final Message? initialMessage; @@ -1108,12 +1113,12 @@ class MessageInputState extends State { bytes: mediaFile.readAsBytesSync(), ); - if (file.size! > _kMaxAttachmentSize) { + if (file.size! > widget.maxAttachmentSize) { if (medium.type == AssetType.video) { final mediaInfo = await (VideoService.compressVideo(file.path) as FutureOr); - if (mediaInfo.filesize! > _kMaxAttachmentSize) { + if (mediaInfo.filesize! > widget.maxAttachmentSize) { _showErrorAlert( // ignore: lines_longer_than_80_chars 'The file is too large to upload. The file size limit is 20MB. We tried compressing it, but it was not enough.', @@ -1896,12 +1901,12 @@ class MessageInputState extends State { extraData: extraDataMap, ); - if (file.size! > _kMaxAttachmentSize) { + if (file.size! > widget.maxAttachmentSize) { if (attachmentType == 'Video') { final mediaInfo = await (VideoService.compressVideo(file.path) as FutureOr); - if (mediaInfo.filesize! > _kMaxAttachmentSize) { + if (mediaInfo.filesize! > widget.maxAttachmentSize) { _showErrorAlert( // ignore: lines_longer_than_80_chars 'The file is too large to upload. The file size limit is 20MB. We tried compressing it, but it was not enough.', From 988f19ece837806dc5c680e0644ecc57e1c8b01b Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Thu, 20 May 2021 16:31:36 +0200 Subject: [PATCH 16/27] fix file attachment in messageinput --- .../lib/src/attachment/file_attachment.dart | 112 ++++++++---------- .../lib/src/message_input.dart | 13 +- .../lib/src/video_service.dart | 4 +- 3 files changed, 59 insertions(+), 70 deletions(-) diff --git a/packages/stream_chat_flutter/lib/src/attachment/file_attachment.dart b/packages/stream_chat_flutter/lib/src/attachment/file_attachment.dart index 63bcdd9b..a676e576 100644 --- a/packages/stream_chat_flutter/lib/src/attachment/file_attachment.dart +++ b/packages/stream_chat_flutter/lib/src/attachment/file_attachment.dart @@ -159,6 +159,7 @@ class FileAttachment extends AttachmentWidget { shape: _getDefaultShape(context), child: source.when( local: () => VideoThumbnailImage( + fit: BoxFit.cover, video: attachment.file!.path!, placeholderBuilder: (_) => const Center( child: SizedBox( @@ -169,6 +170,7 @@ class FileAttachment extends AttachmentWidget { ), ), network: () => VideoThumbnailImage( + fit: BoxFit.cover, video: attachment.assetUrl!, placeholderBuilder: (_) => const Center( child: SizedBox( @@ -212,50 +214,42 @@ class FileAttachment extends AttachmentWidget { final attachmentId = attachment.id; var trailingWidget = trailing; trailingWidget ??= attachment.uploadState.when( - preparing: () => Padding( - padding: const EdgeInsets.all(8), - child: _buildButton( - icon: StreamSvgIcon.close(color: theme.colorTheme.white), - fillColor: theme.colorTheme.overlayDark, - onPressed: () => channel.cancelAttachmentUpload(attachmentId), - ), + preparing: () => Padding( + padding: const EdgeInsets.all(8), + child: _buildButton( + icon: StreamSvgIcon.close(color: theme.colorTheme.white), + fillColor: theme.colorTheme.overlayDark, + onPressed: () => channel.cancelAttachmentUpload(attachmentId), + ), + ), + inProgress: (_, __) => Padding( + padding: const EdgeInsets.all(8), + child: _buildButton( + icon: StreamSvgIcon.close(color: theme.colorTheme.white), + fillColor: theme.colorTheme.overlayDark, + onPressed: () => channel.cancelAttachmentUpload(attachmentId), + ), + ), + success: () => Padding( + padding: const EdgeInsets.all(8), + child: CircleAvatar( + backgroundColor: theme.colorTheme.accentBlue, + maxRadius: 12, + child: StreamSvgIcon.check(color: theme.colorTheme.white), + ), + ), + failed: (_) => Padding( + padding: const EdgeInsets.all(8), + child: _buildButton( + icon: StreamSvgIcon.retry(color: theme.colorTheme.white), + fillColor: theme.colorTheme.overlayDark, + onPressed: () => channel.retryAttachmentUpload( + message.id, + attachmentId, ), - inProgress: (_, __) => Padding( - padding: const EdgeInsets.all(8), - child: _buildButton( - icon: StreamSvgIcon.close(color: theme.colorTheme.white), - fillColor: theme.colorTheme.overlayDark, - onPressed: () => channel.cancelAttachmentUpload(attachmentId), - ), - ), - success: () => Padding( - padding: const EdgeInsets.all(8), - child: CircleAvatar( - backgroundColor: theme.colorTheme.accentBlue, - maxRadius: 12, - child: StreamSvgIcon.check(color: theme.colorTheme.white), - ), - ), - failed: (_) => Padding( - padding: const EdgeInsets.all(8), - child: _buildButton( - icon: StreamSvgIcon.retry(color: theme.colorTheme.white), - fillColor: theme.colorTheme.overlayDark, - onPressed: () => channel.retryAttachmentUpload( - message.id, - attachmentId, - ), - ), - ), - ) ?? - IconButton( - icon: StreamSvgIcon.cloudDownload(color: theme.colorTheme.black), - visualDensity: VisualDensity.compact, - splashRadius: 16, - onPressed: () { - launchURL(context, attachment.assetUrl); - }, - ); + ), + ), + ); if (message.status == MessageSendingStatus.sent) { trailingWidget = IconButton( @@ -281,25 +275,17 @@ class FileAttachment extends AttachmentWidget { color: theme.colorTheme.grey, ); return attachment.uploadState.when( - preparing: () => UploadProgressIndicator( - uploaded: 0, - total: double.maxFinite.toInt(), - showBackground: false, - padding: EdgeInsets.zero, - textStyle: textStyle, - progressIndicatorColor: theme.colorTheme.accentBlue, - ), - inProgress: (sent, total) => UploadProgressIndicator( - uploaded: sent, - total: total, - showBackground: false, - padding: EdgeInsets.zero, - textStyle: textStyle, - progressIndicatorColor: theme.colorTheme.accentBlue, - ), - success: () => Text(fileSize(size), style: textStyle), - failed: (_) => Text('UPLOAD ERROR', style: textStyle), - ) ?? - Text(fileSize(size), style: textStyle); + preparing: () => Text(fileSize(size), style: textStyle), + inProgress: (sent, total) => UploadProgressIndicator( + uploaded: sent, + total: total, + showBackground: false, + padding: EdgeInsets.zero, + textStyle: textStyle, + progressIndicatorColor: theme.colorTheme.accentBlue, + ), + success: () => Text(fileSize(size), style: textStyle), + failed: (_) => Text('UPLOAD ERROR', style: textStyle), + ); } } diff --git a/packages/stream_chat_flutter/lib/src/message_input.dart b/packages/stream_chat_flutter/lib/src/message_input.dart index 6d3ec5cf..db082c1c 100644 --- a/packages/stream_chat_flutter/lib/src/message_input.dart +++ b/packages/stream_chat_flutter/lib/src/message_input.dart @@ -1114,8 +1114,8 @@ class MessageInputState extends State { ); if (file.size! > widget.maxAttachmentSize) { - if (medium.type == AssetType.video) { - final mediaInfo = await (VideoService.compressVideo(file.path) + if (medium.type == AssetType.video && file.path != null) { + final mediaInfo = await (VideoService.compressVideo(file.path!) as FutureOr); if (mediaInfo.filesize! > widget.maxAttachmentSize) { @@ -1510,7 +1510,9 @@ class MessageInputState extends State { (e) => ClipRRect( borderRadius: BorderRadius.circular(10), child: FileAttachment( - message: Message(), // dummy message + message: Message( + status: MessageSendingStatus.sending, + ), // dummy message attachment: e, size: Size( MediaQuery.of(context).size.width * 0.65, @@ -1898,12 +1900,13 @@ class MessageInputState extends State { final attachment = Attachment( file: file, type: attachmentType, + uploadState: const UploadState.preparing(), extraData: extraDataMap, ); if (file.size! > widget.maxAttachmentSize) { - if (attachmentType == 'Video') { - final mediaInfo = await (VideoService.compressVideo(file.path) + if (attachmentType == 'video' && file.path != null) { + final mediaInfo = await (VideoService.compressVideo(file.path!) as FutureOr); if (mediaInfo.filesize! > widget.maxAttachmentSize) { diff --git a/packages/stream_chat_flutter/lib/src/video_service.dart b/packages/stream_chat_flutter/lib/src/video_service.dart index ba4761a2..290dd54b 100644 --- a/packages/stream_chat_flutter/lib/src/video_service.dart +++ b/packages/stream_chat_flutter/lib/src/video_service.dart @@ -28,9 +28,9 @@ class IVideoService { /// ); /// debugPrint(info.toJson()); /// ``` - Future compressVideo(String? path) async => _lock.synchronized( + Future compressVideo(String path) async => _lock.synchronized( () => VideoCompress.compressVideo( - path!, + path, ), ); From 3d2210233f8a0d47b5d99da345a2cf1b56c276b7 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Thu, 20 May 2021 16:56:45 +0200 Subject: [PATCH 17/27] update comment --- packages/stream_chat_flutter/lib/src/message_input.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/stream_chat_flutter/lib/src/message_input.dart b/packages/stream_chat_flutter/lib/src/message_input.dart index db082c1c..0d2070e7 100644 --- a/packages/stream_chat_flutter/lib/src/message_input.dart +++ b/packages/stream_chat_flutter/lib/src/message_input.dart @@ -155,7 +155,8 @@ class MessageInput extends StatefulWidget { final Message? editMessage; /// Max attachment size in bytes - /// If you're using our default CDN do not set it + /// Defaults to 20 MB + /// do not set it if you're using our default CDN final int maxAttachmentSize; /// Message to start with From 02037b684ce0cafb7116c0ee66e87a6edf3f3cfb Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Fri, 21 May 2021 09:40:03 +0200 Subject: [PATCH 18/27] fix analyze --- packages/stream_chat_flutter/lib/src/image_footer.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/stream_chat_flutter/lib/src/image_footer.dart b/packages/stream_chat_flutter/lib/src/image_footer.dart index cc79192b..0a6571cc 100644 --- a/packages/stream_chat_flutter/lib/src/image_footer.dart +++ b/packages/stream_chat_flutter/lib/src/image_footer.dart @@ -76,7 +76,7 @@ class _ImageFooterState extends State { @override Widget build(BuildContext context) { - final showShareButton = !kIsWeb; + const showShareButton = !kIsWeb; final mediaQueryData = MediaQuery.of(context); final chatThemeData = StreamChatTheme.of(context); return SizedBox.fromSize( From bdc19a9d5975b60a039147f6c61053396f290ed8 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Fri, 21 May 2021 10:41:50 +0200 Subject: [PATCH 19/27] make timeoutOrExpirationDate optional --- packages/stream_chat/lib/src/client.dart | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/packages/stream_chat/lib/src/client.dart b/packages/stream_chat/lib/src/client.dart index 05f2559b..6e7caa9e 100644 --- a/packages/stream_chat/lib/src/client.dart +++ b/packages/stream_chat/lib/src/client.dart @@ -1361,12 +1361,13 @@ class StreamChatClient { /// [timeoutOrExpirationDate] can either be a [DateTime] or a value in seconds /// to be added to [DateTime.now] Future pinMessage( - Message message, - Object timeoutOrExpirationDate, - ) { + Message message, [ + Object? timeoutOrExpirationDate, + ]) { assert(() { if (timeoutOrExpirationDate is! DateTime && - timeoutOrExpirationDate is! num) { + timeoutOrExpirationDate is! num && + timeoutOrExpirationDate != null) { throw ArgumentError('Invalid timeout or Expiration date'); } return true; @@ -1383,13 +1384,19 @@ class StreamChatClient { .toUtc(); } return updateMessage( - message.copyWith(pinned: true, pinExpires: pinExpires), + message.copyWith( + pinned: true, + pinExpires: pinExpires, + ), ); } /// Unpins provided message - Future unpinMessage(Message message) => - updateMessage(message.copyWith(pinned: false)); + Future unpinMessage(Message message) => updateMessage( + message.copyWith( + pinned: false, + ), + ); } /// The class that handles the state of the channel listening to the events From 32cb1e77001d038911f538a4181562d08e44c0da Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Fri, 21 May 2021 10:45:59 +0200 Subject: [PATCH 20/27] replicate in channel --- packages/stream_chat/lib/src/api/channel.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/stream_chat/lib/src/api/channel.dart b/packages/stream_chat/lib/src/api/channel.dart index 69d967fe..384ca105 100644 --- a/packages/stream_chat/lib/src/api/channel.dart +++ b/packages/stream_chat/lib/src/api/channel.dart @@ -507,9 +507,9 @@ class Channel { /// Pins provided message Future pinMessage( - Message message, + Message message, [ Object? timeoutOrExpirationDate, - ) { + ]) { assert(() { if (timeoutOrExpirationDate is! DateTime && timeoutOrExpirationDate != null && From a543cf325a11fcfd8315ecbeaa211fecc37e1bef Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Fri, 21 May 2021 10:50:35 +0200 Subject: [PATCH 21/27] fix assert error message --- packages/stream_chat/lib/src/api/channel.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/stream_chat/lib/src/api/channel.dart b/packages/stream_chat/lib/src/api/channel.dart index 384ca105..657126c1 100644 --- a/packages/stream_chat/lib/src/api/channel.dart +++ b/packages/stream_chat/lib/src/api/channel.dart @@ -517,7 +517,7 @@ class Channel { throw ArgumentError('Invalid timeout or Expiration date'); } return true; - }(), 'Check for invalid token or expiration date'); + }(), 'Check whether time out is valid'); DateTime? pinExpires; if (timeoutOrExpirationDate is DateTime) { From 5b39893f768970f68ad80c47e64e254851d99982 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Fri, 21 May 2021 11:36:08 +0200 Subject: [PATCH 22/27] add test --- .../stream_chat/test/src/client_test.dart | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/packages/stream_chat/test/src/client_test.dart b/packages/stream_chat/test/src/client_test.dart index b2a5bbac..53792764 100644 --- a/packages/stream_chat/test/src/client_test.dart +++ b/packages/stream_chat/test/src/client_test.dart @@ -1112,6 +1112,28 @@ void main() { data: {'message': anything})).called(1); }); + test('should complete successfully with a null value', () async { + final message = Message(text: 'Hello'); + + when( + () => mockDio.post( + '/messages/${message.id}', + data: anything, + ), + ).thenAnswer( + (_) async => Response( + data: jsonEncode({'message': message}), + statusCode: 200, + requestOptions: FakeRequestOptions(), + ), + ); + + await client.pinMessage(message); + + verify(() => mockDio.post('/messages/${message.id}', + data: {'message': anything})).called(1); + }); + test('should unpin message successfully', () async { final message = Message(text: 'Hello'); From d764de9f689d59c6c71320e4f7d02e57b4bfcd1f Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Fri, 21 May 2021 11:37:03 +0200 Subject: [PATCH 23/27] add test --- .../test/src/api/channel_test.dart | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/packages/stream_chat/test/src/api/channel_test.dart b/packages/stream_chat/test/src/api/channel_test.dart index c3409b7e..f92b05bb 100644 --- a/packages/stream_chat/test/src/api/channel_test.dart +++ b/packages/stream_chat/test/src/api/channel_test.dart @@ -449,6 +449,51 @@ void main() { .called(1); }); + test('should be pinned successfully with null timeout', () async { + final mockDio = MockDio(); + + when(() => mockDio.options).thenReturn(BaseOptions()); + when(() => mockDio.interceptors).thenReturn(Interceptors()); + + final client = StreamChatClient( + 'api-key', + httpClient: mockDio, + tokenProvider: (_) async => '', + ); + final channelClient = client.channel('messaging', id: 'testid'); + final message = Message(text: 'Hello', id: 'test'); + + when(() => mockDio.post( + any(), + data: any(named: 'data'), + )).thenAnswer((_) async => Response( + data: jsonEncode(ChannelState()), + statusCode: 200, + requestOptions: FakeRequestOptions(), + )); + + await channelClient.watch(); + + when( + () => mockDio.post( + '/messages/${message.id}', + data: anything, + ), + ).thenAnswer( + (_) async => Response( + data: jsonEncode({'message': message}), + statusCode: 200, + requestOptions: FakeRequestOptions(), + ), + ); + + await channelClient.pinMessage(message); + + verify(() => + mockDio.post('/messages/${message.id}', data: anything)) + .called(1); + }); + test('should be unpinned successfully', () async { final mockDio = MockDio(); From 69fdeb813d983bbb83c09ec7f8ae4dc93bf3cd1a Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Fri, 21 May 2021 15:08:58 +0200 Subject: [PATCH 24/27] fix channel header text theme --- .../lib/src/channel_header.dart | 1 + .../lib/src/channel_name.dart | 7 ++-- .../lib/src/stream_chat_theme.dart | 34 ++++++++++--------- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/packages/stream_chat_flutter/lib/src/channel_header.dart b/packages/stream_chat_flutter/lib/src/channel_header.dart index d06c128c..7773b36f 100644 --- a/packages/stream_chat_flutter/lib/src/channel_header.dart +++ b/packages/stream_chat_flutter/lib/src/channel_header.dart @@ -137,6 +137,7 @@ class ChannelHeader extends StatelessWidget implements PreferredSizeWidget { showMessage: showConnectionStateTile ? showStatus : false, message: statusString, child: AppBar( + textTheme: Theme.of(context).textTheme, brightness: Theme.of(context).brightness, elevation: 1, leading: leadingWidget, diff --git a/packages/stream_chat_flutter/lib/src/channel_name.dart b/packages/stream_chat_flutter/lib/src/channel_name.dart index 2cd804c9..5db3341a 100644 --- a/packages/stream_chat_flutter/lib/src/channel_name.dart +++ b/packages/stream_chat_flutter/lib/src/channel_name.dart @@ -29,8 +29,11 @@ class ChannelName extends StatelessWidget { return StreamBuilder>( stream: channel.extraDataStream, initialData: channel.extraData, - builder: (context, snapshot) => - _buildName(snapshot.data!, channel.state?.members, client), + builder: (context, snapshot) => _buildName( + snapshot.data!, + channel.state?.members, + client, + ), ); } 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 97363df7..25c2ca32 100644 --- a/packages/stream_chat_flutter/lib/src/stream_chat_theme.dart +++ b/packages/stream_chat_flutter/lib/src/stream_chat_theme.dart @@ -230,22 +230,23 @@ class StreamChatThemeData { ), ), channelPreviewTheme: ChannelPreviewTheme( - unreadCounterColor: colorTheme.accentRed, - avatarTheme: AvatarTheme( - borderRadius: BorderRadius.circular(20), - constraints: const BoxConstraints.tightFor( - height: 40, - width: 40, - ), + unreadCounterColor: colorTheme.accentRed, + avatarTheme: AvatarTheme( + borderRadius: BorderRadius.circular(20), + constraints: const BoxConstraints.tightFor( + height: 40, + width: 40, ), - title: textTheme.bodyBold, - subtitle: textTheme.footnote.copyWith( - color: const Color(0xff7A7A7A), - ), - lastMessageAt: textTheme.footnote.copyWith( - color: colorTheme.black.withOpacity(.5), - ), - indicatorIconSize: 16), + ), + title: textTheme.bodyBold, + subtitle: textTheme.footnote.copyWith( + color: const Color(0xff7A7A7A), + ), + lastMessageAt: textTheme.footnote.copyWith( + color: colorTheme.black.withOpacity(.5), + ), + indicatorIconSize: 16, + ), channelListHeaderTheme: ChannelListHeaderTheme( avatarTheme: AvatarTheme( borderRadius: BorderRadius.circular(20), @@ -1186,7 +1187,8 @@ class MessageInputTheme { actionButtonIdleColor: other.actionButtonIdleColor, sendButtonColor: other.sendButtonColor, sendButtonIdleColor: other.sendButtonIdleColor, - inputTextStyle: other.inputTextStyle, + inputTextStyle: + inputTextStyle?.merge(other.inputTextStyle) ?? other.inputTextStyle, inputDecoration: inputDecoration?.merge(other.inputDecoration) ?? other.inputDecoration, activeBorderGradient: other.activeBorderGradient, From 05402ee3384044cfe5ca8afff64a798dc2be8b83 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Fri, 21 May 2021 15:10:07 +0200 Subject: [PATCH 25/27] apply texttheme to rest of headers --- packages/stream_chat_flutter/lib/src/channel_list_header.dart | 1 + packages/stream_chat_flutter/lib/src/image_header.dart | 1 + packages/stream_chat_flutter/lib/src/thread_header.dart | 1 + 3 files changed, 3 insertions(+) diff --git a/packages/stream_chat_flutter/lib/src/channel_list_header.dart b/packages/stream_chat_flutter/lib/src/channel_list_header.dart index 325736f1..4a8f78c3 100644 --- a/packages/stream_chat_flutter/lib/src/channel_list_header.dart +++ b/packages/stream_chat_flutter/lib/src/channel_list_header.dart @@ -120,6 +120,7 @@ class ChannelListHeader extends StatelessWidget implements PreferredSizeWidget { showMessage: showConnectionStateTile ? showStatus : false, message: statusString, child: AppBar( + textTheme: Theme.of(context).textTheme, brightness: Theme.of(context).brightness, elevation: 1, backgroundColor: chatThemeData.channelListHeaderTheme.color, diff --git a/packages/stream_chat_flutter/lib/src/image_header.dart b/packages/stream_chat_flutter/lib/src/image_header.dart index 095d7534..434a73c5 100644 --- a/packages/stream_chat_flutter/lib/src/image_header.dart +++ b/packages/stream_chat_flutter/lib/src/image_header.dart @@ -53,6 +53,7 @@ class ImageHeader extends StatelessWidget implements PreferredSizeWidget { Widget build(BuildContext context) { final chatThemeData = StreamChatTheme.of(context); return AppBar( + textTheme: Theme.of(context).textTheme, brightness: Theme.of(context).brightness, elevation: 1, leading: showBackButton diff --git a/packages/stream_chat_flutter/lib/src/thread_header.dart b/packages/stream_chat_flutter/lib/src/thread_header.dart index 347fc59d..d16aa530 100644 --- a/packages/stream_chat_flutter/lib/src/thread_header.dart +++ b/packages/stream_chat_flutter/lib/src/thread_header.dart @@ -101,6 +101,7 @@ class ThreadHeader extends StatelessWidget implements PreferredSizeWidget { final chatThemeData = StreamChatTheme.of(context); return AppBar( automaticallyImplyLeading: false, + textTheme: Theme.of(context).textTheme, brightness: Theme.of(context).brightness, elevation: 1, leading: leading ?? From c151a86fc746fa6282f56e3a869058f05d803e83 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Fri, 21 May 2021 15:23:20 +0200 Subject: [PATCH 26/27] fix typo --- packages/stream_chat/lib/src/api/channel.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/stream_chat/lib/src/api/channel.dart b/packages/stream_chat/lib/src/api/channel.dart index 657126c1..2b6bc0a9 100644 --- a/packages/stream_chat/lib/src/api/channel.dart +++ b/packages/stream_chat/lib/src/api/channel.dart @@ -517,7 +517,7 @@ class Channel { throw ArgumentError('Invalid timeout or Expiration date'); } return true; - }(), 'Check whether time out is valid'); + }(), 'Check whether timeout is valid'); DateTime? pinExpires; if (timeoutOrExpirationDate is DateTime) { From d07b3776ecc5037904c4238d2faf8f317c6c76db Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Thu, 27 May 2021 09:49:11 +0200 Subject: [PATCH 27/27] fix use of reduce --- .../lib/src/message_list_view.dart | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/stream_chat_flutter/lib/src/message_list_view.dart b/packages/stream_chat_flutter/lib/src/message_list_view.dart index e07d9358..db14924b 100644 --- a/packages/stream_chat_flutter/lib/src/message_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/message_list_view.dart @@ -570,9 +570,9 @@ class _MessageListViewState extends State { return const SizedBox(); } - var index = _getTopElement(values).index; + var index = _getTopElement(values)?.index; - if (index > messages.length) { + if (index == null || index > messages.length) { return const SizedBox(); } @@ -598,10 +598,17 @@ class _MessageListViewState extends State { StreamChannelState? channel, QueryDirection direction) => _messageListController.paginateData!(direction: direction); - ItemPosition _getTopElement(Iterable values) => values - .where((ItemPosition position) => position.itemLeadingEdge < 0.9) - .reduce((ItemPosition max, ItemPosition position) => - position.itemLeadingEdge > max.itemLeadingEdge ? position : max); + ItemPosition? _getTopElement(Iterable values) { + final inView = + values.where((ItemPosition position) => position.itemLeadingEdge < 0.9); + + if (inView.isEmpty) { + return null; + } + + return inView.reduce((ItemPosition max, ItemPosition position) => + position.itemLeadingEdge > max.itemLeadingEdge ? position : max); + } Widget _buildScrollToBottom() => StreamBuilder>( stream: Rx.combineLatest2(