From 8ec54f3834048cfe20ddb41a6ad204082d5080df Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Mon, 15 Mar 2021 14:53:44 +0530 Subject: [PATCH 01/24] style: Apply team linter in stream chat persistence (#331) * lint(persistence): Apply team linter Signed-off-by: Sahil Kumar * style: flutter format Signed-off-by: Sahil Kumar --- .../analysis_options.yaml | 147 ++++++ .../lib/src/converter/list_converter.dart | 4 +- .../lib/src/converter/map_converter.dart | 4 +- .../lib/src/dao/channel_dao.dart | 52 +- .../lib/src/dao/channel_query_dao.dart | 49 +- .../lib/src/dao/connection_event_dao.dart | 63 ++- .../lib/src/dao/dao.dart | 8 +- .../lib/src/dao/member_dao.dart | 56 +-- .../lib/src/dao/message_dao.dart | 54 +-- .../lib/src/dao/pinned_message_dao.dart | 56 +-- .../lib/src/dao/reaction_dao.dart | 59 ++- .../lib/src/dao/read_dao.dart | 44 +- .../lib/src/dao/user_dao.dart | 18 +- .../lib/src/db/moor_chat_database.dart | 15 +- .../lib/src/db/shared/native_db.dart | 24 +- .../lib/src/db/shared/unsupported_db.dart | 6 +- .../lib/src/db/shared/web_db.dart | 2 +- .../lib/src/entity/entity.dart | 8 +- .../lib/src/entity/pinned_messages.dart | 2 +- .../lib/src/mapper/channel_mapper.dart | 47 +- .../lib/src/mapper/event_mapper.dart | 12 +- .../lib/src/mapper/mapper.dart | 6 +- .../lib/src/mapper/member_mapper.dart | 56 +-- .../lib/src/mapper/message_mapper.dart | 118 +++-- .../lib/src/mapper/pinned_message_mapper.dart | 118 +++-- .../lib/src/mapper/reaction_mapper.dart | 38 +- .../lib/src/mapper/read_mapper.dart | 26 +- .../lib/src/mapper/user_mapper.dart | 44 +- .../src/stream_chat_persistence_client.dart | 447 ++++++++---------- packages/stream_chat_persistence/pubspec.yaml | 2 +- 30 files changed, 813 insertions(+), 772 deletions(-) create mode 100644 packages/stream_chat_persistence/analysis_options.yaml diff --git a/packages/stream_chat_persistence/analysis_options.yaml b/packages/stream_chat_persistence/analysis_options.yaml new file mode 100644 index 00000000..7e4b00fa --- /dev/null +++ b/packages/stream_chat_persistence/analysis_options.yaml @@ -0,0 +1,147 @@ +analyzer: + exclude: + - lib/**/*.g.dart + - lib/**/*.freezed.dart + - example/* + - test/* +linter: + rules: + - 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 + - diagnostic_describe_all_properties + - 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_put_required_named_parameters_first + - 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 + - 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 + + # To be added when null-safe: + # - cast_nullable_to_non_nullable + #- unnecessary_null_checks + # - tighten_type_of_initializing_formals + # - null_check_on_nullable_type_parameter \ No newline at end of file diff --git a/packages/stream_chat_persistence/lib/src/converter/list_converter.dart b/packages/stream_chat_persistence/lib/src/converter/list_converter.dart index d14642ce..cbb8ec05 100644 --- a/packages/stream_chat_persistence/lib/src/converter/list_converter.dart +++ b/packages/stream_chat_persistence/lib/src/converter/list_converter.dart @@ -6,7 +6,7 @@ import 'package:moor/moor.dart'; /// by the sqlite backend. class ListConverter extends TypeConverter, String> { @override - List mapToDart(fromDb) { + List mapToDart(String fromDb) { if (fromDb == null) { return null; } @@ -14,7 +14,7 @@ class ListConverter extends TypeConverter, String> { } @override - String mapToSql(value) { + String mapToSql(List value) { if (value == null) { return null; } diff --git a/packages/stream_chat_persistence/lib/src/converter/map_converter.dart b/packages/stream_chat_persistence/lib/src/converter/map_converter.dart index 6e7a648d..b11eb5b8 100644 --- a/packages/stream_chat_persistence/lib/src/converter/map_converter.dart +++ b/packages/stream_chat_persistence/lib/src/converter/map_converter.dart @@ -6,7 +6,7 @@ import 'package:moor/moor.dart'; /// by the sqlite backend. class MapConverter extends TypeConverter, String> { @override - Map mapToDart(fromDb) { + Map mapToDart(String fromDb) { if (fromDb == null) { return null; } @@ -14,7 +14,7 @@ class MapConverter extends TypeConverter, String> { } @override - String mapToSql(value) { + String mapToSql(Map value) { if (value == null) { return null; } diff --git a/packages/stream_chat_persistence/lib/src/dao/channel_dao.dart b/packages/stream_chat_persistence/lib/src/dao/channel_dao.dart index 57ec95d3..e75cead6 100644 --- a/packages/stream_chat_persistence/lib/src/dao/channel_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/channel_dao.dart @@ -3,7 +3,7 @@ import 'package:stream_chat/stream_chat.dart'; import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; import 'package:stream_chat_persistence/src/entity/channels.dart'; import 'package:stream_chat_persistence/src/entity/users.dart'; -import '../mapper/mapper.dart'; +import 'package:stream_chat_persistence/src/mapper/mapper.dart'; part 'channel_dao.g.dart'; @@ -15,15 +15,14 @@ class ChannelDao extends DatabaseAccessor ChannelDao(MoorChatDatabase db) : super(db); /// Get channel by cid - Future getChannelByCid(String cid) async { - return (select(channels)..where((c) => c.cid.equals(cid))).join([ - leftOuterJoin(users, channels.createdById.equalsExp(users.id)), - ]).map((rows) { - final channel = rows.readTable(channels); - final createdBy = rows.readTable(users); - return channel.toChannelModel(createdBy: createdBy?.toUser()); - }).getSingle(); - } + Future getChannelByCid(String cid) async => + (select(channels)..where((c) => c.cid.equals(cid))).join([ + leftOuterJoin(users, channels.createdById.equalsExp(users.id)), + ]).map((rows) { + final channel = rows.readTable(channels); + final createdBy = rows.readTable(users); + return channel.toChannelModel(createdBy: createdBy?.toUser()); + }).getSingle(); /// Delete all channels by matching cid in [cids] /// @@ -31,27 +30,22 @@ class ChannelDao extends DatabaseAccessor /// 1. Channel Reads /// 2. Channel Members /// 3. Channel Messages -> Messages Reactions - Future deleteChannelByCids(List cids) async { - return (delete(channels)..where((tbl) => tbl.cid.isIn(cids))).go(); - } + Future deleteChannelByCids(List cids) async => + (delete(channels)..where((tbl) => tbl.cid.isIn(cids))).go(); /// Get the channel cids saved in the storage - Future> get cids { - return (select(channels) - ..orderBy([(c) => OrderingTerm.desc(c.lastMessageAt)]) - ..limit(250)) - .map((c) => c.cid) - .get(); - } + Future> get cids => (select(channels) + ..orderBy([(c) => OrderingTerm.desc(c.lastMessageAt)]) + ..limit(250)) + .map((c) => c.cid) + .get(); /// Updates all the channels using the new [channelList] data - Future updateChannels(List channelList) { - return batch( - (it) => it.insertAll( - channels, - channelList.map((c) => c.toEntity()).toList(), - mode: InsertMode.insertOrReplace, - ), - ); - } + Future updateChannels(List channelList) => batch( + (it) => it.insertAll( + channels, + channelList.map((c) => c.toEntity()).toList(), + mode: InsertMode.insertOrReplace, + ), + ); } diff --git a/packages/stream_chat_persistence/lib/src/dao/channel_query_dao.dart b/packages/stream_chat_persistence/lib/src/dao/channel_query_dao.dart index b5f6fe59..785b5946 100644 --- a/packages/stream_chat_persistence/lib/src/dao/channel_query_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/channel_query_dao.dart @@ -7,7 +7,7 @@ import 'package:stream_chat_persistence/src/entity/channel_queries.dart'; import 'package:stream_chat_persistence/src/entity/channels.dart'; import 'package:stream_chat_persistence/src/entity/users.dart'; -import '../mapper/mapper.dart'; +import 'package:stream_chat_persistence/src/mapper/mapper.dart'; part 'channel_query_dao.g.dart'; @@ -31,31 +31,31 @@ class ChannelQueryDao extends DatabaseAccessor /// the list of matching rows will be deleted Future updateChannelQueries( Map filter, - List cids, + List cids, { bool clearQueryCache, - ) async { - return transaction(() async { - final hash = _computeHash(filter); - if (clearQueryCache) { + }) async => + transaction(() async { + final hash = _computeHash(filter); + if (clearQueryCache) { + await batch((it) { + it.deleteWhere( + channelQueries, + (c) => c.queryHash.equals(hash), + ); + }); + } + await batch((it) { - it.deleteWhere( + it.insertAll( channelQueries, - (c) => c.queryHash.equals(hash), + cids + .map((cid) => + ChannelQueryEntity(queryHash: hash, channelCid: cid)) + .toList(), + mode: InsertMode.insertOrReplace, ); }); - } - - await batch((it) { - it.insertAll( - channelQueries, - cids.map((cid) { - return ChannelQueryEntity(queryHash: hash, channelCid: cid); - }).toList(), - mode: InsertMode.insertOrReplace, - ); }); - }); - } /// Get list of channels by filter, sort and paginationParams Future> getChannels({ @@ -70,7 +70,7 @@ class ChannelQueryDao extends DatabaseAccessor ); } return true; - }()); + }(), ''); final hash = _computeHash(filter); final cachedChannelCids = await (select(channelQueries) @@ -89,10 +89,11 @@ class ChannelQueryDao extends DatabaseAccessor })).get(); final possibleSortingFields = cachedChannels.fold>( - ChannelModel.topLevelFields, (previousValue, element) { - return {...previousValue, ...element.extraData.keys}.toList(); - }); + ChannelModel.topLevelFields, + (previousValue, element) => + {...previousValue, ...element.extraData.keys}.toList()); + // ignore: parameter_assignments sort = sort ?.where((s) => possibleSortingFields.contains(s.field)) ?.toList(growable: false); diff --git a/packages/stream_chat_persistence/lib/src/dao/connection_event_dao.dart b/packages/stream_chat_persistence/lib/src/dao/connection_event_dao.dart index 92764b10..94b0d333 100644 --- a/packages/stream_chat_persistence/lib/src/dao/connection_event_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/connection_event_dao.dart @@ -4,7 +4,7 @@ import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; import 'package:stream_chat_persistence/src/entity/connection_events.dart'; import 'package:stream_chat_persistence/src/entity/users.dart'; -import '../mapper/mapper.dart'; +import 'package:stream_chat_persistence/src/mapper/mapper.dart'; part 'connection_event_dao.g.dart'; @@ -16,43 +16,38 @@ class ConnectionEventDao extends DatabaseAccessor ConnectionEventDao(MoorChatDatabase db) : super(db); /// Get the latest stored connection event - Future get connectionEvent { - return select(connectionEvents).map((eventEntity) { - return eventEntity.toEvent(); - }).getSingle(); - } + Future get connectionEvent => select(connectionEvents) + .map((eventEntity) => eventEntity.toEvent()) + .getSingle(); /// Get the latest stored lastSyncAt - Future get lastSyncAt { - return select(connectionEvents).getSingle().then((r) => r?.lastSyncAt); - } + Future get lastSyncAt => + select(connectionEvents).getSingle().then((r) => r?.lastSyncAt); /// Update stored connection event with latest data - Future updateConnectionEvent(Event event) async { - return transaction(() async { - final connectionInfo = await select(connectionEvents).getSingle(); - await into(connectionEvents).insert( - ConnectionEventEntity( - id: 1, - lastSyncAt: connectionInfo?.lastSyncAt, - lastEventAt: event.createdAt ?? connectionInfo?.lastEventAt, - totalUnreadCount: - event.totalUnreadCount ?? connectionInfo?.totalUnreadCount, - ownUser: event.me?.toJson() ?? connectionInfo?.ownUser, - unreadChannels: - event.unreadChannels ?? connectionInfo?.unreadChannels, - ), - mode: InsertMode.insertOrReplace, - ); - }); - } + Future updateConnectionEvent(Event event) async => + transaction(() async { + final connectionInfo = await select(connectionEvents).getSingle(); + await into(connectionEvents).insert( + ConnectionEventEntity( + id: 1, + lastSyncAt: connectionInfo?.lastSyncAt, + lastEventAt: event.createdAt ?? connectionInfo?.lastEventAt, + totalUnreadCount: + event.totalUnreadCount ?? connectionInfo?.totalUnreadCount, + ownUser: event.me?.toJson() ?? connectionInfo?.ownUser, + unreadChannels: + event.unreadChannels ?? connectionInfo?.unreadChannels, + ), + mode: InsertMode.insertOrReplace, + ); + }); /// Update stored lastSyncAt with latest data - Future updateLastSyncAt(DateTime lastSyncAt) async { - return (update(connectionEvents)..where((tbl) => tbl.id.equals(1))).write( - ConnectionEventsCompanion( - lastSyncAt: Value(lastSyncAt), - ), - ); - } + Future updateLastSyncAt(DateTime lastSyncAt) async => + (update(connectionEvents)..where((tbl) => tbl.id.equals(1))).write( + ConnectionEventsCompanion( + lastSyncAt: Value(lastSyncAt), + ), + ); } diff --git a/packages/stream_chat_persistence/lib/src/dao/dao.dart b/packages/stream_chat_persistence/lib/src/dao/dao.dart index 31953630..53c2f372 100644 --- a/packages/stream_chat_persistence/lib/src/dao/dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/dao.dart @@ -1,9 +1,9 @@ -export 'user_dao.dart'; export 'channel_dao.dart'; +export 'channel_query_dao.dart'; +export 'connection_event_dao.dart'; +export 'member_dao.dart'; export 'message_dao.dart'; export 'pinned_message_dao.dart'; -export 'member_dao.dart'; -export 'connection_event_dao.dart'; export 'reaction_dao.dart'; export 'read_dao.dart'; -export 'channel_query_dao.dart'; +export 'user_dao.dart'; diff --git a/packages/stream_chat_persistence/lib/src/dao/member_dao.dart b/packages/stream_chat_persistence/lib/src/dao/member_dao.dart index ed30a931..e6c03996 100644 --- a/packages/stream_chat_persistence/lib/src/dao/member_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/member_dao.dart @@ -5,7 +5,7 @@ import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; import 'package:stream_chat_persistence/src/entity/members.dart'; import 'package:stream_chat_persistence/src/entity/users.dart'; -import '../mapper/mapper.dart'; +import 'package:stream_chat_persistence/src/mapper/mapper.dart'; part 'member_dao.g.dart'; @@ -17,37 +17,33 @@ class MemberDao extends DatabaseAccessor MemberDao(MoorChatDatabase db) : super(db); /// Get all members where [Members.channelCid] matches [cid] - Future> getMembersByCid(String cid) async { - return (select(members).join([ - leftOuterJoin(users, members.userId.equalsExp(users.id)), - ]) - ..where(members.channelCid.equals(cid)) - ..orderBy([OrderingTerm.asc(members.createdAt)])) - .map((row) { - final userEntity = row.readTable(users); - final memberEntity = row.readTable(members); - return memberEntity.toMember(user: userEntity?.toUser()); - }).get(); - } + Future> getMembersByCid(String cid) async => + (select(members).join([ + leftOuterJoin(users, members.userId.equalsExp(users.id)), + ]) + ..where(members.channelCid.equals(cid)) + ..orderBy([OrderingTerm.asc(members.createdAt)])) + .map((row) { + final userEntity = row.readTable(users); + final memberEntity = row.readTable(members); + return memberEntity.toMember(user: userEntity?.toUser()); + }).get(); /// Updates all the members using the new [memberList] data - Future updateMembers(String cid, List memberList) async { - return batch( - (it) => it.insertAll( - members, - memberList.map((m) => m.toEntity(cid: cid)).toList(), - mode: InsertMode.insertOrReplace, - ), - ); - } + Future updateMembers(String cid, List memberList) async => + batch( + (it) => it.insertAll( + members, + memberList.map((m) => m.toEntity(cid: cid)).toList(), + mode: InsertMode.insertOrReplace, + ), + ); /// Deletes all the members whose [Members.channelCid] is present in [cids] - Future deleteMemberByCids(List cids) async { - return batch((it) { - it.deleteWhere( - members, - (m) => m.channelCid.isIn(cids), - ); - }); - } + Future deleteMemberByCids(List cids) async => batch((it) { + it.deleteWhere( + members, + (m) => m.channelCid.isIn(cids), + ); + }); } diff --git a/packages/stream_chat_persistence/lib/src/dao/message_dao.dart b/packages/stream_chat_persistence/lib/src/dao/message_dao.dart index 204daaed..0be4446b 100644 --- a/packages/stream_chat_persistence/lib/src/dao/message_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/message_dao.dart @@ -4,7 +4,7 @@ import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; import 'package:stream_chat_persistence/src/entity/messages.dart'; import 'package:stream_chat_persistence/src/entity/users.dart'; -import '../mapper/mapper.dart'; +import 'package:stream_chat_persistence/src/mapper/mapper.dart'; part 'message_dao.g.dart'; @@ -25,17 +25,15 @@ class MessageDao extends DatabaseAccessor /// /// This will automatically delete the following linked records /// 1. Message Reactions - Future deleteMessageByIds(List messageIds) { - return (delete(messages)..where((tbl) => tbl.id.isIn(messageIds))).go(); - } + Future deleteMessageByIds(List messageIds) => + (delete(messages)..where((tbl) => tbl.id.isIn(messageIds))).go(); /// Removes all the messages by matching [Messages.channelCid] in [cids] /// /// This will automatically delete the following linked records /// 1. Message Reactions - Future deleteMessageByCids(List cids) async { - return (delete(messages)..where((tbl) => tbl.channelCid.isIn(cids))).go(); - } + Future deleteMessageByCids(List cids) async => + (delete(messages)..where((tbl) => tbl.channelCid.isIn(cids))).go(); Future _messageFromJoinRow(TypedResult rows) async { final userEntity = rows.readTable(_users); @@ -60,31 +58,29 @@ class MessageDao extends DatabaseAccessor } /// Returns a single message by matching the [Messages.id] with [id] - Future getMessageById(String id) async { - return await (select(messages).join([ - leftOuterJoin(_users, messages.userId.equalsExp(_users.id)), - leftOuterJoin( - _pinnedByUsers, messages.pinnedByUserId.equalsExp(_pinnedByUsers.id)), - ]) - ..where(messages.id.equals(id))) - .map(_messageFromJoinRow) - .getSingle(); - } + Future getMessageById(String id) async => + await (select(messages).join([ + leftOuterJoin(_users, messages.userId.equalsExp(_users.id)), + leftOuterJoin(_pinnedByUsers, + messages.pinnedByUserId.equalsExp(_pinnedByUsers.id)), + ]) + ..where(messages.id.equals(id))) + .map(_messageFromJoinRow) + .getSingle(); /// Returns all the messages of a particular thread by matching /// [Messages.channelCid] with [cid] - Future> getThreadMessages(String cid) async { - return Future.wait(await (select(messages).join([ - leftOuterJoin(users, messages.userId.equalsExp(_users.id)), - leftOuterJoin( - _pinnedByUsers, messages.pinnedByUserId.equalsExp(_pinnedByUsers.id)), - ]) - ..where(messages.channelCid.equals(cid)) - ..where(isNotNull(messages.parentId)) - ..orderBy([OrderingTerm.asc(messages.createdAt)])) - .map(_messageFromJoinRow) - .get()); - } + Future> getThreadMessages(String cid) async => + Future.wait(await (select(messages).join([ + leftOuterJoin(users, messages.userId.equalsExp(_users.id)), + leftOuterJoin(_pinnedByUsers, + messages.pinnedByUserId.equalsExp(_pinnedByUsers.id)), + ]) + ..where(messages.channelCid.equals(cid)) + ..where(isNotNull(messages.parentId)) + ..orderBy([OrderingTerm.asc(messages.createdAt)])) + .map(_messageFromJoinRow) + .get()); /// Returns all the messages of a particular thread by matching /// [Messages.parentId] with [parentId] diff --git a/packages/stream_chat_persistence/lib/src/dao/pinned_message_dao.dart b/packages/stream_chat_persistence/lib/src/dao/pinned_message_dao.dart index edf8e438..5e0ae721 100644 --- a/packages/stream_chat_persistence/lib/src/dao/pinned_message_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/pinned_message_dao.dart @@ -4,7 +4,7 @@ import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; import 'package:stream_chat_persistence/src/entity/pinned_messages.dart'; import 'package:stream_chat_persistence/src/entity/users.dart'; -import '../mapper/mapper.dart'; +import 'package:stream_chat_persistence/src/mapper/mapper.dart'; part 'pinned_message_dao.g.dart'; @@ -25,19 +25,15 @@ class PinnedMessageDao extends DatabaseAccessor /// /// This will automatically delete the following linked records /// 1. Message Reactions - Future deleteMessageByIds(List messageIds) { - return (delete(pinnedMessages)..where((tbl) => tbl.id.isIn(messageIds))) - .go(); - } + Future deleteMessageByIds(List messageIds) => + (delete(pinnedMessages)..where((tbl) => tbl.id.isIn(messageIds))).go(); /// Removes all the messages by matching [PinnedMessages.channelCid] in [cids] /// /// This will automatically delete the following linked records /// 1. Message Reactions - Future deleteMessageByCids(List cids) async { - return (delete(pinnedMessages)..where((tbl) => tbl.channelCid.isIn(cids))) - .go(); - } + Future deleteMessageByCids(List cids) async => + (delete(pinnedMessages)..where((tbl) => tbl.channelCid.isIn(cids))).go(); Future _messageFromJoinRow(TypedResult rows) async { final userEntity = rows.readTable(users); @@ -62,31 +58,29 @@ class PinnedMessageDao extends DatabaseAccessor } /// Returns a single message by matching the [PinnedMessages.id] with [id] - Future getMessageById(String id) async { - return await (select(pinnedMessages).join([ - leftOuterJoin(_users, pinnedMessages.userId.equalsExp(_users.id)), - leftOuterJoin(_pinnedByUsers, - pinnedMessages.pinnedByUserId.equalsExp(_pinnedByUsers.id)), - ]) - ..where(pinnedMessages.id.equals(id))) - .map(_messageFromJoinRow) - .getSingle(); - } + Future getMessageById(String id) async => + await (select(pinnedMessages).join([ + leftOuterJoin(_users, pinnedMessages.userId.equalsExp(_users.id)), + leftOuterJoin(_pinnedByUsers, + pinnedMessages.pinnedByUserId.equalsExp(_pinnedByUsers.id)), + ]) + ..where(pinnedMessages.id.equals(id))) + .map(_messageFromJoinRow) + .getSingle(); /// Returns all the messages of a particular thread by matching /// [PinnedMessages.channelCid] with [cid] - Future> getThreadMessages(String cid) async { - return Future.wait(await (select(pinnedMessages).join([ - leftOuterJoin(_users, pinnedMessages.userId.equalsExp(_users.id)), - leftOuterJoin(_pinnedByUsers, - pinnedMessages.pinnedByUserId.equalsExp(_pinnedByUsers.id)), - ]) - ..where(pinnedMessages.channelCid.equals(cid)) - ..where(isNotNull(pinnedMessages.parentId)) - ..orderBy([OrderingTerm.asc(pinnedMessages.createdAt)])) - .map(_messageFromJoinRow) - .get()); - } + Future> getThreadMessages(String cid) async => + Future.wait(await (select(pinnedMessages).join([ + leftOuterJoin(_users, pinnedMessages.userId.equalsExp(_users.id)), + leftOuterJoin(_pinnedByUsers, + pinnedMessages.pinnedByUserId.equalsExp(_pinnedByUsers.id)), + ]) + ..where(pinnedMessages.channelCid.equals(cid)) + ..where(isNotNull(pinnedMessages.parentId)) + ..orderBy([OrderingTerm.asc(pinnedMessages.createdAt)])) + .map(_messageFromJoinRow) + .get()); /// Returns all the messages of a particular thread by matching /// [PinnedMessages.parentId] with [parentId] diff --git a/packages/stream_chat_persistence/lib/src/dao/reaction_dao.dart b/packages/stream_chat_persistence/lib/src/dao/reaction_dao.dart index 99053fca..ef06326a 100644 --- a/packages/stream_chat_persistence/lib/src/dao/reaction_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/reaction_dao.dart @@ -3,7 +3,7 @@ import 'package:stream_chat/stream_chat.dart'; import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; import 'package:stream_chat_persistence/src/entity/reactions.dart'; import 'package:stream_chat_persistence/src/entity/users.dart'; -import '../mapper/mapper.dart'; +import 'package:stream_chat_persistence/src/mapper/mapper.dart'; part 'reaction_dao.g.dart'; @@ -16,18 +16,17 @@ class ReactionDao extends DatabaseAccessor /// Returns all the reactions of a particular message by matching /// [Reactions.messageId] with [messageId] - Future> getReactions(String messageId) { - return (select(reactions).join([ - leftOuterJoin(users, reactions.userId.equalsExp(users.id)), - ]) - ..where(reactions.messageId.equals(messageId)) - ..orderBy([OrderingTerm.asc(reactions.createdAt)])) - .map((rows) { - final userEntity = rows.readTable(users); - final reactionEntity = rows.readTable(reactions); - return reactionEntity.toReaction(user: userEntity?.toUser()); - }).get(); - } + Future> getReactions(String messageId) => + (select(reactions).join([ + leftOuterJoin(users, reactions.userId.equalsExp(users.id)), + ]) + ..where(reactions.messageId.equals(messageId)) + ..orderBy([OrderingTerm.asc(reactions.createdAt)])) + .map((rows) { + final userEntity = rows.readTable(users); + final reactionEntity = rows.readTable(reactions); + return reactionEntity.toReaction(user: userEntity?.toUser()); + }).get(); /// Returns all the reactions of a particular message /// added by a particular user by matching @@ -42,23 +41,21 @@ class ReactionDao extends DatabaseAccessor } /// Updates the reactions data with the new [reactionList] data - Future updateReactions(List reactionList) { - return batch((it) { - it.insertAll( - reactions, - reactionList.map((r) => r.toEntity()).toList(), - mode: InsertMode.insertOrReplace, - ); - }); - } + Future updateReactions(List reactionList) => batch((it) { + it.insertAll( + reactions, + reactionList.map((r) => r.toEntity()).toList(), + mode: InsertMode.insertOrReplace, + ); + }); - /// Deletes all the reactions whose [Reactions.messageId] is present in [messageIds] - Future deleteReactionsByMessageIds(List messageIds) { - return batch((it) { - it.deleteWhere( - reactions, - (r) => r.messageId.isIn(messageIds), - ); - }); - } + /// Deletes all the reactions whose [Reactions.messageId] is + /// present in [messageIds] + Future deleteReactionsByMessageIds(List messageIds) => + batch((it) { + it.deleteWhere( + reactions, + (r) => r.messageId.isIn(messageIds), + ); + }); } diff --git a/packages/stream_chat_persistence/lib/src/dao/read_dao.dart b/packages/stream_chat_persistence/lib/src/dao/read_dao.dart index c78cab07..95e23d8b 100644 --- a/packages/stream_chat_persistence/lib/src/dao/read_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/read_dao.dart @@ -3,7 +3,7 @@ import 'package:stream_chat/stream_chat.dart'; import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; import 'package:stream_chat_persistence/src/entity/reads.dart'; import 'package:stream_chat_persistence/src/entity/users.dart'; -import '../mapper/mapper.dart'; +import 'package:stream_chat_persistence/src/mapper/mapper.dart'; part 'read_dao.g.dart'; @@ -14,30 +14,26 @@ class ReadDao extends DatabaseAccessor with _$ReadDaoMixin { ReadDao(MoorChatDatabase db) : super(db); /// Get all reads where [Reads.channelCid] matches [cid] - Future> getReadsByCid(String cid) async { - return (select(reads).join([ - leftOuterJoin(users, reads.userId.equalsExp(users.id)), - ]) - ..where(reads.channelCid.equals(cid)) - ..orderBy([ - OrderingTerm.asc(reads.lastRead), - ])) - .map((row) { - final userEntity = row.readTable(users); - final readEntity = row.readTable(reads); - return readEntity.toRead(user: userEntity?.toUser()); - }).get(); - } + Future> getReadsByCid(String cid) async => (select(reads).join([ + leftOuterJoin(users, reads.userId.equalsExp(users.id)), + ]) + ..where(reads.channelCid.equals(cid)) + ..orderBy([ + OrderingTerm.asc(reads.lastRead), + ])) + .map((row) { + final userEntity = row.readTable(users); + final readEntity = row.readTable(reads); + return readEntity.toRead(user: userEntity?.toUser()); + }).get(); /// Updates the read data of a particular channel with /// the new [readList] data - Future updateReads(String cid, List readList) { - return batch( - (it) => it.insertAll( - reads, - readList.map((r) => r.toEntity(cid: cid)).toList(), - mode: InsertMode.insertOrReplace, - ), - ); - } + Future updateReads(String cid, List readList) => batch( + (it) => it.insertAll( + reads, + readList.map((r) => r.toEntity(cid: cid)).toList(), + mode: InsertMode.insertOrReplace, + ), + ); } diff --git a/packages/stream_chat_persistence/lib/src/dao/user_dao.dart b/packages/stream_chat_persistence/lib/src/dao/user_dao.dart index 795c7968..65ce1521 100644 --- a/packages/stream_chat_persistence/lib/src/dao/user_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/user_dao.dart @@ -2,7 +2,7 @@ import 'package:moor/moor.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/entity/users.dart'; -import '../mapper/user_mapper.dart'; +import 'package:stream_chat_persistence/src/mapper/user_mapper.dart'; part 'user_dao.g.dart'; @@ -13,13 +13,11 @@ class UserDao extends DatabaseAccessor with _$UserDaoMixin { UserDao(MoorChatDatabase db) : super(db); /// Updates the users data with the new [userList] data - Future updateUsers(List userList) { - return batch( - (it) => it.insertAll( - users, - userList.map((u) => u.toEntity()).toList(), - mode: InsertMode.insertOrReplace, - ), - ); - } + Future updateUsers(List userList) => batch( + (it) => it.insertAll( + users, + userList.map((u) => u.toEntity()).toList(), + mode: InsertMode.insertOrReplace, + ), + ); } 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 57348330..cc3e86b3 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 @@ -13,15 +13,12 @@ LazyDatabase _openConnection( String userId, { bool logStatements = false, bool persistOnDisk = true, -}) { - return LazyDatabase(() async { - return await SharedDB.constructDatabase( - userId, - logStatements: logStatements, - persistOnDisk: persistOnDisk, - ); - }); -} +}) => + LazyDatabase(() async => SharedDB.constructDatabase( + userId, + logStatements: logStatements, + persistOnDisk: persistOnDisk, + )); /// A chat database implemented using moor @UseMoor(tables: [ diff --git a/packages/stream_chat_persistence/lib/src/db/shared/native_db.dart b/packages/stream_chat_persistence/lib/src/db/shared/native_db.dart index 9580ae50..7592247e 100644 --- a/packages/stream_chat_persistence/lib/src/db/shared/native_db.dart +++ b/packages/stream_chat_persistence/lib/src/db/shared/native_db.dart @@ -9,7 +9,7 @@ import 'package:path_provider/path_provider.dart'; import 'package:stream_chat_persistence/src/stream_chat_persistence_client.dart'; import 'package:stream_chat_persistence/stream_chat_persistence.dart'; -import '../moor_chat_database.dart'; +import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; /// A Helper class to construct new instances of [MoorChatDatabase] specifically /// for native platform applications @@ -40,12 +40,10 @@ class SharedDB { } static void _startBackground(_IsolateStartRequest request) { - final executor = LazyDatabase(() async { - return VmDatabase( - File(request.targetPath), - logStatements: request.logStatements, - ); - }); + final executor = LazyDatabase(() async => VmDatabase( + File(request.targetPath), + logStatements: request.logStatements, + )); final moorIsolate = MoorIsolate.inCurrent( () => DatabaseConnection.fromExecutor(executor), ); @@ -69,7 +67,7 @@ class SharedDB { ), ); - return (await receivePort.first as MoorIsolate); + return await receivePort.first as MoorIsolate; } /// Returns a new instance of [MoorChatDatabase] using the factory constructor @@ -84,7 +82,7 @@ class SharedDB { return MoorChatDatabase.connect( userId, DatabaseConnection.delayed(Future(() async { - MoorIsolate isolate = await _createMoorIsolate( + final isolate = await _createMoorIsolate( dbName, logStatements: logStatements, ); @@ -95,13 +93,13 @@ class SharedDB { } class _IsolateStartRequest { - final SendPort sendMoorIsolate; - final String targetPath; - final bool logStatements; - const _IsolateStartRequest( this.sendMoorIsolate, this.targetPath, { this.logStatements = false, }); + + final SendPort sendMoorIsolate; + final String targetPath; + final bool logStatements; } diff --git a/packages/stream_chat_persistence/lib/src/db/shared/unsupported_db.dart b/packages/stream_chat_persistence/lib/src/db/shared/unsupported_db.dart index 811e5cc7..3a764d24 100644 --- a/packages/stream_chat_persistence/lib/src/db/shared/unsupported_db.dart +++ b/packages/stream_chat_persistence/lib/src/db/shared/unsupported_db.dart @@ -12,7 +12,8 @@ class SharedDB { bool logStatements = false, bool persistOnDisk = true, }) { - throw 'Unsupported Platform'; + throw UnsupportedError( + 'No implementation of the constructDatabase api provided'); } /// Return a new instance of moor chat database. @@ -22,6 +23,7 @@ class SharedDB { String userId, { bool logStatements = false, }) { - throw 'Unsupported Platform'; + throw UnsupportedError( + 'No implementation of the constructMoorChatDatabase api provided'); } } diff --git a/packages/stream_chat_persistence/lib/src/db/shared/web_db.dart b/packages/stream_chat_persistence/lib/src/db/shared/web_db.dart index f44a41ec..32b108ba 100644 --- a/packages/stream_chat_persistence/lib/src/db/shared/web_db.dart +++ b/packages/stream_chat_persistence/lib/src/db/shared/web_db.dart @@ -1,7 +1,7 @@ import 'package:moor/moor_web.dart'; import 'package:stream_chat_persistence/src/stream_chat_persistence_client.dart'; -import '../moor_chat_database.dart'; +import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; /// A Helper class to construct new instances of [MoorChatDatabase] specifically /// for Web applications diff --git a/packages/stream_chat_persistence/lib/src/entity/entity.dart b/packages/stream_chat_persistence/lib/src/entity/entity.dart index ca9d04cb..d5218768 100644 --- a/packages/stream_chat_persistence/lib/src/entity/entity.dart +++ b/packages/stream_chat_persistence/lib/src/entity/entity.dart @@ -1,9 +1,9 @@ +export 'channel_queries.dart'; export 'channels.dart'; +export 'connection_events.dart'; +export 'members.dart'; export 'messages.dart'; export 'pinned_messages.dart'; export 'reactions.dart'; -export 'users.dart'; -export 'members.dart'; export 'reads.dart'; -export 'channel_queries.dart'; -export 'connection_events.dart'; +export 'users.dart'; diff --git a/packages/stream_chat_persistence/lib/src/entity/pinned_messages.dart b/packages/stream_chat_persistence/lib/src/entity/pinned_messages.dart index f6956f54..de081552 100644 --- a/packages/stream_chat_persistence/lib/src/entity/pinned_messages.dart +++ b/packages/stream_chat_persistence/lib/src/entity/pinned_messages.dart @@ -1,6 +1,6 @@ import 'package:moor/moor.dart'; -import 'messages.dart'; +import 'package:stream_chat_persistence/src/entity/messages.dart'; /// Represents a [PinnedMessages] table in [MoorChatDatabase]. @DataClassName('PinnedMessageEntity') diff --git a/packages/stream_chat_persistence/lib/src/mapper/channel_mapper.dart b/packages/stream_chat_persistence/lib/src/mapper/channel_mapper.dart index 3e2520fb..5c8e3e2a 100644 --- a/packages/stream_chat_persistence/lib/src/mapper/channel_mapper.dart +++ b/packages/stream_chat_persistence/lib/src/mapper/channel_mapper.dart @@ -29,34 +29,31 @@ extension ChannelEntityX on ChannelEntity { List reads, List messages, List pinnedMessages, - }) { - return ChannelState( - members: members, - read: reads, - messages: messages, - pinnedMessages: pinnedMessages, - channel: toChannelModel(createdBy: createdBy), - ); - } + }) => + ChannelState( + members: members, + read: reads, + messages: messages, + pinnedMessages: pinnedMessages, + channel: toChannelModel(createdBy: createdBy), + ); } /// Useful mapping functions for [ChannelModel] extension ChannelModelX on ChannelModel { /// Maps a [ChannelModel] into [ChannelEntity] - ChannelEntity toEntity() { - return ChannelEntity( - id: id, - type: type, - cid: cid, - config: config.toJson(), - frozen: frozen, - lastMessageAt: lastMessageAt, - createdAt: createdAt, - updatedAt: updatedAt, - deletedAt: deletedAt, - memberCount: memberCount, - createdById: createdBy.id, - extraData: extraData, - ); - } + ChannelEntity toEntity() => ChannelEntity( + id: id, + type: type, + cid: cid, + config: config.toJson(), + frozen: frozen, + lastMessageAt: lastMessageAt, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + memberCount: memberCount, + createdById: createdBy.id, + extraData: extraData, + ); } diff --git a/packages/stream_chat_persistence/lib/src/mapper/event_mapper.dart b/packages/stream_chat_persistence/lib/src/mapper/event_mapper.dart index 7bc1739c..fc2a57ba 100644 --- a/packages/stream_chat_persistence/lib/src/mapper/event_mapper.dart +++ b/packages/stream_chat_persistence/lib/src/mapper/event_mapper.dart @@ -4,11 +4,9 @@ import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; /// Useful mapping functions for [ConnectionEventEntity] extension ConnectionEventX on ConnectionEventEntity { /// Maps a [ConnectionEventEntity] into [Event] - Event toEvent() { - return Event( - me: ownUser != null ? OwnUser.fromJson(ownUser) : null, - totalUnreadCount: totalUnreadCount, - unreadChannels: unreadChannels, - ); - } + Event toEvent() => Event( + me: ownUser != null ? OwnUser.fromJson(ownUser) : null, + totalUnreadCount: totalUnreadCount, + unreadChannels: unreadChannels, + ); } diff --git a/packages/stream_chat_persistence/lib/src/mapper/mapper.dart b/packages/stream_chat_persistence/lib/src/mapper/mapper.dart index cdc31e05..66bf3cda 100644 --- a/packages/stream_chat_persistence/lib/src/mapper/mapper.dart +++ b/packages/stream_chat_persistence/lib/src/mapper/mapper.dart @@ -1,8 +1,8 @@ -export 'user_mapper.dart'; -export 'reaction_mapper.dart'; export 'channel_mapper.dart'; export 'event_mapper.dart'; export 'member_mapper.dart'; -export 'read_mapper.dart'; export 'message_mapper.dart'; export 'pinned_message_mapper.dart'; +export 'reaction_mapper.dart'; +export 'read_mapper.dart'; +export 'user_mapper.dart'; diff --git a/packages/stream_chat_persistence/lib/src/mapper/member_mapper.dart b/packages/stream_chat_persistence/lib/src/mapper/member_mapper.dart index 2d32c9f1..cbdcc297 100644 --- a/packages/stream_chat_persistence/lib/src/mapper/member_mapper.dart +++ b/packages/stream_chat_persistence/lib/src/mapper/member_mapper.dart @@ -4,39 +4,35 @@ import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; /// Useful mapping functions for [MemberEntity] extension MemberEntityX on MemberEntity { /// Maps a [MemberEntity] into [Member] - Member toMember({User user}) { - return Member( - user: user, - userId: userId, - banned: banned, - shadowBanned: shadowBanned, - updatedAt: updatedAt, - createdAt: createdAt, - role: role, - inviteAcceptedAt: inviteAcceptedAt, - invited: invited, - inviteRejectedAt: inviteRejectedAt, - isModerator: isModerator, - ); - } + Member toMember({User user}) => Member( + user: user, + userId: userId, + banned: banned, + shadowBanned: shadowBanned, + updatedAt: updatedAt, + createdAt: createdAt, + role: role, + inviteAcceptedAt: inviteAcceptedAt, + invited: invited, + inviteRejectedAt: inviteRejectedAt, + isModerator: isModerator, + ); } /// Useful mapping functions for [Member] extension MemberX on Member { /// Maps a [Member] into [MemberEntity] - MemberEntity toEntity({String cid}) { - return MemberEntity( - userId: user?.id, - banned: banned, - shadowBanned: shadowBanned, - channelCid: cid, - createdAt: createdAt, - isModerator: isModerator, - inviteRejectedAt: inviteRejectedAt, - invited: invited, - inviteAcceptedAt: inviteAcceptedAt, - role: role, - updatedAt: updatedAt, - ); - } + MemberEntity toEntity({String cid}) => MemberEntity( + userId: user?.id, + banned: banned, + shadowBanned: shadowBanned, + channelCid: cid, + createdAt: createdAt, + isModerator: isModerator, + inviteRejectedAt: inviteRejectedAt, + invited: invited, + inviteAcceptedAt: inviteAcceptedAt, + role: role, + updatedAt: updatedAt, + ); } diff --git a/packages/stream_chat_persistence/lib/src/mapper/message_mapper.dart b/packages/stream_chat_persistence/lib/src/mapper/message_mapper.dart index 5acf1a84..fdf93cc5 100644 --- a/packages/stream_chat_persistence/lib/src/mapper/message_mapper.dart +++ b/packages/stream_chat_persistence/lib/src/mapper/message_mapper.dart @@ -12,70 +12,66 @@ extension MessageEntityX on MessageEntity { List latestReactions, List ownReactions, Message quotedMessage, - }) { - return Message( - shadowed: shadowed, - latestReactions: latestReactions, - ownReactions: ownReactions, - attachments: attachments?.map((it) { - final json = jsonDecode(it); - return Attachment.fromData(json); - })?.toList(), - createdAt: createdAt, - extraData: extraData, - updatedAt: updatedAt, - id: id, - type: type, - status: status, - command: command, - parentId: parentId, - quotedMessageId: quotedMessageId, - quotedMessage: quotedMessage, - reactionCounts: reactionCounts, - reactionScores: reactionScores, - replyCount: replyCount, - showInChannel: showInChannel, - text: messageText, - user: user, - deletedAt: deletedAt, - pinned: pinned, - pinnedAt: pinnedAt, - pinExpires: pinExpires, - pinnedBy: pinnedBy, - ); - } + }) => + Message( + shadowed: shadowed, + latestReactions: latestReactions, + ownReactions: ownReactions, + attachments: attachments?.map((it) { + final json = jsonDecode(it); + return Attachment.fromData(json); + })?.toList(), + createdAt: createdAt, + extraData: extraData, + updatedAt: updatedAt, + id: id, + type: type, + status: status, + command: command, + parentId: parentId, + quotedMessageId: quotedMessageId, + quotedMessage: quotedMessage, + reactionCounts: reactionCounts, + reactionScores: reactionScores, + replyCount: replyCount, + showInChannel: showInChannel, + text: messageText, + user: user, + deletedAt: deletedAt, + pinned: pinned, + pinnedAt: pinnedAt, + pinExpires: pinExpires, + pinnedBy: pinnedBy, + ); } /// Useful mapping functions for [Message] extension MessageX on Message { /// Maps a [Message] into [MessageEntity] - MessageEntity toEntity({String cid}) { - return MessageEntity( - id: id, - attachments: attachments?.map((it) { - return jsonEncode(it.toData()); - })?.toList(), - channelCid: cid, - type: type, - parentId: parentId, - quotedMessageId: quotedMessageId, - command: command, - createdAt: createdAt, - shadowed: shadowed, - showInChannel: showInChannel, - replyCount: replyCount, - reactionScores: reactionScores, - reactionCounts: reactionCounts, - status: status, - updatedAt: updatedAt, - extraData: extraData, - userId: user?.id, - deletedAt: deletedAt, - messageText: text, - pinned: pinned, - pinnedAt: pinnedAt, - pinExpires: pinExpires, - pinnedByUserId: pinnedBy?.id, - ); - } + MessageEntity toEntity({String cid}) => MessageEntity( + id: id, + attachments: + attachments?.map((it) => jsonEncode(it.toData()))?.toList(), + channelCid: cid, + type: type, + parentId: parentId, + quotedMessageId: quotedMessageId, + command: command, + createdAt: createdAt, + shadowed: shadowed, + showInChannel: showInChannel, + replyCount: replyCount, + reactionScores: reactionScores, + reactionCounts: reactionCounts, + status: status, + updatedAt: updatedAt, + extraData: extraData, + userId: user?.id, + deletedAt: deletedAt, + messageText: text, + pinned: pinned, + pinnedAt: pinnedAt, + pinExpires: pinExpires, + pinnedByUserId: pinnedBy?.id, + ); } diff --git a/packages/stream_chat_persistence/lib/src/mapper/pinned_message_mapper.dart b/packages/stream_chat_persistence/lib/src/mapper/pinned_message_mapper.dart index 1abe896f..ec2a0e91 100644 --- a/packages/stream_chat_persistence/lib/src/mapper/pinned_message_mapper.dart +++ b/packages/stream_chat_persistence/lib/src/mapper/pinned_message_mapper.dart @@ -12,70 +12,66 @@ extension PinnedMessageEntityX on PinnedMessageEntity { List latestReactions, List ownReactions, Message quotedMessage, - }) { - return Message( - shadowed: shadowed, - latestReactions: latestReactions, - ownReactions: ownReactions, - attachments: attachments?.map((it) { - final json = jsonDecode(it); - return Attachment.fromData(json); - })?.toList(), - createdAt: createdAt, - extraData: extraData, - updatedAt: updatedAt, - id: id, - type: type, - status: status, - command: command, - parentId: parentId, - quotedMessageId: quotedMessageId, - quotedMessage: quotedMessage, - reactionCounts: reactionCounts, - reactionScores: reactionScores, - replyCount: replyCount, - showInChannel: showInChannel, - text: messageText, - user: user, - deletedAt: deletedAt, - pinned: pinned, - pinnedAt: pinnedAt, - pinExpires: pinExpires, - pinnedBy: pinnedBy, - ); - } + }) => + Message( + shadowed: shadowed, + latestReactions: latestReactions, + ownReactions: ownReactions, + attachments: attachments?.map((it) { + final json = jsonDecode(it); + return Attachment.fromData(json); + })?.toList(), + createdAt: createdAt, + extraData: extraData, + updatedAt: updatedAt, + id: id, + type: type, + status: status, + command: command, + parentId: parentId, + quotedMessageId: quotedMessageId, + quotedMessage: quotedMessage, + reactionCounts: reactionCounts, + reactionScores: reactionScores, + replyCount: replyCount, + showInChannel: showInChannel, + text: messageText, + user: user, + deletedAt: deletedAt, + pinned: pinned, + pinnedAt: pinnedAt, + pinExpires: pinExpires, + pinnedBy: pinnedBy, + ); } /// Useful mapping functions for [Message] extension PMessageX on Message { /// Maps a [Message] into [PinnedMessageEntity] - PinnedMessageEntity toPinnedEntity({String cid}) { - return PinnedMessageEntity( - id: id, - attachments: attachments?.map((it) { - return jsonEncode(it.toData()); - })?.toList(), - channelCid: cid, - type: type, - parentId: parentId, - quotedMessageId: quotedMessageId, - command: command, - createdAt: createdAt, - shadowed: shadowed, - showInChannel: showInChannel, - replyCount: replyCount, - reactionScores: reactionScores, - reactionCounts: reactionCounts, - status: status, - updatedAt: updatedAt, - extraData: extraData, - userId: user?.id, - deletedAt: deletedAt, - messageText: text, - pinned: pinned, - pinnedAt: pinnedAt, - pinExpires: pinExpires, - pinnedByUserId: pinnedBy?.id, - ); - } + PinnedMessageEntity toPinnedEntity({String cid}) => PinnedMessageEntity( + id: id, + attachments: + attachments?.map((it) => jsonEncode(it.toData()))?.toList(), + channelCid: cid, + type: type, + parentId: parentId, + quotedMessageId: quotedMessageId, + command: command, + createdAt: createdAt, + shadowed: shadowed, + showInChannel: showInChannel, + replyCount: replyCount, + reactionScores: reactionScores, + reactionCounts: reactionCounts, + status: status, + updatedAt: updatedAt, + extraData: extraData, + userId: user?.id, + deletedAt: deletedAt, + messageText: text, + pinned: pinned, + pinnedAt: pinnedAt, + pinExpires: pinExpires, + pinnedByUserId: pinnedBy?.id, + ); } diff --git a/packages/stream_chat_persistence/lib/src/mapper/reaction_mapper.dart b/packages/stream_chat_persistence/lib/src/mapper/reaction_mapper.dart index d265fcb7..20842307 100644 --- a/packages/stream_chat_persistence/lib/src/mapper/reaction_mapper.dart +++ b/packages/stream_chat_persistence/lib/src/mapper/reaction_mapper.dart @@ -4,30 +4,26 @@ import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; /// Useful mapping functions for [ReactionEntity] extension ReactionEntityX on ReactionEntity { /// Maps a [ReactionEntity] into [Reaction] - Reaction toReaction({User user}) { - return Reaction( - extraData: extraData, - type: type, - createdAt: createdAt, - userId: userId, - user: user, - messageId: messageId, - score: score, - ); - } + Reaction toReaction({User user}) => Reaction( + extraData: extraData, + type: type, + createdAt: createdAt, + userId: userId, + user: user, + messageId: messageId, + score: score, + ); } /// Useful mapping functions for [Reaction] extension ReactionX on Reaction { /// Maps a [Reaction] into [ReactionEntity] - ReactionEntity toEntity() { - return ReactionEntity( - extraData: extraData, - type: type, - createdAt: createdAt, - userId: userId, - messageId: messageId, - score: score, - ); - } + ReactionEntity toEntity() => ReactionEntity( + extraData: extraData, + type: type, + createdAt: createdAt, + userId: userId, + messageId: messageId, + score: score, + ); } diff --git a/packages/stream_chat_persistence/lib/src/mapper/read_mapper.dart b/packages/stream_chat_persistence/lib/src/mapper/read_mapper.dart index c79cf8d5..9664030e 100644 --- a/packages/stream_chat_persistence/lib/src/mapper/read_mapper.dart +++ b/packages/stream_chat_persistence/lib/src/mapper/read_mapper.dart @@ -4,24 +4,20 @@ import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; /// Useful mapping functions for [ReadEntity] extension ReadEntityX on ReadEntity { /// Maps a [ReadEntity] into [Read] - Read toRead({User user}) { - return Read( - user: user, - lastRead: lastRead, - unreadMessages: unreadMessages, - ); - } + Read toRead({User user}) => Read( + user: user, + lastRead: lastRead, + unreadMessages: unreadMessages, + ); } /// Useful mapping functions for [Read] extension ReadX on Read { /// Maps a [Read] into [ReadEntity] - ReadEntity toEntity({String cid}) { - return ReadEntity( - lastRead: lastRead, - userId: user?.id, - channelCid: cid, - unreadMessages: unreadMessages, - ); - } + ReadEntity toEntity({String cid}) => ReadEntity( + lastRead: lastRead, + userId: user?.id, + channelCid: cid, + unreadMessages: unreadMessages, + ); } diff --git a/packages/stream_chat_persistence/lib/src/mapper/user_mapper.dart b/packages/stream_chat_persistence/lib/src/mapper/user_mapper.dart index b1e53786..533a45b1 100644 --- a/packages/stream_chat_persistence/lib/src/mapper/user_mapper.dart +++ b/packages/stream_chat_persistence/lib/src/mapper/user_mapper.dart @@ -4,33 +4,29 @@ import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; /// Useful mapping functions for [UserEntity] extension UserEntityX on UserEntity { /// Maps a [UserEntity] into [User] - User toUser() { - return User( - id: id, - updatedAt: updatedAt, - role: role, - online: online, - lastActive: lastActive, - extraData: extraData, - banned: banned, - createdAt: createdAt, - ); - } + User toUser() => User( + id: id, + updatedAt: updatedAt, + role: role, + online: online, + lastActive: lastActive, + extraData: extraData, + banned: banned, + createdAt: createdAt, + ); } /// Useful mapping functions for [User] extension UserX on User { /// Maps a [User] into [UserEntity] - UserEntity toEntity() { - return UserEntity( - id: id, - role: role, - createdAt: createdAt, - updatedAt: updatedAt, - lastActive: lastActive, - online: online, - banned: banned, - extraData: extraData, - ); - } + UserEntity toEntity() => UserEntity( + id: id, + role: role, + createdAt: createdAt, + updatedAt: updatedAt, + lastActive: lastActive, + online: online, + banned: banned, + extraData: extraData, + ); } diff --git a/packages/stream_chat_persistence/lib/src/stream_chat_persistence_client.dart b/packages/stream_chat_persistence/lib/src/stream_chat_persistence_client.dart index 832eabbd..e7ee060b 100644 --- a/packages/stream_chat_persistence/lib/src/stream_chat_persistence_client.dart +++ b/packages/stream_chat_persistence/lib/src/stream_chat_persistence_client.dart @@ -3,8 +3,8 @@ import 'package:meta/meta.dart'; import 'package:mutex/mutex.dart'; import 'package:stream_chat/stream_chat.dart'; -import 'db/moor_chat_database.dart'; -import 'db/shared/shared_db.dart'; +import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; +import 'package:stream_chat_persistence/src/db/shared/shared_db.dart'; /// Various connection modes on which [StreamChatPersistenceClient] can work enum ConnectionMode { @@ -15,7 +15,7 @@ enum ConnectionMode { background, } -final levelEmojiMapper = { +final _levelEmojiMapper = { Level.INFO: 'â„šī¸', Level.WARNING: 'âš ī¸', Level.SEVERE: '🚨', @@ -29,8 +29,8 @@ class StreamChatPersistenceClient extends ChatPersistenceClient { ConnectionMode connectionMode = ConnectionMode.regular, Level logLevel = Level.WARNING, LogHandlerFunction logHandlerFunction, - }) : assert(connectionMode != null), - assert(logLevel != null), + }) : assert(connectionMode != null, 'ConnectionMode cannot be null'), + assert(logLevel != null, 'LogLevel cannot be null'), _connectionMode = connectionMode, _logger = Logger.detached('đŸ’Ŋ')..level = logLevel { _logger.onRecord.listen(logHandlerFunction ?? _defaultLogHandler); @@ -56,8 +56,10 @@ class StreamChatPersistenceClient extends ChatPersistenceClient { ///``` LogHandlerFunction logHandlerFunction; + /// [MoorChatDatabase] instance used by this client. @visibleForTesting MoorChatDatabase db; + final Logger _logger; final ConnectionMode _connectionMode; final _mutex = ReadWriteMutex(); @@ -65,13 +67,13 @@ class StreamChatPersistenceClient extends ChatPersistenceClient { void _defaultLogHandler(LogRecord record) { print( '(${record.time}) ' - '${levelEmojiMapper[record.level] ?? record.level.name} ' + '${_levelEmojiMapper[record.level] ?? record.level.name} ' '${record.loggerName} ${record.message}', ); if (record.stackTrace != null) print(record.stackTrace); } - Future readProtected(Future Function() f) async { + Future _readProtected(Future Function() f) async { T ret; await _mutex.protectRead(() async { if (db == null) { @@ -103,299 +105,256 @@ class StreamChatPersistenceClient extends ChatPersistenceClient { } @override - Future getConnectionInfo() { - return readProtected(() { - _logger.info('getConnectionInfo'); - return db.connectionEventDao.connectionEvent; - }); - } + Future getConnectionInfo() => _readProtected(() { + _logger.info('getConnectionInfo'); + return db.connectionEventDao.connectionEvent; + }); @override - Future updateConnectionInfo(Event event) { - return readProtected(() { - _logger.info('updateConnectionInfo'); - return db.connectionEventDao.updateConnectionEvent(event); - }); - } + Future updateConnectionInfo(Event event) => _readProtected(() { + _logger.info('updateConnectionInfo'); + return db.connectionEventDao.updateConnectionEvent(event); + }); @override - Future updateLastSyncAt(DateTime lastSyncAt) { - return readProtected(() { - _logger.info('updateLastSyncAt'); - return db.connectionEventDao.updateLastSyncAt(lastSyncAt); - }); - } + Future updateLastSyncAt(DateTime lastSyncAt) => _readProtected(() { + _logger.info('updateLastSyncAt'); + return db.connectionEventDao.updateLastSyncAt(lastSyncAt); + }); @override - Future getLastSyncAt() { - return readProtected(() { - _logger.info('getLastSyncAt'); - return db.connectionEventDao.lastSyncAt; - }); - } + Future getLastSyncAt() => _readProtected(() { + _logger.info('getLastSyncAt'); + return db.connectionEventDao.lastSyncAt; + }); @override - Future deleteChannels(List cids) { - return readProtected(() { - _logger.info('deleteChannels'); - return db.channelDao.deleteChannelByCids(cids); - }); - } + Future deleteChannels(List cids) => _readProtected(() { + _logger.info('deleteChannels'); + return db.channelDao.deleteChannelByCids(cids); + }); @override - Future> getChannelCids() { - return readProtected(() { - _logger.info('getChannelCids'); - return db.channelDao.cids; - }); - } + Future> getChannelCids() => _readProtected(() { + _logger.info('getChannelCids'); + return db.channelDao.cids; + }); @override - Future deleteMessageByIds(List messageIds) { - return readProtected(() { - _logger.info('deleteMessageByIds'); - return db.messageDao.deleteMessageByIds(messageIds); - }); - } + Future deleteMessageByIds(List messageIds) => + _readProtected(() { + _logger.info('deleteMessageByIds'); + return db.messageDao.deleteMessageByIds(messageIds); + }); @override - Future deletePinnedMessageByIds(List messageIds) { - return readProtected(() { - _logger.info('deletePinnedMessageByIds'); - return db.pinnedMessageDao.deleteMessageByIds(messageIds); - }); - } + Future deletePinnedMessageByIds(List messageIds) => + _readProtected(() { + _logger.info('deletePinnedMessageByIds'); + return db.pinnedMessageDao.deleteMessageByIds(messageIds); + }); @override - Future deleteMessageByCids(List cids) { - return readProtected(() { - _logger.info('deleteMessageByCids'); - return db.messageDao.deleteMessageByCids(cids); - }); - } + Future deleteMessageByCids(List cids) => _readProtected(() { + _logger.info('deleteMessageByCids'); + return db.messageDao.deleteMessageByCids(cids); + }); @override - Future deletePinnedMessageByCids(List cids) { - return readProtected(() { - _logger.info('deletePinnedMessageByCids'); - return db.pinnedMessageDao.deleteMessageByCids(cids); - }); - } + Future deletePinnedMessageByCids(List cids) => + _readProtected(() { + _logger.info('deletePinnedMessageByCids'); + return db.pinnedMessageDao.deleteMessageByCids(cids); + }); @override - Future> getMembersByCid(String cid) { - return readProtected(() { - _logger.info('getMembersByCid'); - return db.memberDao.getMembersByCid(cid); - }); - } + Future> getMembersByCid(String cid) => _readProtected(() { + _logger.info('getMembersByCid'); + return db.memberDao.getMembersByCid(cid); + }); @override - Future getChannelByCid(String cid) { - return readProtected(() { - _logger.info('getChannelByCid'); - return db.channelDao.getChannelByCid(cid); - }); - } + Future getChannelByCid(String cid) => _readProtected(() { + _logger.info('getChannelByCid'); + return db.channelDao.getChannelByCid(cid); + }); @override Future> getMessagesByCid( String cid, { PaginationParams messagePagination, - }) { - return readProtected(() { - _logger.info('getMessagesByCid'); - return db.messageDao.getMessagesByCid( - cid, - messagePagination: messagePagination, - ); - }); - } + }) => + _readProtected(() { + _logger.info('getMessagesByCid'); + return db.messageDao.getMessagesByCid( + cid, + messagePagination: messagePagination, + ); + }); @override Future> getPinnedMessagesByCid( String cid, { PaginationParams messagePagination, - }) { - return readProtected(() { - _logger.info('getPinnedMessagesByCid'); - return db.pinnedMessageDao.getMessagesByCid( - cid, - messagePagination: messagePagination, - ); - }); - } + }) => + _readProtected(() { + _logger.info('getPinnedMessagesByCid'); + return db.pinnedMessageDao.getMessagesByCid( + cid, + messagePagination: messagePagination, + ); + }); @override - Future> getReadsByCid(String cid) { - return readProtected(() { - _logger.info('getReadsByCid'); - return db.readDao.getReadsByCid(cid); - }); - } + Future> getReadsByCid(String cid) => _readProtected(() { + _logger.info('getReadsByCid'); + return db.readDao.getReadsByCid(cid); + }); @override - Future>> getChannelThreads(String cid) async { - return readProtected(() async { - _logger.info('getChannelThreads'); - final messages = await db.messageDao.getThreadMessages(cid); - final messageByParentIdDictionary = >{}; - for (final message in messages) { - final parentId = message.parentId; - messageByParentIdDictionary[parentId] = [ - ...messageByParentIdDictionary[parentId] ?? [], - message - ]; - } - return messageByParentIdDictionary; - }); - } + Future>> getChannelThreads(String cid) async => + _readProtected(() async { + _logger.info('getChannelThreads'); + final messages = await db.messageDao.getThreadMessages(cid); + final messageByParentIdDictionary = >{}; + for (final message in messages) { + final parentId = message.parentId; + messageByParentIdDictionary[parentId] = [ + ...messageByParentIdDictionary[parentId] ?? [], + message + ]; + } + return messageByParentIdDictionary; + }); @override Future> getReplies( String parentId, { PaginationParams options, - }) { - return readProtected(() async { - _logger.info('getReplies'); - return db.messageDao.getThreadMessagesByParentId( - parentId, - options: options, - ); - }); - } + }) => + _readProtected(() async { + _logger.info('getReplies'); + return db.messageDao.getThreadMessagesByParentId( + parentId, + options: options, + ); + }); @override Future> getChannelStates({ Map filter, List> sort = const [], PaginationParams paginationParams, - }) async { - return readProtected(() async { - _logger.info('getChannelStates'); - final channels = await db.channelQueryDao.getChannels( - filter: filter, - sort: sort, - paginationParams: paginationParams, - ); - return Future.wait(channels.map((e) => getChannelStateByCid(e.cid))); - }); - } + }) async => + _readProtected(() async { + _logger.info('getChannelStates'); + final channels = await db.channelQueryDao.getChannels( + filter: filter, + sort: sort, + paginationParams: paginationParams, + ); + return Future.wait(channels.map((e) => getChannelStateByCid(e.cid))); + }); @override Future updateChannelQueries( Map filter, List cids, bool clearQueryCache, - ) { - return readProtected(() async { - _logger.info('updateChannelQueries'); - return db.channelQueryDao.updateChannelQueries( - filter, - cids, - clearQueryCache, - ); - }); - } - - @override - Future updateChannels(List channels) { - return readProtected(() async { - _logger.info('updateChannels'); - return db.channelDao.updateChannels(channels); - }); - } - - @override - Future updateMembers(String cid, List members) { - return readProtected(() async { - _logger.info('updateMembers'); - return db.memberDao.updateMembers(cid, members); - }); - } - - @override - Future updateMessages(String cid, List messages) { - return readProtected(() async { - _logger.info('updateMessages'); - return db.messageDao.updateMessages(cid, messages); - }); - } - - @override - Future updatePinnedMessages(String cid, List messages) { - return readProtected(() async { - _logger.info('updatePinnedMessages'); - return db.pinnedMessageDao.updateMessages(cid, messages); - }); - } - - @override - Future updateReactions(List reactions) { - return readProtected(() async { - _logger.info('updateReactions'); - return db.reactionDao.updateReactions(reactions); - }); - } - - @override - Future updateReads(String cid, List reads) { - return readProtected(() async { - _logger.info('updateReads'); - return db.readDao.updateReads(cid, reads); - }); - } - - @override - Future updateUsers(List users) { - return readProtected(() async { - _logger.info('updateUsers'); - return db.userDao.updateUsers(users); - }); - } - - @override - Future deleteReactionsByMessageId(List messageIds) { - return readProtected(() async { - _logger.info('deleteReactionsByMessageId'); - return db.reactionDao.deleteReactionsByMessageIds(messageIds); - }); - } - - @override - Future deleteMembersByCids(List cids) { - return readProtected(() async { - _logger.info('deleteMembersByCids'); - return db.memberDao.deleteMemberByCids(cids); - }); - } - - @override - Future updateChannelStates(List channelStates) { - return readProtected(() async { - return db.transaction(() async { - await super.updateChannelStates(channelStates); + ) => + _readProtected(() async { + _logger.info('updateChannelQueries'); + return db.channelQueryDao.updateChannelQueries( + filter, + cids, + clearQueryCache: clearQueryCache, + ); }); - }); - } @override - Future disconnect({bool flush = false}) async { - return _mutex.protectWrite(() async { - _logger.info('disconnect'); - if (db != null) { - _logger.info('Disconnecting'); - if (flush) { - _logger.info('Flushing'); - await db.batch((batch) { - db.allTables.forEach((table) { - db.delete(table).go(); + Future updateChannels(List channels) => + _readProtected(() async { + _logger.info('updateChannels'); + return db.channelDao.updateChannels(channels); + }); + + @override + Future updateMembers(String cid, List members) => + _readProtected(() async { + _logger.info('updateMembers'); + return db.memberDao.updateMembers(cid, members); + }); + + @override + Future updateMessages(String cid, List messages) => + _readProtected(() async { + _logger.info('updateMessages'); + return db.messageDao.updateMessages(cid, messages); + }); + + @override + Future updatePinnedMessages(String cid, List messages) => + _readProtected(() async { + _logger.info('updatePinnedMessages'); + return db.pinnedMessageDao.updateMessages(cid, messages); + }); + + @override + Future updateReactions(List reactions) => + _readProtected(() async { + _logger.info('updateReactions'); + return db.reactionDao.updateReactions(reactions); + }); + + @override + Future updateReads(String cid, List reads) => + _readProtected(() async { + _logger.info('updateReads'); + return db.readDao.updateReads(cid, reads); + }); + + @override + Future updateUsers(List users) => _readProtected(() async { + _logger.info('updateUsers'); + return db.userDao.updateUsers(users); + }); + + @override + Future deleteReactionsByMessageId(List messageIds) => + _readProtected(() async { + _logger.info('deleteReactionsByMessageId'); + return db.reactionDao.deleteReactionsByMessageIds(messageIds); + }); + + @override + Future deleteMembersByCids(List cids) => + _readProtected(() async { + _logger.info('deleteMembersByCids'); + return db.memberDao.deleteMemberByCids(cids); + }); + + @override + Future updateChannelStates(List channelStates) => + _readProtected(() async => db.transaction(() async { + await super.updateChannelStates(channelStates); + })); + + @override + Future disconnect({bool flush = false}) async => + _mutex.protectWrite(() async { + _logger.info('disconnect'); + if (db != null) { + _logger.info('Disconnecting'); + if (flush) { + _logger.info('Flushing'); + await db.batch((batch) { + db.allTables.forEach((table) { + db.delete(table).go(); + }); }); - }); + } + await db.disconnect(); + db = null; } - await db.disconnect(); - db = null; - } - }); - } + }); } diff --git a/packages/stream_chat_persistence/pubspec.yaml b/packages/stream_chat_persistence/pubspec.yaml index 06f991e1..a91ac666 100644 --- a/packages/stream_chat_persistence/pubspec.yaml +++ b/packages/stream_chat_persistence/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: path_provider: ^1.6.27 sqlite3_flutter_libs: ^0.4.0+1 stream_chat: - git: + git: url: https://github.com/GetStream/stream-chat-flutter.git ref: develop path: packages/stream_chat From ff415442a065d02a3a458b8ca690f8a2be02a457 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Mon, 15 Mar 2021 10:47:49 +0100 Subject: [PATCH 02/24] fix swipeable visible on navigation back --- .../lib/src/message_list_view.dart | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 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 1abff664..6c5199b5 100644 --- a/packages/stream_chat_flutter/lib/src/message_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/message_list_view.dart @@ -1021,15 +1021,19 @@ class _MessageListViewState extends State { !message.isSystem && !message.isEphemeral && widget.onMessageSwiped != null) { - child = Swipeable( - onSwipeEnd: () { - FocusScope.of(context).unfocus(); - widget.onMessageSwiped(message); - }, - backgroundIcon: StreamSvgIcon.reply( - color: StreamChatTheme.of(context).colorTheme.accentBlue, + child = Container( + decoration: BoxDecoration(), + clipBehavior: Clip.hardEdge, + child: Swipeable( + onSwipeEnd: () { + FocusScope.of(context).unfocus(); + widget.onMessageSwiped(message); + }, + backgroundIcon: StreamSvgIcon.reply( + color: StreamChatTheme.of(context).colorTheme.accentBlue, + ), + child: child, ), - child: Container(child: child), ); } From 9f002f32b301ff3c21fcb976e93275170903bcb9 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Mon, 15 Mar 2021 12:25:20 +0100 Subject: [PATCH 03/24] fix video upload --- packages/stream_chat_flutter/lib/src/message_input.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/stream_chat_flutter/lib/src/message_input.dart b/packages/stream_chat_flutter/lib/src/message_input.dart index 21dda0f4..c4888be2 100644 --- a/packages/stream_chat_flutter/lib/src/message_input.dart +++ b/packages/stream_chat_flutter/lib/src/message_input.dart @@ -1904,11 +1904,11 @@ class MessageInputState extends State { if (file == null) return; - final mimeType = file.name?.mimeType; + final mimeType = file.name?.mimeType ?? file.path.split('/').last.mimeType; final extraDataMap = {}; - if (mimeType.type == 'video' || mimeType.type == 'image') { + if (mimeType?.type == 'video' || mimeType?.type == 'image') { attachmentType = mimeType.type; } else { attachmentType = 'file'; From f60f43af49263302aa8948c6fd66aad5190df61b Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Mon, 15 Mar 2021 14:40:36 +0100 Subject: [PATCH 04/24] fix: add more actions locations, merge actions and add showCommandsButton option (#333) * add more actions locations and merge actions * remove print * fix command chip * fix ui * rotate icon --- .../lib/src/message_input.dart | 217 +++++++++++------- 1 file changed, 139 insertions(+), 78 deletions(-) diff --git a/packages/stream_chat_flutter/lib/src/message_input.dart b/packages/stream_chat_flutter/lib/src/message_input.dart index c4888be2..d43e774c 100644 --- a/packages/stream_chat_flutter/lib/src/message_input.dart +++ b/packages/stream_chat_flutter/lib/src/message_input.dart @@ -12,12 +12,12 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:image_picker/image_picker.dart'; import 'package:photo_manager/photo_manager.dart'; import 'package:shimmer/shimmer.dart'; -import 'package:stream_chat_flutter/src/video_service.dart'; import 'package:stream_chat_flutter/src/media_list_view.dart'; import 'package:stream_chat_flutter/src/message_list_view.dart'; import 'package:stream_chat_flutter/src/stream_chat_theme.dart'; import 'package:stream_chat_flutter/src/stream_svg_icon.dart'; import 'package:stream_chat_flutter/src/user_avatar.dart'; +import 'package:stream_chat_flutter/src/video_service.dart'; import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart'; import 'package:substring_highlight/substring_highlight.dart'; @@ -35,6 +35,8 @@ typedef AttachmentThumbnailBuilder = Widget Function( enum ActionsLocation { left, right, + leftInside, + rightInside, } enum DefaultAttachmentTypes { @@ -122,6 +124,7 @@ class MessageInput extends StatefulWidget { this.hideSendAsDm = false, this.idleSendButton, this.activeSendButton, + this.showCommandsButton = true, }) : super(key: key); /// Message to edit @@ -149,6 +152,9 @@ class MessageInput extends StatefulWidget { /// If true the attachments button will not be displayed final bool disableAttachments; + /// Use this property to hide/show the commands button + final bool showCommandsButton; + /// Hide send as dm checkbox final bool hideSendAsDm; @@ -336,12 +342,11 @@ class MessageInputState extends State { direction: Axis.horizontal, crossAxisAlignment: CrossAxisAlignment.center, children: [ - if (!_commandEnabled) _buildExpandActionsButton(), - if (widget.actionsLocation == ActionsLocation.left) - ...widget.actions ?? [], + if (!_commandEnabled && widget.actionsLocation == ActionsLocation.left) + _buildExpandActionsButton(), _buildTextInput(context), - if (widget.actionsLocation == ActionsLocation.right) - ...widget.actions ?? [], + if (!_commandEnabled && widget.actionsLocation == ActionsLocation.right) + _buildExpandActionsButton(), if (widget.sendButtonLocation == SendButtonLocation.outside) _animateSendButton(context), ], @@ -421,18 +426,15 @@ class MessageInputState extends State { child: widget.activeSendButton, ) : _buildSendButton(context); - return Padding( - padding: const EdgeInsets.all(8.0), - child: AnimatedCrossFade( - crossFadeState: (_messageIsPresent || _attachments.isNotEmpty) - ? CrossFadeState.showFirst - : CrossFadeState.showSecond, - firstChild: sendButton, - secondChild: widget.idleSendButton ?? _buildIdleSendButton(context), - duration: - StreamChatTheme.of(context).messageInputTheme.sendAnimationDuration, - alignment: Alignment.center, - ), + return AnimatedCrossFade( + crossFadeState: (_messageIsPresent || _attachments.isNotEmpty) + ? CrossFadeState.showFirst + : CrossFadeState.showSecond, + firstChild: sendButton, + secondChild: widget.idleSendButton ?? _buildIdleSendButton(context), + duration: + StreamChatTheme.of(context).messageInputTheme.sendAnimationDuration, + alignment: Alignment.center, ); } @@ -445,8 +447,15 @@ class MessageInputState extends State { : CrossFadeState.showSecond, firstChild: IconButton( onPressed: () => setState(() => _actionsShrunk = false), - icon: StreamSvgIcon.emptyCircleLeft( - color: StreamChatTheme.of(context).colorTheme.accentBlue, + icon: Transform.rotate( + alignment: Alignment.center, + angle: (widget.actionsLocation == ActionsLocation.right || + widget.actionsLocation == ActionsLocation.rightInside) + ? pi + : 0, + child: StreamSvgIcon.emptyCircleLeft( + color: StreamChatTheme.of(context).colorTheme.accentBlue, + ), ), padding: const EdgeInsets.all(0), constraints: BoxConstraints.tightFor( @@ -457,10 +466,12 @@ class MessageInputState extends State { ), secondChild: FittedBox( child: Row( + crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ + children: [ if (!widget.disableAttachments) _buildAttachmentButton(), - if (widget.editMessage == null && + if (widget.showCommandsButton && + widget.editMessage == null && StreamChannel.of(context) .channel ?.config @@ -468,6 +479,7 @@ class MessageInputState extends State { ?.isNotEmpty == true) _buildCommandButton(), + ...widget.actions ?? [], ].insertBetween(const SizedBox(width: 8)), ), ), @@ -565,51 +577,75 @@ class MessageInputState extends State { ), ), contentPadding: const EdgeInsets.fromLTRB(16, 12, 13, 11), - prefixIconConstraints: BoxConstraints.tight(Size(78, 24)), - suffixIconConstraints: BoxConstraints.tight(Size(40, 40)), prefixIcon: _commandEnabled - ? Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - color: theme.colorTheme.accentBlue, - ), - margin: const EdgeInsets.only(right: 4, left: 8), - alignment: Alignment.center, - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - StreamSvgIcon.lightning( - color: Colors.white, - size: 16.0, - ), - Text( - _chosenCommand?.name?.toUpperCase() ?? '', - style: StreamChatTheme.of(context) - .textTheme - .footnoteBold - .copyWith( + ? Row( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + constraints: BoxConstraints.tight(Size(64, 24)), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + color: theme.colorTheme.accentBlue, + ), + alignment: Alignment.center, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + StreamSvgIcon.lightning( color: Colors.white, + size: 16.0, ), + Text( + _chosenCommand?.name?.toUpperCase() ?? '', + style: StreamChatTheme.of(context) + .textTheme + .footnoteBold + .copyWith( + color: Colors.white, + ), + ), + ], + ), ), - ], - ), + ), + ], ) - : null, + : (widget.actionsLocation == ActionsLocation.leftInside + ? Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _buildExpandActionsButton(), + ], + ) + : null), + suffixIconConstraints: BoxConstraints.tightFor(height: 40), + prefixIconConstraints: BoxConstraints.tightFor(height: 40), suffixIcon: Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, children: [ if (_commandEnabled) - IconButton( - icon: StreamSvgIcon.closeSmall(), - splashRadius: 24, - padding: const EdgeInsets.all(0), - constraints: BoxConstraints.tightFor( - height: 24, - width: 24, + Padding( + padding: const EdgeInsets.only(right: 8.0), + child: IconButton( + icon: StreamSvgIcon.closeSmall(), + splashRadius: 24, + padding: const EdgeInsets.all(0), + constraints: BoxConstraints.tightFor( + height: 24, + width: 24, + ), + onPressed: () { + setState(() => _commandEnabled = false); + }, ), - onPressed: () { - setState(() => _commandEnabled = false); - }, ), + if (!_commandEnabled && + widget.actionsLocation == ActionsLocation.rightInside) + _buildExpandActionsButton(), if (widget.sendButtonLocation == SendButtonLocation.inside) _animateSendButton(context), ], @@ -619,7 +655,13 @@ class MessageInputState extends State { Timer _debounce; + String _previousValue; void _onChanged(BuildContext context, String s) { + if (s == _previousValue) { + return; + } + _previousValue = s; + if (_debounce?.isActive == true) _debounce.cancel(); _debounce = Timer( const Duration(milliseconds: 350), @@ -631,7 +673,11 @@ class MessageInputState extends State { setState(() { _messageIsPresent = s.trim().isNotEmpty; - _actionsShrunk = s.trim().isNotEmpty; + _actionsShrunk = s.trim().isNotEmpty && + ((widget.actions?.length ?? 0) + + (widget.showCommandsButton ? 1 : 0) + + (widget.disableAttachments ? 0 : 1) > + 1); }); _commandsOverlay?.remove(); @@ -1684,13 +1730,19 @@ class MessageInputState extends State { } Widget _buildCommandButton() { + final s = textEditingController.text.trim(); + return IconButton( icon: StreamSvgIcon.lightning( - color: _commandsOverlay != null - ? StreamChatTheme.of(context).messageInputTheme.actionButtonColor - : StreamChatTheme.of(context) - .messageInputTheme - .actionButtonIdleColor, + color: s.isNotEmpty + ? StreamChatTheme.of(context).colorTheme.greyGainsboro + : (_commandsOverlay != null + ? StreamChatTheme.of(context) + .messageInputTheme + .actionButtonColor + : StreamChatTheme.of(context) + .messageInputTheme + .actionButtonIdleColor), ), padding: const EdgeInsets.all(0), constraints: BoxConstraints.tightFor( @@ -1711,7 +1763,9 @@ class MessageInputState extends State { if (_commandsOverlay == null) { setState(() { _commandsOverlay = _buildCommandsOverlayEntry(); - Overlay.of(context).insert(_commandsOverlay); + if (_commandsOverlay != null) { + Overlay.of(context).insert(_commandsOverlay); + } }); } else { setState(() { @@ -1965,24 +2019,31 @@ class MessageInputState extends State { } Widget _buildIdleSendButton(BuildContext context) { - return StreamSvgIcon( - assetName: _getIdleSendIcon(), - color: StreamChatTheme.of(context).messageInputTheme.sendButtonIdleColor, + return Padding( + padding: const EdgeInsets.all(8.0), + child: StreamSvgIcon( + assetName: _getIdleSendIcon(), + color: + StreamChatTheme.of(context).messageInputTheme.sendButtonIdleColor, + ), ); } Widget _buildSendButton(BuildContext context) { - return IconButton( - onPressed: sendMessage, - padding: const EdgeInsets.all(0), - splashRadius: 24, - constraints: BoxConstraints.tightFor( - height: 24, - width: 24, - ), - icon: StreamSvgIcon( - assetName: _getSendIcon(), - color: StreamChatTheme.of(context).messageInputTheme.sendButtonColor, + return Padding( + padding: const EdgeInsets.all(8.0), + child: IconButton( + onPressed: sendMessage, + padding: const EdgeInsets.all(0), + splashRadius: 24, + constraints: BoxConstraints.tightFor( + height: 24, + width: 24, + ), + icon: StreamSvgIcon( + assetName: _getSendIcon(), + color: StreamChatTheme.of(context).messageInputTheme.sendButtonColor, + ), ), ); } From 8ada0691a7ee1947d9224d326c52b5d7c2aefe96 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 16 Mar 2021 11:22:52 +0100 Subject: [PATCH 05/24] fix messageinput actions --- packages/stream_chat_flutter/lib/src/message_input.dart | 2 +- 1 file changed, 1 insertion(+), 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 d43e774c..539dc018 100644 --- a/packages/stream_chat_flutter/lib/src/message_input.dart +++ b/packages/stream_chat_flutter/lib/src/message_input.dart @@ -440,7 +440,7 @@ class MessageInputState extends State { Widget _buildExpandActionsButton() { return Padding( - padding: const EdgeInsets.all(8.0), + padding: const EdgeInsets.symmetric(horizontal: 8.0), child: AnimatedCrossFade( crossFadeState: _actionsShrunk ? CrossFadeState.showFirst From 4cda0c943581653ac15b0c1df5673cb1887dab2b Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 16 Mar 2021 12:02:31 +0100 Subject: [PATCH 06/24] fix messageinput padding --- packages/stream_chat_flutter/lib/src/message_input.dart | 2 +- 1 file changed, 1 insertion(+), 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 539dc018..4a18bf02 100644 --- a/packages/stream_chat_flutter/lib/src/message_input.dart +++ b/packages/stream_chat_flutter/lib/src/message_input.dart @@ -314,7 +314,7 @@ class MessageInputState extends State { ), ), Padding( - padding: const EdgeInsets.all(8.0), + padding: const EdgeInsets.symmetric(vertical: 8.0), child: _buildTextField(context), ), if (widget.parentMessage != null && !widget.hideSendAsDm) From 7a8fe4aa78e0934fb85ad0cb4b9a7e73edc02a3e Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 16 Mar 2021 13:47:46 +0100 Subject: [PATCH 07/24] fix attachment border radius --- .../lib/src/message_actions_modal.dart | 6 ++- .../lib/src/message_reactions_modal.dart | 11 +++-- .../lib/src/message_widget.dart | 46 ++++++++++++------- .../stream_chat_flutter/lib/src/utils.dart | 20 ++++---- 4 files changed, 54 insertions(+), 29 deletions(-) diff --git a/packages/stream_chat_flutter/lib/src/message_actions_modal.dart b/packages/stream_chat_flutter/lib/src/message_actions_modal.dart index 883210ba..c997d09c 100644 --- a/packages/stream_chat_flutter/lib/src/message_actions_modal.dart +++ b/packages/stream_chat_flutter/lib/src/message_actions_modal.dart @@ -5,10 +5,10 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:stream_chat_flutter/src/message_action.dart'; -import 'package:stream_chat_flutter/stream_chat_flutter.dart'; import 'package:stream_chat_flutter/src/reaction_picker.dart'; import 'package:stream_chat_flutter/src/stream_svg_icon.dart'; import 'package:stream_chat_flutter/src/utils.dart'; +import 'package:stream_chat_flutter/stream_chat_flutter.dart'; import 'extension.dart'; import 'message_input.dart'; @@ -34,6 +34,7 @@ class MessageActionsModal extends StatefulWidget { final ShapeBorder messageShape; final ShapeBorder attachmentShape; final DisplayWidget showUserAvatar; + final BorderRadius attachmentBorderRadiusGeometry; /// List of custom actions final List customActions; @@ -58,6 +59,7 @@ class MessageActionsModal extends StatefulWidget { this.attachmentShape, this.reverse = false, this.customActions = const [], + this.attachmentBorderRadiusGeometry, }) : super(key: key); @override @@ -153,6 +155,8 @@ class _MessageActionsModalState extends State { child: MessageWidget( key: Key('MessageWidget'), reverse: widget.reverse, + attachmentBorderRadiusGeometry: + widget.attachmentBorderRadiusGeometry, message: widget.message.copyWith( text: widget.message.text.length > 200 ? '${widget.message.text.substring(0, 200)}...' diff --git a/packages/stream_chat_flutter/lib/src/message_reactions_modal.dart b/packages/stream_chat_flutter/lib/src/message_reactions_modal.dart index a9e55a0a..c2a13ae7 100644 --- a/packages/stream_chat_flutter/lib/src/message_reactions_modal.dart +++ b/packages/stream_chat_flutter/lib/src/message_reactions_modal.dart @@ -1,17 +1,16 @@ import 'dart:ui'; import 'package:flutter/material.dart'; -import 'package:stream_chat_flutter/src/message_action.dart'; -import 'package:stream_chat_flutter/stream_chat_flutter.dart'; -import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart'; import 'package:stream_chat_flutter/src/reaction_bubble.dart'; import 'package:stream_chat_flutter/src/reaction_picker.dart'; import 'package:stream_chat_flutter/src/stream_chat.dart'; import 'package:stream_chat_flutter/src/user_avatar.dart'; +import 'package:stream_chat_flutter/stream_chat_flutter.dart'; +import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart'; +import 'extension.dart'; import 'message_widget.dart'; import 'stream_chat_theme.dart'; -import 'extension.dart'; class MessageReactionsModal extends StatelessWidget { final Widget Function(BuildContext, Message) editMessageInputBuilder; @@ -24,6 +23,7 @@ class MessageReactionsModal extends StatelessWidget { final ShapeBorder messageShape; final ShapeBorder attachmentShape; final void Function(User) onUserAvatarTap; + final BorderRadius attachmentBorderRadiusGeometry; const MessageReactionsModal({ Key key, @@ -37,6 +37,7 @@ class MessageReactionsModal extends StatelessWidget { this.reverse = false, this.showUserAvatar = DisplayWidget.show, this.onUserAvatarTap, + this.attachmentBorderRadiusGeometry, }) : super(key: key); @override @@ -133,6 +134,8 @@ class MessageReactionsModal extends StatelessWidget { shape: messageShape, attachmentShape: attachmentShape, padding: const EdgeInsets.all(0), + attachmentBorderRadiusGeometry: + attachmentBorderRadiusGeometry, attachmentPadding: EdgeInsets.all( hasFileAttachment ? 4 : 2, ), diff --git a/packages/stream_chat_flutter/lib/src/message_widget.dart b/packages/stream_chat_flutter/lib/src/message_widget.dart index 67e38c75..3e173089 100644 --- a/packages/stream_chat_flutter/lib/src/message_widget.dart +++ b/packages/stream_chat_flutter/lib/src/message_widget.dart @@ -235,6 +235,7 @@ class MessageWidget extends StatefulWidget { ), border, reverse, + attachmentBorderRadiusGeometry ?? BorderRadius.zero, ), ); } @@ -259,6 +260,7 @@ class MessageWidget extends StatefulWidget { ), border, reverse, + attachmentBorderRadiusGeometry ?? BorderRadius.zero, ); }, 'video': (context, message, attachments) { @@ -291,6 +293,7 @@ class MessageWidget extends StatefulWidget { ), border, reverse, + attachmentBorderRadiusGeometry ?? BorderRadius.zero, ); }, 'giphy': (context, message, attachments) { @@ -318,6 +321,7 @@ class MessageWidget extends StatefulWidget { ), border, reverse, + attachmentBorderRadiusGeometry ?? BorderRadius.zero, ); }, 'file': (context, message, attachments) { @@ -329,22 +333,28 @@ class MessageWidget extends StatefulWidget { borderRadius: attachmentBorderRadiusGeometry ?? BorderRadius.zero, ); - return wrapAttachmentWidget( - context, - Column( - children: attachments.map((attachment) { - return FileAttachment( - message: message, - attachment: attachment, - size: Size( - MediaQuery.of(context).size.width * 0.8, - MediaQuery.of(context).size.height * 0.3, - ), - ); - }).toList(), - ), - border, - reverse, + return Column( + children: attachments + .map((attachment) { + return wrapAttachmentWidget( + context, + FileAttachment( + message: message, + attachment: attachment, + size: Size( + MediaQuery.of(context).size.width * 0.8, + MediaQuery.of(context).size.height * 0.3, + ), + ), + border, + reverse, + attachmentBorderRadiusGeometry ?? BorderRadius.zero, + ); + }) + .insertBetween(SizedBox( + height: attachmentPadding.vertical / 2, + )) + .toList(), ); }, }..addAll(customAttachmentBuilders ?? {}), @@ -822,6 +832,8 @@ class _MessageWidgetState extends State return StreamChannel( channel: channel, child: MessageActionsModal( + attachmentBorderRadiusGeometry: + widget.attachmentBorderRadiusGeometry, showUserAvatar: widget.message.user.id == channel.client.state.user.id ? DisplayWidget.gone @@ -869,6 +881,8 @@ class _MessageWidgetState extends State return StreamChannel( channel: channel, child: MessageReactionsModal( + attachmentBorderRadiusGeometry: + widget.attachmentBorderRadiusGeometry, showUserAvatar: widget.message.user.id == channel.client.state.user.id ? DisplayWidget.gone diff --git a/packages/stream_chat_flutter/lib/src/utils.dart b/packages/stream_chat_flutter/lib/src/utils.dart index fee747a9..8950a77c 100644 --- a/packages/stream_chat_flutter/lib/src/utils.dart +++ b/packages/stream_chat_flutter/lib/src/utils.dart @@ -356,15 +356,19 @@ Widget wrapAttachmentWidget( Widget attachmentWidget, ShapeBorder attachmentShape, bool reverse, + BorderRadius borderRadius, ) { - return Material( - clipBehavior: Clip.antiAlias, - shape: attachmentShape, - type: MaterialType.transparency, - child: Transform( - transform: Matrix4.rotationY(reverse ? pi : 0), - alignment: Alignment.center, - child: attachmentWidget, + return ClipRRect( + borderRadius: borderRadius, + child: Material( + clipBehavior: Clip.antiAlias, + shape: attachmentShape, + type: MaterialType.transparency, + child: Transform( + transform: Matrix4.rotationY(reverse ? pi : 0), + alignment: Alignment.center, + child: attachmentWidget, + ), ), ); } From 4d0bc0495f64cedd64c47659363fb11f4e440e73 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 16 Mar 2021 14:24:00 +0100 Subject: [PATCH 08/24] fix image reloading on reaction.new --- .../lib/src/attachment/image_attachment.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/stream_chat_flutter/lib/src/attachment/image_attachment.dart b/packages/stream_chat_flutter/lib/src/attachment/image_attachment.dart index 98509bb9..aa8d1246 100644 --- a/packages/stream_chat_flutter/lib/src/attachment/image_attachment.dart +++ b/packages/stream_chat_flutter/lib/src/attachment/image_attachment.dart @@ -4,9 +4,9 @@ import 'package:shimmer/shimmer.dart'; import 'package:stream_chat_flutter/src/attachment/attachment_upload_state_builder.dart'; import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart'; -import 'attachment_title.dart'; import '../full_screen_media.dart'; import '../stream_chat_theme.dart'; +import 'attachment_title.dart'; import 'attachment_widget.dart'; class ImageAttachment extends AttachmentWidget { @@ -81,6 +81,7 @@ class ImageAttachment extends AttachmentWidget { return _buildImageAttachment( context, CachedNetworkImage( + cacheKey: imageUri.path, height: size?.height, width: size?.width, placeholder: (_, __) { From 6027e9b6f648a83f12673e49dcb1dc69fd5fe93a Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 16 Mar 2021 14:58:23 +0100 Subject: [PATCH 09/24] update title.yml --- .github/workflows/pr_title.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/pr_title.yml b/.github/workflows/pr_title.yml index 6f4ad786..70d706d2 100644 --- a/.github/workflows/pr_title.yml +++ b/.github/workflows/pr_title.yml @@ -5,6 +5,9 @@ on: - opened - edited - synchronize + branch: + - develop + - master jobs: main: From 37772f247ae4731189e2611bc2cc5cc0ce624f68 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 16 Mar 2021 15:28:40 +0100 Subject: [PATCH 10/24] bump versions --- packages/stream_chat/CHANGELOG.md | 4 ++++ packages/stream_chat/lib/version.dart | 2 +- packages/stream_chat/pubspec.yaml | 2 +- packages/stream_chat_flutter/CHANGELOG.md | 10 +++++++++- packages/stream_chat_flutter/pubspec.yaml | 8 ++------ packages/stream_chat_flutter_core/CHANGELOG.md | 4 ++++ packages/stream_chat_flutter_core/pubspec.yaml | 8 ++------ packages/stream_chat_persistence/CHANGELOG.md | 5 +++++ packages/stream_chat_persistence/pubspec.yaml | 8 ++------ 9 files changed, 30 insertions(+), 21 deletions(-) diff --git a/packages/stream_chat/CHANGELOG.md b/packages/stream_chat/CHANGELOG.md index 4e30d452..8cf0fad1 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.5.0 + +- Minor fixes and improvements + ## 1.4.0-beta - Improved attachment uploading diff --git a/packages/stream_chat/lib/version.dart b/packages/stream_chat/lib/version.dart index 207ba25e..c593eede 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 = '1.4.0-beta'; +const PACKAGE_VERSION = '1.5.0'; diff --git a/packages/stream_chat/pubspec.yaml b/packages/stream_chat/pubspec.yaml index 410cc561..81aef23e 100644 --- a/packages/stream_chat/pubspec.yaml +++ b/packages/stream_chat/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat homepage: https://getstream.io/ description: The official Dart client for Stream Chat, a service for building chat applications. -version: 1.4.0-beta +version: 1.5.0 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues diff --git a/packages/stream_chat_flutter/CHANGELOG.md b/packages/stream_chat_flutter/CHANGELOG.md index d432f441..6faf9d77 100644 --- a/packages/stream_chat_flutter/CHANGELOG.md +++ b/packages/stream_chat_flutter/CHANGELOG.md @@ -1,3 +1,11 @@ +## 1.5.0 + +- Fixed swipeable visible on navigation back +- Fixed video upload +- `MessageInput`: added more actions locations, merge actions and add `showCommandsButton` property +- 🛑 **BREAKING** Updated AttachmentBuilder signature +- Fixed image reloading on reaction.new + ## 1.4.0-beta - Unfocus `MessageInput` only when sending commands @@ -10,7 +18,7 @@ - Added `MessageListView.onAttachmentTap` callback - Fixed message newline issue - Fixed `MessageListView` scroll keyboard behaviour -- Minor fixes and improveqments +- Minor fixes and improvements ## 1.3.2-beta diff --git a/packages/stream_chat_flutter/pubspec.yaml b/packages/stream_chat_flutter/pubspec.yaml index 4d480154..24f83efe 100644 --- a/packages/stream_chat_flutter/pubspec.yaml +++ b/packages/stream_chat_flutter/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat_flutter homepage: https://github.com/GetStream/stream-chat-flutter description: Stream Chat official Flutter SDK. Build your own chat experience using Dart and Flutter. -version: 1.4.0-beta +version: 1.5.0 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -11,11 +11,7 @@ environment: dependencies: flutter: sdk: flutter - stream_chat_flutter_core: - git: - url: https://github.com/GetStream/stream-chat-flutter.git - ref: develop - path: packages/stream_chat_flutter_core + stream_chat_flutter_core: ^1.5.0 photo_view: ^0.11.0 rxdart: ^0.25.0 scrollable_positioned_list: ^0.1.8 diff --git a/packages/stream_chat_flutter_core/CHANGELOG.md b/packages/stream_chat_flutter_core/CHANGELOG.md index 0bad0c4e..ac1fc93c 100644 --- a/packages/stream_chat_flutter_core/CHANGELOG.md +++ b/packages/stream_chat_flutter_core/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.5.0 + +* Minor fixes and improvements + ## 1.4.0-beta * Added `MessageListCore.messageFilter` to filter messages locally diff --git a/packages/stream_chat_flutter_core/pubspec.yaml b/packages/stream_chat_flutter_core/pubspec.yaml index 93547384..5a5fc7da 100644 --- a/packages/stream_chat_flutter_core/pubspec.yaml +++ b/packages/stream_chat_flutter_core/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat_flutter_core homepage: https://github.com/GetStream/stream-chat-flutter description: Stream Chat official Flutter SDK Core. Build your own chat experience using Dart and Flutter. -version: 1.4.0-beta +version: 1.5.0 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -10,11 +10,7 @@ environment: flutter: ">=1.17.0" dependencies: - stream_chat: - git: - url: https://github.com/GetStream/stream-chat-flutter.git - ref: develop - path: packages/stream_chat + stream_chat: ^1.5.0 flutter: sdk: flutter rxdart: ^0.25.0 diff --git a/packages/stream_chat_persistence/CHANGELOG.md b/packages/stream_chat_persistence/CHANGELOG.md index 161f2d59..9c844ee3 100644 --- a/packages/stream_chat_persistence/CHANGELOG.md +++ b/packages/stream_chat_persistence/CHANGELOG.md @@ -1,3 +1,8 @@ +## 1.5.0 + +* Update llc dependency +* Wait for all operations to finish before disconnecting + ## 1.4.0-beta * Update llc dependency diff --git a/packages/stream_chat_persistence/pubspec.yaml b/packages/stream_chat_persistence/pubspec.yaml index a91ac666..f8fe60b2 100644 --- a/packages/stream_chat_persistence/pubspec.yaml +++ b/packages/stream_chat_persistence/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat_persistence homepage: https://github.com/GetStream/stream-chat-flutter description: Official Stream Chat Persistence library. Build your own chat experience using Dart and Flutter. -version: 1.4.0-beta +version: 1.5.0 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -16,11 +16,7 @@ dependencies: path: ^1.7.0 path_provider: ^1.6.27 sqlite3_flutter_libs: ^0.4.0+1 - stream_chat: - git: - url: https://github.com/GetStream/stream-chat-flutter.git - ref: develop - path: packages/stream_chat + stream_chat: ^1.5.0 dev_dependencies: test: ^1.15.7 From 574cca792bff46b9072476413055dc364858c76d Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 16 Mar 2021 16:25:20 +0100 Subject: [PATCH 11/24] fix pana --- .../stream_chat_persistence/lib/src/db/moor_chat_database.dart | 1 - 1 file changed, 1 deletion(-) 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 cc3e86b3..af409b70 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,4 +1,3 @@ -import 'package:moor/isolate.dart'; import 'package:moor/moor.dart'; import 'package:stream_chat/stream_chat.dart'; From cb37774d544bf993fd5ec28e1af3928cc3045693 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 16 Mar 2021 16:33:54 +0100 Subject: [PATCH 12/24] update dependencies --- packages/stream_chat_persistence/pubspec.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/stream_chat_persistence/pubspec.yaml b/packages/stream_chat_persistence/pubspec.yaml index f8fe60b2..47e2778f 100644 --- a/packages/stream_chat_persistence/pubspec.yaml +++ b/packages/stream_chat_persistence/pubspec.yaml @@ -14,6 +14,8 @@ dependencies: mutex: ^2.0.0 moor: ^3.4.0 path: ^1.7.0 + logging: ^0.11.4 + meta: ^1.2.4 path_provider: ^1.6.27 sqlite3_flutter_libs: ^0.4.0+1 stream_chat: ^1.5.0 From c66212c37cbb0d90745d0038a8ebe90c306de137 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 16 Mar 2021 16:35:11 +0100 Subject: [PATCH 13/24] cleanup --- .../lib/src/attachment/file_attachment.dart | 1 - .../lib/src/attachment/giphy_attachment.dart | 3 --- packages/stream_chat_flutter/lib/src/message_widget.dart | 4 ++-- 3 files changed, 2 insertions(+), 6 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 49403f0c..1003c767 100644 --- a/packages/stream_chat_flutter/lib/src/attachment/file_attachment.dart +++ b/packages/stream_chat_flutter/lib/src/attachment/file_attachment.dart @@ -6,7 +6,6 @@ import 'package:stream_chat_flutter/src/stream_svg_icon.dart'; import 'package:stream_chat_flutter/src/utils.dart'; import 'package:stream_chat_flutter/src/video_thumbnail_image.dart'; import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart'; -import 'package:transparent_image/transparent_image.dart'; import '../upload_progress_indicator.dart'; import 'attachment_widget.dart'; diff --git a/packages/stream_chat_flutter/lib/src/attachment/giphy_attachment.dart b/packages/stream_chat_flutter/lib/src/attachment/giphy_attachment.dart index 4ded5ca7..5bb810b4 100644 --- a/packages/stream_chat_flutter/lib/src/attachment/giphy_attachment.dart +++ b/packages/stream_chat_flutter/lib/src/attachment/giphy_attachment.dart @@ -1,10 +1,7 @@ -import 'dart:typed_data'; - import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:shimmer/shimmer.dart'; import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart'; -import 'package:transparent_image/transparent_image.dart'; import '../full_screen_media.dart'; import '../stream_chat_theme.dart'; diff --git a/packages/stream_chat_flutter/lib/src/message_widget.dart b/packages/stream_chat_flutter/lib/src/message_widget.dart index 3e173089..a0c1201a 100644 --- a/packages/stream_chat_flutter/lib/src/message_widget.dart +++ b/packages/stream_chat_flutter/lib/src/message_widget.dart @@ -927,7 +927,7 @@ class _MessageWidgetState extends State } Widget _parseAttachments() { - Map> attachmentGroups = {}; + final attachmentGroups = >{}; widget.message.attachments .where((element) => element.ogScrapeUrl == null) @@ -939,7 +939,7 @@ class _MessageWidgetState extends State attachmentGroups[e.type].add(e); }); - List attachmentList = []; + final attachmentList = []; attachmentGroups.forEach((type, attachments) { final attachmentBuilder = widget.attachmentBuilders[type]; From a14045a09de3abb33e7af09fa20987250188f179 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 16 Mar 2021 16:52:44 +0100 Subject: [PATCH 14/24] fix analysis --- packages/stream_chat/analysis_options.yaml | 1 - packages/stream_chat/lib/src/api/channel.dart | 1 + .../lib/src/db/moor_chat_database.dart | 9 ++++----- .../stream_chat_persistence/lib/src/entity/channels.dart | 2 +- packages/stream_chat_persistence/pubspec.yaml | 8 ++++---- 5 files changed, 10 insertions(+), 11 deletions(-) diff --git a/packages/stream_chat/analysis_options.yaml b/packages/stream_chat/analysis_options.yaml index 7e4b00fa..26001160 100644 --- a/packages/stream_chat/analysis_options.yaml +++ b/packages/stream_chat/analysis_options.yaml @@ -44,7 +44,6 @@ linter: - avoid_private_typedef_functions - avoid_redundant_argument_values - avoid_return_types_on_setters - - avoid_returning_null - avoid_returning_null_for_void - avoid_shadowing_type_parameters - avoid_single_cascade_in_expression_statements diff --git a/packages/stream_chat/lib/src/api/channel.dart b/packages/stream_chat/lib/src/api/channel.dart index 52b748d4..87bb942b 100644 --- a/packages/stream_chat/lib/src/api/channel.dart +++ b/packages/stream_chat/lib/src/api/channel.dart @@ -1209,6 +1209,7 @@ class ChannelClientState { ChannelClientState( this._channel, ChannelState channelState, + // ignore: unnecessary_parenthesis ) : _debouncedUpdatePersistenceChannelState = ((ChannelState state) { _channel?._client?.chatPersistenceClient?.updateChannelState(state); }).debounced(const Duration(seconds: 1)) { 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 af409b70..65686cb1 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,10 +1,9 @@ import 'package:moor/moor.dart'; import 'package:stream_chat/stream_chat.dart'; - -import '../converter/converter.dart'; -import '../dao/dao.dart'; -import '../entity/entity.dart'; -import 'shared/shared_db.dart'; +import 'package:stream_chat_persistence/src/converter/converter.dart'; +import 'package:stream_chat_persistence/src/dao/dao.dart'; +import 'package:stream_chat_persistence/src/db/shared/shared_db.dart'; +import 'package:stream_chat_persistence/src/entity/entity.dart'; part 'moor_chat_database.g.dart'; diff --git a/packages/stream_chat_persistence/lib/src/entity/channels.dart b/packages/stream_chat_persistence/lib/src/entity/channels.dart index 38a40081..7e32906e 100644 --- a/packages/stream_chat_persistence/lib/src/entity/channels.dart +++ b/packages/stream_chat_persistence/lib/src/entity/channels.dart @@ -17,7 +17,7 @@ class Channels extends Table { TextColumn get config => text().map(MapConverter())(); /// True if this channel entity is frozen - BoolColumn get frozen => boolean().withDefault(Constant(false))(); + BoolColumn get frozen => boolean().withDefault(const Constant(false))(); /// The date of the last message DateTimeColumn get lastMessageAt => dateTime().nullable()(); diff --git a/packages/stream_chat_persistence/pubspec.yaml b/packages/stream_chat_persistence/pubspec.yaml index 47e2778f..12d117b1 100644 --- a/packages/stream_chat_persistence/pubspec.yaml +++ b/packages/stream_chat_persistence/pubspec.yaml @@ -11,17 +11,17 @@ environment: dependencies: flutter: sdk: flutter - mutex: ^2.0.0 - moor: ^3.4.0 - path: ^1.7.0 logging: ^0.11.4 meta: ^1.2.4 + moor: ^3.4.0 + mutex: ^2.0.0 + path: ^1.7.0 path_provider: ^1.6.27 sqlite3_flutter_libs: ^0.4.0+1 stream_chat: ^1.5.0 dev_dependencies: - test: ^1.15.7 build_runner: ^1.11.0 moor_generator: ^3.4.1 pedantic: ^1.9.2 + test: ^1.15.7 From 527cc3b731ec96961232747efd3914199d1d766c Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 16 Mar 2021 16:53:18 +0100 Subject: [PATCH 15/24] analyze on all branch --- .github/workflows/stream_flutter_workflow.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/stream_flutter_workflow.yml b/.github/workflows/stream_flutter_workflow.yml index 8edf9293..52a504fe 100644 --- a/.github/workflows/stream_flutter_workflow.yml +++ b/.github/workflows/stream_flutter_workflow.yml @@ -13,7 +13,6 @@ on: jobs: analyze: - if: github.base_ref == 'master' timeout-minutes: 15 runs-on: ubuntu-latest steps: From 90136c5174eeea6378b66a394cb67b68d5cdf33d Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 16 Mar 2021 16:54:46 +0100 Subject: [PATCH 16/24] no title check on master --- .github/workflows/pr_title.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/pr_title.yml b/.github/workflows/pr_title.yml index 70d706d2..7525a726 100644 --- a/.github/workflows/pr_title.yml +++ b/.github/workflows/pr_title.yml @@ -7,7 +7,6 @@ on: - synchronize branch: - develop - - master jobs: main: From fc1fec069573b1b57c07570094c80cf92e855938 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 16 Mar 2021 17:00:46 +0100 Subject: [PATCH 17/24] fix analysis --- packages/stream_chat/lib/src/api/channel.dart | 2 +- packages/stream_chat_persistence/analysis_options.yaml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/stream_chat/lib/src/api/channel.dart b/packages/stream_chat/lib/src/api/channel.dart index 87bb942b..1701fed8 100644 --- a/packages/stream_chat/lib/src/api/channel.dart +++ b/packages/stream_chat/lib/src/api/channel.dart @@ -1209,7 +1209,7 @@ class ChannelClientState { ChannelClientState( this._channel, ChannelState channelState, - // ignore: unnecessary_parenthesis + //ignore: unnecessary_parenthesis ) : _debouncedUpdatePersistenceChannelState = ((ChannelState state) { _channel?._client?.chatPersistenceClient?.updateChannelState(state); }).debounced(const Duration(seconds: 1)) { diff --git a/packages/stream_chat_persistence/analysis_options.yaml b/packages/stream_chat_persistence/analysis_options.yaml index 7e4b00fa..26001160 100644 --- a/packages/stream_chat_persistence/analysis_options.yaml +++ b/packages/stream_chat_persistence/analysis_options.yaml @@ -44,7 +44,6 @@ linter: - avoid_private_typedef_functions - avoid_redundant_argument_values - avoid_return_types_on_setters - - avoid_returning_null - avoid_returning_null_for_void - avoid_shadowing_type_parameters - avoid_single_cascade_in_expression_statements From b9defc9413cc1aba6b21bc7a7ff6b43b959e089b Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 16 Mar 2021 17:01:53 +0100 Subject: [PATCH 18/24] update action --- .github/workflows/pr_title.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr_title.yml b/.github/workflows/pr_title.yml index 7525a726..2a53261b 100644 --- a/.github/workflows/pr_title.yml +++ b/.github/workflows/pr_title.yml @@ -5,7 +5,7 @@ on: - opened - edited - synchronize - branch: + branches: - develop jobs: From 64082ec2139d6e456e1a317b02483c05e2034e7b Mon Sep 17 00:00:00 2001 From: Thierry Schellenbach Date: Tue, 16 Mar 2021 16:24:27 -0600 Subject: [PATCH 19/24] Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 0d465852..b0a88432 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,11 @@ Stream allows developers to rapidly deploy scalable feeds and chat messaging wit ## Sample apps and demos Our team maintains a dedicated repository for fully-fledged sample applications and demos. Consider checking out [GetStream/flutter-samples](https://github.com/GetStream/flutter-samples) to learn more or get started by looking at our latest [Stream Chat demo](https://github.com/GetStream/flutter-samples/tree/main/stream_chat_v1). +## Free for Makers + +Stream is free for most side and hobby projects. To qualify your project/company needs to have < 5 team members and < $10k in monthly revenue. +For complete pricing details visit our [Chat Pricing Page](https://getstream.io/chat/pricing/) + ## Structure Stream Chat Dart is a monorepo built using [Melos](https://docs.page/invertase/melos). Individual packages can be found in the `packages` directory while configuration and top level commands can be found in `melos.yaml`. From 721b30ef7eb3bcdc575780e188d1316a32c9ac26 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 17 Mar 2021 10:20:09 +0100 Subject: [PATCH 20/24] fix: unread count not updating while the chat is open --- packages/stream_chat_flutter/lib/src/message_list_view.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 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 6c5199b5..5b1c3a99 100644 --- a/packages/stream_chat_flutter/lib/src/message_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/message_list_view.dart @@ -749,7 +749,7 @@ class _MessageListViewState extends State { Widget messageWidget; if (widget.messageBuilder != null) { messageWidget = Builder( - key: ValueKey('BOTTOM-MESSAGE'), + key: ValueKey('BOTTOM-MESSAGE-${message.id}'), builder: (_) => widget.messageBuilder( context, MessageDetails( @@ -766,7 +766,7 @@ class _MessageListViewState extends State { } return VisibilityDetector( - key: ValueKey('BOTTOM-MESSAGE'), + key: ValueKey('BOTTOM-MESSAGE-${message.id}'), onVisibilityChanged: (visibility) { final isVisible = visibility.visibleBounds != Rect.zero; if (isVisible) { From 89e91a09a8519096ea54e99ab0460fcc2ab46205 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 17 Mar 2021 10:21:24 +0100 Subject: [PATCH 21/24] bump version --- packages/stream_chat_flutter/CHANGELOG.md | 4 ++++ packages/stream_chat_flutter/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/stream_chat_flutter/CHANGELOG.md b/packages/stream_chat_flutter/CHANGELOG.md index 6faf9d77..ff336e8d 100644 --- a/packages/stream_chat_flutter/CHANGELOG.md +++ b/packages/stream_chat_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.5.1 + +- Fixed unread count not updating while the chat is open + ## 1.5.0 - Fixed swipeable visible on navigation back diff --git a/packages/stream_chat_flutter/pubspec.yaml b/packages/stream_chat_flutter/pubspec.yaml index 24f83efe..b17073d8 100644 --- a/packages/stream_chat_flutter/pubspec.yaml +++ b/packages/stream_chat_flutter/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat_flutter homepage: https://github.com/GetStream/stream-chat-flutter description: Stream Chat official Flutter SDK. Build your own chat experience using Dart and Flutter. -version: 1.5.0 +version: 1.5.1 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues From b77c4dfc5d87c4b51e28b452a12bef0a7ec571eb Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 17 Mar 2021 11:50:01 +0100 Subject: [PATCH 22/24] remove useless dependencies --- packages/stream_chat_flutter/pubspec.yaml | 3 --- packages/stream_chat_flutter_core/pubspec.yaml | 1 - packages/stream_chat_persistence/pubspec.yaml | 1 - 3 files changed, 5 deletions(-) diff --git a/packages/stream_chat_flutter/pubspec.yaml b/packages/stream_chat_flutter/pubspec.yaml index 24f83efe..867178d6 100644 --- a/packages/stream_chat_flutter/pubspec.yaml +++ b/packages/stream_chat_flutter/pubspec.yaml @@ -30,16 +30,13 @@ dependencies: flutter_keyboard_visibility: ^4.0.2 video_compress: ^2.1.1 visibility_detector: ^0.1.5 - http_parser: ^3.1.4 meta: ^1.2.4 lottie: ^0.7.0+1 substring_highlight: ^0.1.2 flutter_slidable: ^0.5.7 - clipboard: ^0.1.2+8 image_gallery_saver: ^1.6.7 share_plus: ^1.2.0 photo_manager: ^1.0.0 - transparent_image: ^1.0.0 ezanimation: ^0.4.1 synchronized: ^2.1.0 characters: ^1.0.0 diff --git a/packages/stream_chat_flutter_core/pubspec.yaml b/packages/stream_chat_flutter_core/pubspec.yaml index 5a5fc7da..cc36f149 100644 --- a/packages/stream_chat_flutter_core/pubspec.yaml +++ b/packages/stream_chat_flutter_core/pubspec.yaml @@ -20,5 +20,4 @@ dev_dependencies: flutter_test: sdk: flutter fake_async: ^1.1.0 - pedantic: ^1.9.2 \ No newline at end of file diff --git a/packages/stream_chat_persistence/pubspec.yaml b/packages/stream_chat_persistence/pubspec.yaml index 12d117b1..399d1278 100644 --- a/packages/stream_chat_persistence/pubspec.yaml +++ b/packages/stream_chat_persistence/pubspec.yaml @@ -23,5 +23,4 @@ dependencies: dev_dependencies: build_runner: ^1.11.0 moor_generator: ^3.4.1 - pedantic: ^1.9.2 test: ^1.15.7 From f992bfe6989d5437fe603f2b807795e7e1433ff8 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Thu, 18 Mar 2021 14:33:42 +0100 Subject: [PATCH 23/24] fix ci --- .github/workflows/dispatch_workflows.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dispatch_workflows.yml b/.github/workflows/dispatch_workflows.yml index 5743a0aa..6d626fdb 100644 --- a/.github/workflows/dispatch_workflows.yml +++ b/.github/workflows/dispatch_workflows.yml @@ -20,7 +20,7 @@ jobs: repo: GetStream/flutter-samples token: ${{ secrets.GH_TOKEN }} dispatch_stable: - if: github.ref == 'refs/heads/master' + if: github.ref == 'refs/heads/main' runs-on: ubuntu-latest steps: - uses: benc-uk/workflow-dispatch@v1 From 2b17fcfac89604874e0730a276bce2f7acfff70b Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Fri, 19 Mar 2021 12:25:43 +0100 Subject: [PATCH 24/24] update ci --- .github/workflows/stream_flutter_workflow.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/stream_flutter_workflow.yml b/.github/workflows/stream_flutter_workflow.yml index 52a504fe..a25bbdb3 100644 --- a/.github/workflows/stream_flutter_workflow.yml +++ b/.github/workflows/stream_flutter_workflow.yml @@ -8,6 +8,7 @@ on: push: branches: - master + - develop paths-ignore: - 'docs/**'