diff --git a/.github/workflows/stream_flutter_workflow.yml b/.github/workflows/stream_flutter_workflow.yml index 89baee7d..e42174ad 100644 --- a/.github/workflows/stream_flutter_workflow.yml +++ b/.github/workflows/stream_flutter_workflow.yml @@ -46,7 +46,7 @@ jobs: run: | melos run analyze - name: "Pub Check" - if: github.ref == 'refs/heads/master' + if: github.base_ref == 'master' run: | melos run lint:pub diff --git a/README.md b/README.md index 051b8a4e..4cfaaa2b 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ![](https://raw.githubusercontent.com/GetStream/stream-chat-flutter/master/images/sdk_hero_v4.png) -![CI](https://github.com/GetStream/stream-chat-flutter/workflows/stream_flutter_workflow/badge.svg?branch=master) +[![CI](https://github.com/GetStream/stream-chat-flutter/actions/workflows/stream_flutter_workflow.yml/badge.svg?branch=master)](https://github.com/GetStream/stream-chat-flutter/actions/workflows/stream_flutter_workflow.yml) [![Melos](https://img.shields.io/badge/maintained%20with-melos-f700ff.svg?style=flat-square)](https://github.com/invertase/melos) **Quick Links** diff --git a/packages/stream_chat/CHANGELOG.md b/packages/stream_chat/CHANGELOG.md index ce7b796b..573e21f8 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -1,9 +1,11 @@ -## Upcoming +## 6.4.0 🐞 Fixed - [[#1293]](https://github.com/GetStream/stream-chat-flutter/issues/1293) Fixed wrong message order when sending messages quickly. +- [[#1612]](https://github.com/GetStream/stream-chat-flutter/issues/1612) Fixed `Channel.isMutedStream` does not emit + when channel mute expires. ## 6.3.0 diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index 7f10e414..cfbf344c 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -1510,15 +1510,32 @@ class Channel { ); } + // Timer to keep track of mute expiration. This is used to update the channel + // state when the mute expires. + Timer? _muteExpirationTimer; + /// Mutes the channel. Future mute({Duration? expiration}) { _checkInitialized(); + + // If there is a expiration set, we will set a timer to automatically unmute + // the channel when the mute expires. + if (expiration != null) { + _muteExpirationTimer?.cancel(); + _muteExpirationTimer = Timer(expiration, unmute); + } + return _client.muteChannel(cid!, expiration: expiration); } /// Unmute the channel. Future unmute() { _checkInitialized(); + + // Cancel the mute expiration timer if it is set. + _muteExpirationTimer?.cancel(); + _muteExpirationTimer = null; + return _client.unmuteChannel(cid!); } @@ -1648,6 +1665,7 @@ class Channel { void dispose() { client.state.removeChannel('$cid'); state?.dispose(); + _muteExpirationTimer?.cancel(); _keyStrokeHandler.cancel(); } diff --git a/packages/stream_chat/lib/version.dart b/packages/stream_chat/lib/version.dart index bf392fb3..a2fb6fe6 100644 --- a/packages/stream_chat/lib/version.dart +++ b/packages/stream_chat/lib/version.dart @@ -3,4 +3,4 @@ import 'package:stream_chat/src/client/client.dart'; /// Current package version /// Used in [StreamChatClient] to build the `x-stream-client` header // ignore: constant_identifier_names -const PACKAGE_VERSION = '6.3.0'; +const PACKAGE_VERSION = '6.4.0'; diff --git a/packages/stream_chat/pubspec.yaml b/packages/stream_chat/pubspec.yaml index db3bad2c..3bd6b49a 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: 6.3.0 +version: 6.4.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/test/src/client/channel_test.dart b/packages/stream_chat/test/src/client/channel_test.dart index 12a35629..3b4a1b6a 100644 --- a/packages/stream_chat/test/src/client/channel_test.dart +++ b/packages/stream_chat/test/src/client/channel_test.dart @@ -2481,6 +2481,31 @@ void main() { )).called(1); }); + test('`.mute with expiration`', () async { + const expiration = Duration(seconds: 3); + + when(() => client.muteChannel( + channelCid, + expiration: expiration, + )).thenAnswer((_) async => EmptyResponse()); + + when(() => client.unmuteChannel(channelCid)) + .thenAnswer((_) async => EmptyResponse()); + + final res = await channel.mute(expiration: expiration); + + expect(res, isNotNull); + + verify(() => client.muteChannel( + channelCid, + expiration: expiration, + )).called(1); + + // wait for expiration + await Future.delayed(expiration); + verify(() => client.unmuteChannel(channelCid)).called(1); + }); + test('`.unmute`', () async { when( () => client.unmuteChannel(channelCid), diff --git a/packages/stream_chat_flutter/CHANGELOG.md b/packages/stream_chat_flutter/CHANGELOG.md index 268cf593..2e6c73f0 100644 --- a/packages/stream_chat_flutter/CHANGELOG.md +++ b/packages/stream_chat_flutter/CHANGELOG.md @@ -1,4 +1,4 @@ -## Upcoming +## 6.4.0 🐞 Fixed @@ -52,6 +52,49 @@ ) ``` +- Added support for `StreamChannelAvatar.ownSpaceAvatarBuilder`, `StreamChannelAvatar.oneToOneAvatarBuilder` and + `StreamChannelAvatar.groupAvatarBuilder` to override the default avatar + widget.[#1614](https://github.com/GetStream/stream-chat-flutter/issues/1614) + + ```dart + StreamChannelAvatar( + ..., + ownSpaceAvatarBuilder: (context, channel) { + return Container( + color: Colors.red, + child: Text('Own Space Avatar'), + ); + }, + oneToOneAvatarBuilder: (context, channel) { + return Container( + color: Colors.red, + child: Text('One to One Avatar'), + ); + }, + groupAvatarBuilder: (context, channel) { + return Container( + color: Colors.red, + child: Text('Group Avatar'), + ); + }, + ) + ``` + +- Added support for `StreamMessageInput.contentInsertionConfiguration` to specify the content insertion configuration. + [#1613](https://github.com/GetStream/stream-chat-flutter/issues/1613) + + ```dart + StreamMessageInput( + ..., + contentInsertionConfiguration: ContentInsertionConfiguration( + onContentInserted: (content) { + // Do something with the content. + controller.addAttachment(...); + }, + ), + ) + ``` + ## 6.3.0 🐞 Fixed diff --git a/packages/stream_chat_flutter/lib/src/avatars/group_avatar.dart b/packages/stream_chat_flutter/lib/src/avatars/group_avatar.dart index 0571c7fd..be70bdbf 100644 --- a/packages/stream_chat_flutter/lib/src/avatars/group_avatar.dart +++ b/packages/stream_chat_flutter/lib/src/avatars/group_avatar.dart @@ -1,6 +1,14 @@ import 'package:flutter/material.dart'; import 'package:stream_chat_flutter/stream_chat_flutter.dart'; +/// WidgetBuilder for [StreamGroupAvatar]. +typedef StreamGroupAvatarBuilder = Widget Function( + BuildContext context, + List members, + // ignore: avoid_positional_boolean_parameters + bool isSelected, +); + /// {@template streamGroupAvatar} /// Widget for constructing a group of images /// {@endtemplate} diff --git a/packages/stream_chat_flutter/lib/src/avatars/user_avatar.dart b/packages/stream_chat_flutter/lib/src/avatars/user_avatar.dart index 2290fca9..72ec020b 100644 --- a/packages/stream_chat_flutter/lib/src/avatars/user_avatar.dart +++ b/packages/stream_chat_flutter/lib/src/avatars/user_avatar.dart @@ -2,6 +2,14 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:stream_chat_flutter/stream_chat_flutter.dart'; +/// WidgetBuilder for [StreamUserAvatar]. +typedef StreamUserAvatarBuilder = Widget Function( + BuildContext context, + User user, + // ignore: avoid_positional_boolean_parameters + bool isSelected, +); + /// {@template streamUserAvatar} /// Displays a user's avatar. /// {@endtemplate} diff --git a/packages/stream_chat_flutter/lib/src/channel/stream_channel_avatar.dart b/packages/stream_chat_flutter/lib/src/channel/stream_channel_avatar.dart index 5ad7a000..9090c33a 100644 --- a/packages/stream_chat_flutter/lib/src/channel/stream_channel_avatar.dart +++ b/packages/stream_chat_flutter/lib/src/channel/stream_channel_avatar.dart @@ -54,6 +54,9 @@ class StreamChannelAvatar extends StatelessWidget { this.selected = false, this.selectionColor, this.selectionThickness = 4, + this.ownSpaceAvatarBuilder, + this.oneToOneAvatarBuilder, + this.groupAvatarBuilder, }) : assert( channel.state != null, 'Channel ${channel.id} is not initialized', @@ -80,6 +83,21 @@ class StreamChannelAvatar extends StatelessWidget { /// Thickness of selection image final double selectionThickness; + /// Builder to create avatar for own space channel. + /// + /// Defaults to [StreamUserAvatar]. + final StreamUserAvatarBuilder? ownSpaceAvatarBuilder; + + /// Builder to create avatar for one to one channel. + /// + /// Defaults to [StreamUserAvatar]. + final StreamUserAvatarBuilder? oneToOneAvatarBuilder; + + /// Builder to create avatar for group channel. + /// + /// Defaults to [StreamGroupAvatar]. + final StreamGroupAvatarBuilder? groupAvatarBuilder; + @override Widget build(BuildContext context) { final client = channel.client.state; @@ -146,15 +164,22 @@ class StreamChannelAvatar extends StatelessWidget { return BetterStreamBuilder( stream: client.currentUserStream.map((it) => it!), initialData: currentUser, - builder: (context, user) => StreamUserAvatar( - borderRadius: borderRadius ?? previewTheme?.borderRadius, - user: user, - constraints: constraints ?? previewTheme?.constraints, - onTap: onTap != null ? (_) => onTap!() : null, - selected: selected, - selectionColor: selectionColor ?? colorTheme.accentPrimary, - selectionThickness: selectionThickness, - ), + builder: (context, user) { + final ownSpaceBuilder = ownSpaceAvatarBuilder; + if (ownSpaceBuilder != null) { + return ownSpaceBuilder(context, user, selected); + } + + return StreamUserAvatar( + borderRadius: borderRadius ?? previewTheme?.borderRadius, + user: user, + constraints: constraints ?? previewTheme?.constraints, + onTap: onTap != null ? (_) => onTap!() : null, + selected: selected, + selectionColor: selectionColor ?? colorTheme.accentPrimary, + selectionThickness: selectionThickness, + ); + }, ); } @@ -169,18 +194,30 @@ class StreamChannelAvatar extends StatelessWidget { ), ), initialData: member, - builder: (context, member) => StreamUserAvatar( - borderRadius: borderRadius ?? previewTheme?.borderRadius, - user: member.user!, - constraints: constraints ?? previewTheme?.constraints, - onTap: onTap != null ? (_) => onTap!() : null, - selected: selected, - selectionColor: selectionColor ?? colorTheme.accentPrimary, - selectionThickness: selectionThickness, - ), + builder: (context, member) { + final oneToOneBuilder = oneToOneAvatarBuilder; + if (oneToOneBuilder != null) { + return oneToOneBuilder(context, member.user!, selected); + } + + return StreamUserAvatar( + borderRadius: borderRadius ?? previewTheme?.borderRadius, + user: member.user!, + constraints: constraints ?? previewTheme?.constraints, + onTap: onTap != null ? (_) => onTap!() : null, + selected: selected, + selectionColor: selectionColor ?? colorTheme.accentPrimary, + selectionThickness: selectionThickness, + ); + }, ); } + final groupBuilder = groupAvatarBuilder; + if (groupBuilder != null) { + return groupBuilder(context, otherMembers, selected); + } + // Group conversation return StreamGroupAvatar( channel: channel, diff --git a/packages/stream_chat_flutter/lib/src/message_input/stream_message_input.dart b/packages/stream_chat_flutter/lib/src/message_input/stream_message_input.dart index c7a8a277..d4581ea0 100644 --- a/packages/stream_chat_flutter/lib/src/message_input/stream_message_input.dart +++ b/packages/stream_chat_flutter/lib/src/message_input/stream_message_input.dart @@ -145,6 +145,7 @@ class StreamMessageInput extends StatefulWidget { _defaultClearQuotedMessageKeyPredicate, this.ogPreviewFilter = _defaultOgPreviewFilter, this.hintGetter = _defaultHintGetter, + this.contentInsertionConfiguration, }); /// The predicate used to send a message on desktop/web @@ -306,6 +307,9 @@ class StreamMessageInput extends StatefulWidget { /// Returns the hint text for the message input. final HintGetter hintGetter; + /// {@macro flutter.widgets.editableText.contentInsertionConfiguration} + final ContentInsertionConfiguration? contentInsertionConfiguration; + static String? _defaultHintGetter( BuildContext context, HintType type, @@ -871,6 +875,8 @@ class StreamMessageInputState extends State decoration: _getInputDecoration(context), textCapitalization: widget.textCapitalization, autocorrect: widget.autoCorrect, + contentInsertionConfiguration: + widget.contentInsertionConfiguration, ), ), ), diff --git a/packages/stream_chat_flutter/lib/src/message_input/stream_message_text_field.dart b/packages/stream_chat_flutter/lib/src/message_input/stream_message_text_field.dart index a04ab829..292c9141 100644 --- a/packages/stream_chat_flutter/lib/src/message_input/stream_message_text_field.dart +++ b/packages/stream_chat_flutter/lib/src/message_input/stream_message_text_field.dart @@ -120,6 +120,7 @@ class StreamMessageTextField extends StatefulWidget { this.restorationId, this.scribbleEnabled = true, this.enableIMEPersonalizedLearning = true, + this.contentInsertionConfiguration, }) : assert(obscuringCharacter.length == 1, ''), smartDashesType = smartDashesType ?? (obscureText ? SmartDashesType.disabled : SmartDashesType.enabled), @@ -526,6 +527,9 @@ class StreamMessageTextField extends StatefulWidget { /// {@macro flutter.services.TextInputConfiguration.enableIMEPersonalizedLearning} final bool enableIMEPersonalizedLearning; + /// {@macro flutter.widgets.editableText.contentInsertionConfiguration} + final ContentInsertionConfiguration? contentInsertionConfiguration; + @override _StreamMessageTextFieldState createState() => _StreamMessageTextFieldState(); @@ -622,6 +626,9 @@ class StreamMessageTextField extends StatefulWidget { properties.add(DiagnosticsProperty( 'enableIMEPersonalizedLearning', enableIMEPersonalizedLearning, defaultValue: true)); + properties.add(DiagnosticsProperty( + 'contentInsertionConfiguration', contentInsertionConfiguration, + defaultValue: null)); } } @@ -727,6 +734,7 @@ class _StreamMessageTextFieldState extends State restorationId: widget.restorationId, scribbleEnabled: widget.scribbleEnabled, enableIMEPersonalizedLearning: widget.enableIMEPersonalizedLearning, + contentInsertionConfiguration: widget.contentInsertionConfiguration, ); @override diff --git a/packages/stream_chat_flutter/pubspec.yaml b/packages/stream_chat_flutter/pubspec.yaml index 5342f4ab..45f43a5f 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: 6.3.0 +version: 6.4.0 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -38,7 +38,7 @@ dependencies: rxdart: ^0.27.0 share_plus: ^6.3.0 shimmer: ^3.0.0 - stream_chat_flutter_core: ^6.3.0 + stream_chat_flutter_core: ^6.4.0 synchronized: ^3.0.0 thumblr: ^0.0.4 url_launcher: ^6.1.0 diff --git a/packages/stream_chat_flutter/test/scrollable_positioned_list/horizontal_scrollable_positioned_list_test.dart b/packages/stream_chat_flutter/test/scrollable_positioned_list/horizontal_scrollable_positioned_list_test.dart index 085abd22..6e851ada 100644 --- a/packages/stream_chat_flutter/test/scrollable_positioned_list/horizontal_scrollable_positioned_list_test.dart +++ b/packages/stream_chat_flutter/test/scrollable_positioned_list/horizontal_scrollable_positioned_list_test.dart @@ -2,9 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:pedantic/pedantic.dart'; import 'package:stream_chat_flutter/scrollable_positioned_list/scrollable_positioned_list.dart'; const screenHeight = 100.0; diff --git a/packages/stream_chat_flutter/test/scrollable_positioned_list/reversed_scrollable_positioned_list_test.dart b/packages/stream_chat_flutter/test/scrollable_positioned_list/reversed_scrollable_positioned_list_test.dart index 3888ac91..e2b16d8a 100644 --- a/packages/stream_chat_flutter/test/scrollable_positioned_list/reversed_scrollable_positioned_list_test.dart +++ b/packages/stream_chat_flutter/test/scrollable_positioned_list/reversed_scrollable_positioned_list_test.dart @@ -2,9 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:pedantic/pedantic.dart'; import 'package:stream_chat_flutter/scrollable_positioned_list/scrollable_positioned_list.dart'; const screenHeight = 400.0; diff --git a/packages/stream_chat_flutter/test/scrollable_positioned_list/scrollable_positioned_list_test.dart b/packages/stream_chat_flutter/test/scrollable_positioned_list/scrollable_positioned_list_test.dart index 0b44f7d8..665307b6 100644 --- a/packages/stream_chat_flutter/test/scrollable_positioned_list/scrollable_positioned_list_test.dart +++ b/packages/stream_chat_flutter/test/scrollable_positioned_list/scrollable_positioned_list_test.dart @@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:pedantic/pedantic.dart'; import 'package:stream_chat_flutter/scrollable_positioned_list/scrollable_positioned_list.dart'; import 'package:stream_chat_flutter/scrollable_positioned_list/src/scroll_view.dart'; diff --git a/packages/stream_chat_flutter/test/scrollable_positioned_list/separated_scrollable_positioned_list_test.dart b/packages/stream_chat_flutter/test/scrollable_positioned_list/separated_scrollable_positioned_list_test.dart index c1d00df0..d4d99595 100644 --- a/packages/stream_chat_flutter/test/scrollable_positioned_list/separated_scrollable_positioned_list_test.dart +++ b/packages/stream_chat_flutter/test/scrollable_positioned_list/separated_scrollable_positioned_list_test.dart @@ -2,9 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:pedantic/pedantic.dart'; import 'package:stream_chat_flutter/scrollable_positioned_list/scrollable_positioned_list.dart'; import 'package:stream_chat_flutter/scrollable_positioned_list/src/scroll_view.dart'; diff --git a/packages/stream_chat_flutter/test/scrollable_positioned_list/seperated_horizontal_scrollable_positioned_list_test.dart b/packages/stream_chat_flutter/test/scrollable_positioned_list/seperated_horizontal_scrollable_positioned_list_test.dart index c1276c10..88b0fae0 100644 --- a/packages/stream_chat_flutter/test/scrollable_positioned_list/seperated_horizontal_scrollable_positioned_list_test.dart +++ b/packages/stream_chat_flutter/test/scrollable_positioned_list/seperated_horizontal_scrollable_positioned_list_test.dart @@ -2,9 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:pedantic/pedantic.dart'; import 'package:stream_chat_flutter/scrollable_positioned_list/scrollable_positioned_list.dart'; const screenHeight = 400.0; diff --git a/packages/stream_chat_flutter/test/scrollable_positioned_list/shrink_wrap_scrollable_position_list_test.dart b/packages/stream_chat_flutter/test/scrollable_positioned_list/shrink_wrap_scrollable_position_list_test.dart index c324d217..37830e00 100644 --- a/packages/stream_chat_flutter/test/scrollable_positioned_list/shrink_wrap_scrollable_position_list_test.dart +++ b/packages/stream_chat_flutter/test/scrollable_positioned_list/shrink_wrap_scrollable_position_list_test.dart @@ -2,9 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:pedantic/pedantic.dart'; import 'package:stream_chat_flutter/scrollable_positioned_list/scrollable_positioned_list.dart'; const screenHeight = 400.0; diff --git a/packages/stream_chat_flutter_core/CHANGELOG.md b/packages/stream_chat_flutter_core/CHANGELOG.md index d694a731..dbab9611 100644 --- a/packages/stream_chat_flutter_core/CHANGELOG.md +++ b/packages/stream_chat_flutter_core/CHANGELOG.md @@ -1,3 +1,7 @@ +## 6.4.0 + +- Updated `stream_chat` dependency to [`6.4.0`](https://pub.dev/packages/stream_chat/changelog). + ## 6.3.0 - Updated `stream_chat` dependency to [`6.3.0`](https://pub.dev/packages/stream_chat/changelog). diff --git a/packages/stream_chat_flutter_core/pubspec.yaml b/packages/stream_chat_flutter_core/pubspec.yaml index bfd0d881..852b0afc 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: 6.3.0 +version: 6.4.0 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -17,7 +17,7 @@ dependencies: freezed_annotation: ^2.0.3 meta: ^1.8.0 rxdart: ^0.27.0 - stream_chat: ^6.3.0 + stream_chat: ^6.4.0 dev_dependencies: build_runner: ^2.3.3 diff --git a/packages/stream_chat_localizations/CHANGELOG.md b/packages/stream_chat_localizations/CHANGELOG.md index 50af8f39..628f82dc 100644 --- a/packages/stream_chat_localizations/CHANGELOG.md +++ b/packages/stream_chat_localizations/CHANGELOG.md @@ -1,3 +1,7 @@ +## 5.4.0 + +* Updated `stream_chat_flutter` dependency to [`6.4.0`](https://pub.dev/packages/stream_chat_flutter/changelog). + ## 5.3.0 * Updated `stream_chat_flutter` dependency to [`6.3.0`](https://pub.dev/packages/stream_chat_flutter/changelog). diff --git a/packages/stream_chat_localizations/pubspec.yaml b/packages/stream_chat_localizations/pubspec.yaml index f5bcdc19..ecd1ae78 100644 --- a/packages/stream_chat_localizations/pubspec.yaml +++ b/packages/stream_chat_localizations/pubspec.yaml @@ -1,6 +1,6 @@ name: stream_chat_localizations description: The Official localizations for Stream Chat Flutter, a service for building chat applications -version: 5.3.0 +version: 5.4.0 homepage: https://github.com/GetStream/stream-chat-flutter repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -14,7 +14,7 @@ dependencies: sdk: flutter flutter_localizations: sdk: flutter - stream_chat_flutter: ^6.3.0 + stream_chat_flutter: ^6.4.0 dev_dependencies: dart_code_metrics: ^5.7.2 diff --git a/packages/stream_chat_persistence/CHANGELOG.md b/packages/stream_chat_persistence/CHANGELOG.md index d2b3d075..152ed256 100644 --- a/packages/stream_chat_persistence/CHANGELOG.md +++ b/packages/stream_chat_persistence/CHANGELOG.md @@ -1,3 +1,7 @@ +## 6.4.0 + +- Updated `stream_chat` dependency to [`6.4.0`](https://pub.dev/packages/stream_chat/changelog). + ## 6.3.0 - Updated `stream_chat` dependency to [`6.3.0`](https://pub.dev/packages/stream_chat/changelog). 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 fa69fa0c..b21bd3cd 100644 --- a/packages/stream_chat_persistence/lib/src/dao/message_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/message_dao.dart @@ -5,7 +5,6 @@ import 'package:stream_chat/stream_chat.dart'; import 'package:stream_chat_persistence/src/db/drift_chat_database.dart'; import 'package:stream_chat_persistence/src/entity/messages.dart'; import 'package:stream_chat_persistence/src/entity/users.dart'; - import 'package:stream_chat_persistence/src/mapper/mapper.dart'; part 'message_dao.g.dart'; diff --git a/packages/stream_chat_persistence/lib/src/db/drift_chat_database.dart b/packages/stream_chat_persistence/lib/src/db/drift_chat_database.dart index 131a5768..f0b07095 100644 --- a/packages/stream_chat_persistence/lib/src/db/drift_chat_database.dart +++ b/packages/stream_chat_persistence/lib/src/db/drift_chat_database.dart @@ -49,7 +49,7 @@ class DriftChatDatabase extends _$DriftChatDatabase { // you should bump this number whenever you change or add a table definition. @override - int get schemaVersion => 11; + int get schemaVersion => 12; @override MigrationStrategy get migration => MigrationStrategy( diff --git a/packages/stream_chat_persistence/lib/src/db/drift_chat_database.g.dart b/packages/stream_chat_persistence/lib/src/db/drift_chat_database.g.dart index 0dcd0107..04572675 100644 --- a/packages/stream_chat_persistence/lib/src/db/drift_chat_database.g.dart +++ b/packages/stream_chat_persistence/lib/src/db/drift_chat_database.g.dart @@ -227,13 +227,13 @@ class $ChannelsTable extends Channels } static TypeConverter, String> $converterownCapabilities = - ListConverter(); + ListConverter(); static TypeConverter?, String?> $converterownCapabilitiesn = NullAwareTypeConverter.wrap($converterownCapabilities); static TypeConverter, String> $converterconfig = MapConverter(); static TypeConverter, String> $converterextraData = - MapConverter(); + MapConverter(); static TypeConverter?, String?> $converterextraDatan = NullAwareTypeConverter.wrap($converterextraData); } @@ -757,28 +757,42 @@ class $MessagesTable extends Messages late final GeneratedColumn command = GeneratedColumn( 'command', aliasedName, true, type: DriftSqlType.string, requiredDuringInsert: false); - static const VerificationMeta _createdAtMeta = - const VerificationMeta('createdAt'); + static const VerificationMeta _localCreatedAtMeta = + const VerificationMeta('localCreatedAt'); @override - late final GeneratedColumn createdAt = GeneratedColumn( - 'created_at', aliasedName, false, - type: DriftSqlType.dateTime, - requiredDuringInsert: false, - defaultValue: currentDateAndTime); - static const VerificationMeta _updatedAtMeta = - const VerificationMeta('updatedAt'); + late final GeneratedColumn localCreatedAt = + GeneratedColumn('local_created_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + static const VerificationMeta _remoteCreatedAtMeta = + const VerificationMeta('remoteCreatedAt'); @override - late final GeneratedColumn updatedAt = GeneratedColumn( - 'updated_at', aliasedName, false, - type: DriftSqlType.dateTime, - requiredDuringInsert: false, - defaultValue: currentDateAndTime); - static const VerificationMeta _deletedAtMeta = - const VerificationMeta('deletedAt'); + late final GeneratedColumn remoteCreatedAt = + GeneratedColumn('remote_created_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + static const VerificationMeta _localUpdatedAtMeta = + const VerificationMeta('localUpdatedAt'); @override - late final GeneratedColumn deletedAt = GeneratedColumn( - 'deleted_at', aliasedName, true, - type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn localUpdatedAt = + GeneratedColumn('local_updated_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + static const VerificationMeta _remoteUpdatedAtMeta = + const VerificationMeta('remoteUpdatedAt'); + @override + late final GeneratedColumn remoteUpdatedAt = + GeneratedColumn('remote_updated_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + static const VerificationMeta _localDeletedAtMeta = + const VerificationMeta('localDeletedAt'); + @override + late final GeneratedColumn localDeletedAt = + GeneratedColumn('local_deleted_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + static const VerificationMeta _remoteDeletedAtMeta = + const VerificationMeta('remoteDeletedAt'); + @override + late final GeneratedColumn remoteDeletedAt = + GeneratedColumn('remote_deleted_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); static const VerificationMeta _userIdMeta = const VerificationMeta('userId'); @override late final GeneratedColumn userId = GeneratedColumn( @@ -853,9 +867,12 @@ class $MessagesTable extends Messages showInChannel, shadowed, command, - createdAt, - updatedAt, - deletedAt, + localCreatedAt, + remoteCreatedAt, + localUpdatedAt, + remoteUpdatedAt, + localDeletedAt, + remoteDeletedAt, userId, pinned, pinnedAt, @@ -924,17 +941,41 @@ class $MessagesTable extends Messages context.handle(_commandMeta, command.isAcceptableOrUnknown(data['command']!, _commandMeta)); } - if (data.containsKey('created_at')) { - context.handle(_createdAtMeta, - createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta)); + if (data.containsKey('local_created_at')) { + context.handle( + _localCreatedAtMeta, + localCreatedAt.isAcceptableOrUnknown( + data['local_created_at']!, _localCreatedAtMeta)); } - if (data.containsKey('updated_at')) { - context.handle(_updatedAtMeta, - updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta)); + if (data.containsKey('remote_created_at')) { + context.handle( + _remoteCreatedAtMeta, + remoteCreatedAt.isAcceptableOrUnknown( + data['remote_created_at']!, _remoteCreatedAtMeta)); } - if (data.containsKey('deleted_at')) { - context.handle(_deletedAtMeta, - deletedAt.isAcceptableOrUnknown(data['deleted_at']!, _deletedAtMeta)); + if (data.containsKey('local_updated_at')) { + context.handle( + _localUpdatedAtMeta, + localUpdatedAt.isAcceptableOrUnknown( + data['local_updated_at']!, _localUpdatedAtMeta)); + } + if (data.containsKey('remote_updated_at')) { + context.handle( + _remoteUpdatedAtMeta, + remoteUpdatedAt.isAcceptableOrUnknown( + data['remote_updated_at']!, _remoteUpdatedAtMeta)); + } + if (data.containsKey('local_deleted_at')) { + context.handle( + _localDeletedAtMeta, + localDeletedAt.isAcceptableOrUnknown( + data['local_deleted_at']!, _localDeletedAtMeta)); + } + if (data.containsKey('remote_deleted_at')) { + context.handle( + _remoteDeletedAtMeta, + remoteDeletedAt.isAcceptableOrUnknown( + data['remote_deleted_at']!, _remoteDeletedAtMeta)); } if (data.containsKey('user_id')) { context.handle(_userIdMeta, @@ -1012,12 +1053,18 @@ class $MessagesTable extends Messages .read(DriftSqlType.bool, data['${effectivePrefix}shadowed'])!, command: attachedDatabase.typeMapping .read(DriftSqlType.string, data['${effectivePrefix}command']), - createdAt: attachedDatabase.typeMapping - .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, - updatedAt: attachedDatabase.typeMapping - .read(DriftSqlType.dateTime, data['${effectivePrefix}updated_at'])!, - deletedAt: attachedDatabase.typeMapping - .read(DriftSqlType.dateTime, data['${effectivePrefix}deleted_at']), + localCreatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}local_created_at']), + remoteCreatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}remote_created_at']), + localUpdatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}local_updated_at']), + remoteUpdatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}remote_updated_at']), + localDeletedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}local_deleted_at']), + remoteDeletedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}remote_deleted_at']), userId: attachedDatabase.typeMapping .read(DriftSqlType.string, data['${effectivePrefix}user_id']), pinned: attachedDatabase.typeMapping @@ -1044,23 +1091,23 @@ class $MessagesTable extends Messages } static TypeConverter, String> $converterattachments = - ListConverter(); + ListConverter(); static TypeConverter $converterstatus = MessageSendingStatusConverter(); static TypeConverter, String> $convertermentionedUsers = - ListConverter(); + ListConverter(); static TypeConverter, String> $converterreactionCounts = - MapConverter(); + MapConverter(); static TypeConverter?, String?> $converterreactionCountsn = NullAwareTypeConverter.wrap($converterreactionCounts); static TypeConverter, String> $converterreactionScores = - MapConverter(); + MapConverter(); static TypeConverter?, String?> $converterreactionScoresn = NullAwareTypeConverter.wrap($converterreactionScores); static TypeConverter?, String?> $converteri18n = - NullableMapConverter(); + NullableMapConverter(); static TypeConverter, String> $converterextraData = - MapConverter(); + MapConverter(); static TypeConverter?, String?> $converterextraDatan = NullAwareTypeConverter.wrap($converterextraData); } @@ -1109,14 +1156,23 @@ class MessageEntity extends DataClass implements Insertable { /// A used command name. final String? command; - /// The DateTime when the message was created. - final DateTime createdAt; + /// The DateTime on which the message was created on the client. + final DateTime? localCreatedAt; - /// The DateTime when the message was updated last time. - final DateTime updatedAt; + /// The DateTime on which the message was created on the server. + final DateTime? remoteCreatedAt; - /// The DateTime when the message was deleted. - final DateTime? deletedAt; + /// The DateTime on which the message was updated on the client. + final DateTime? localUpdatedAt; + + /// The DateTime on which the message was updated on the server. + final DateTime? remoteUpdatedAt; + + /// The DateTime on which the message was deleted on the client. + final DateTime? localDeletedAt; + + /// The DateTime on which the message was deleted on the server. + final DateTime? remoteDeletedAt; /// Id of the User who sent the message final String? userId; @@ -1156,9 +1212,12 @@ class MessageEntity extends DataClass implements Insertable { this.showInChannel, required this.shadowed, this.command, - required this.createdAt, - required this.updatedAt, - this.deletedAt, + this.localCreatedAt, + this.remoteCreatedAt, + this.localUpdatedAt, + this.remoteUpdatedAt, + this.localDeletedAt, + this.remoteDeletedAt, this.userId, required this.pinned, this.pinnedAt, @@ -1214,10 +1273,23 @@ class MessageEntity extends DataClass implements Insertable { if (!nullToAbsent || command != null) { map['command'] = Variable(command); } - map['created_at'] = Variable(createdAt); - map['updated_at'] = Variable(updatedAt); - if (!nullToAbsent || deletedAt != null) { - map['deleted_at'] = Variable(deletedAt); + if (!nullToAbsent || localCreatedAt != null) { + map['local_created_at'] = Variable(localCreatedAt); + } + if (!nullToAbsent || remoteCreatedAt != null) { + map['remote_created_at'] = Variable(remoteCreatedAt); + } + if (!nullToAbsent || localUpdatedAt != null) { + map['local_updated_at'] = Variable(localUpdatedAt); + } + if (!nullToAbsent || remoteUpdatedAt != null) { + map['remote_updated_at'] = Variable(remoteUpdatedAt); + } + if (!nullToAbsent || localDeletedAt != null) { + map['local_deleted_at'] = Variable(localDeletedAt); + } + if (!nullToAbsent || remoteDeletedAt != null) { + map['remote_deleted_at'] = Variable(remoteDeletedAt); } if (!nullToAbsent || userId != null) { map['user_id'] = Variable(userId); @@ -1264,9 +1336,12 @@ class MessageEntity extends DataClass implements Insertable { showInChannel: serializer.fromJson(json['showInChannel']), shadowed: serializer.fromJson(json['shadowed']), command: serializer.fromJson(json['command']), - createdAt: serializer.fromJson(json['createdAt']), - updatedAt: serializer.fromJson(json['updatedAt']), - deletedAt: serializer.fromJson(json['deletedAt']), + localCreatedAt: serializer.fromJson(json['localCreatedAt']), + remoteCreatedAt: serializer.fromJson(json['remoteCreatedAt']), + localUpdatedAt: serializer.fromJson(json['localUpdatedAt']), + remoteUpdatedAt: serializer.fromJson(json['remoteUpdatedAt']), + localDeletedAt: serializer.fromJson(json['localDeletedAt']), + remoteDeletedAt: serializer.fromJson(json['remoteDeletedAt']), userId: serializer.fromJson(json['userId']), pinned: serializer.fromJson(json['pinned']), pinnedAt: serializer.fromJson(json['pinnedAt']), @@ -1295,9 +1370,12 @@ class MessageEntity extends DataClass implements Insertable { 'showInChannel': serializer.toJson(showInChannel), 'shadowed': serializer.toJson(shadowed), 'command': serializer.toJson(command), - 'createdAt': serializer.toJson(createdAt), - 'updatedAt': serializer.toJson(updatedAt), - 'deletedAt': serializer.toJson(deletedAt), + 'localCreatedAt': serializer.toJson(localCreatedAt), + 'remoteCreatedAt': serializer.toJson(remoteCreatedAt), + 'localUpdatedAt': serializer.toJson(localUpdatedAt), + 'remoteUpdatedAt': serializer.toJson(remoteUpdatedAt), + 'localDeletedAt': serializer.toJson(localDeletedAt), + 'remoteDeletedAt': serializer.toJson(remoteDeletedAt), 'userId': serializer.toJson(userId), 'pinned': serializer.toJson(pinned), 'pinnedAt': serializer.toJson(pinnedAt), @@ -1324,9 +1402,12 @@ class MessageEntity extends DataClass implements Insertable { Value showInChannel = const Value.absent(), bool? shadowed, Value command = const Value.absent(), - DateTime? createdAt, - DateTime? updatedAt, - Value deletedAt = const Value.absent(), + Value localCreatedAt = const Value.absent(), + Value remoteCreatedAt = const Value.absent(), + Value localUpdatedAt = const Value.absent(), + Value remoteUpdatedAt = const Value.absent(), + Value localDeletedAt = const Value.absent(), + Value remoteDeletedAt = const Value.absent(), Value userId = const Value.absent(), bool? pinned, Value pinnedAt = const Value.absent(), @@ -1355,9 +1436,21 @@ class MessageEntity extends DataClass implements Insertable { showInChannel.present ? showInChannel.value : this.showInChannel, shadowed: shadowed ?? this.shadowed, command: command.present ? command.value : this.command, - createdAt: createdAt ?? this.createdAt, - updatedAt: updatedAt ?? this.updatedAt, - deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + localCreatedAt: + localCreatedAt.present ? localCreatedAt.value : this.localCreatedAt, + remoteCreatedAt: remoteCreatedAt.present + ? remoteCreatedAt.value + : this.remoteCreatedAt, + localUpdatedAt: + localUpdatedAt.present ? localUpdatedAt.value : this.localUpdatedAt, + remoteUpdatedAt: remoteUpdatedAt.present + ? remoteUpdatedAt.value + : this.remoteUpdatedAt, + localDeletedAt: + localDeletedAt.present ? localDeletedAt.value : this.localDeletedAt, + remoteDeletedAt: remoteDeletedAt.present + ? remoteDeletedAt.value + : this.remoteDeletedAt, userId: userId.present ? userId.value : this.userId, pinned: pinned ?? this.pinned, pinnedAt: pinnedAt.present ? pinnedAt.value : this.pinnedAt, @@ -1385,9 +1478,12 @@ class MessageEntity extends DataClass implements Insertable { ..write('showInChannel: $showInChannel, ') ..write('shadowed: $shadowed, ') ..write('command: $command, ') - ..write('createdAt: $createdAt, ') - ..write('updatedAt: $updatedAt, ') - ..write('deletedAt: $deletedAt, ') + ..write('localCreatedAt: $localCreatedAt, ') + ..write('remoteCreatedAt: $remoteCreatedAt, ') + ..write('localUpdatedAt: $localUpdatedAt, ') + ..write('remoteUpdatedAt: $remoteUpdatedAt, ') + ..write('localDeletedAt: $localDeletedAt, ') + ..write('remoteDeletedAt: $remoteDeletedAt, ') ..write('userId: $userId, ') ..write('pinned: $pinned, ') ..write('pinnedAt: $pinnedAt, ') @@ -1416,9 +1512,12 @@ class MessageEntity extends DataClass implements Insertable { showInChannel, shadowed, command, - createdAt, - updatedAt, - deletedAt, + localCreatedAt, + remoteCreatedAt, + localUpdatedAt, + remoteUpdatedAt, + localDeletedAt, + remoteDeletedAt, userId, pinned, pinnedAt, @@ -1446,9 +1545,12 @@ class MessageEntity extends DataClass implements Insertable { other.showInChannel == this.showInChannel && other.shadowed == this.shadowed && other.command == this.command && - other.createdAt == this.createdAt && - other.updatedAt == this.updatedAt && - other.deletedAt == this.deletedAt && + other.localCreatedAt == this.localCreatedAt && + other.remoteCreatedAt == this.remoteCreatedAt && + other.localUpdatedAt == this.localUpdatedAt && + other.remoteUpdatedAt == this.remoteUpdatedAt && + other.localDeletedAt == this.localDeletedAt && + other.remoteDeletedAt == this.remoteDeletedAt && other.userId == this.userId && other.pinned == this.pinned && other.pinnedAt == this.pinnedAt && @@ -1474,9 +1576,12 @@ class MessagesCompanion extends UpdateCompanion { final Value showInChannel; final Value shadowed; final Value command; - final Value createdAt; - final Value updatedAt; - final Value deletedAt; + final Value localCreatedAt; + final Value remoteCreatedAt; + final Value localUpdatedAt; + final Value remoteUpdatedAt; + final Value localDeletedAt; + final Value remoteDeletedAt; final Value userId; final Value pinned; final Value pinnedAt; @@ -1501,9 +1606,12 @@ class MessagesCompanion extends UpdateCompanion { this.showInChannel = const Value.absent(), this.shadowed = const Value.absent(), this.command = const Value.absent(), - this.createdAt = const Value.absent(), - this.updatedAt = const Value.absent(), - this.deletedAt = const Value.absent(), + this.localCreatedAt = const Value.absent(), + this.remoteCreatedAt = const Value.absent(), + this.localUpdatedAt = const Value.absent(), + this.remoteUpdatedAt = const Value.absent(), + this.localDeletedAt = const Value.absent(), + this.remoteDeletedAt = const Value.absent(), this.userId = const Value.absent(), this.pinned = const Value.absent(), this.pinnedAt = const Value.absent(), @@ -1529,9 +1637,12 @@ class MessagesCompanion extends UpdateCompanion { this.showInChannel = const Value.absent(), this.shadowed = const Value.absent(), this.command = const Value.absent(), - this.createdAt = const Value.absent(), - this.updatedAt = const Value.absent(), - this.deletedAt = const Value.absent(), + this.localCreatedAt = const Value.absent(), + this.remoteCreatedAt = const Value.absent(), + this.localUpdatedAt = const Value.absent(), + this.remoteUpdatedAt = const Value.absent(), + this.localDeletedAt = const Value.absent(), + this.remoteDeletedAt = const Value.absent(), this.userId = const Value.absent(), this.pinned = const Value.absent(), this.pinnedAt = const Value.absent(), @@ -1560,9 +1671,12 @@ class MessagesCompanion extends UpdateCompanion { Expression? showInChannel, Expression? shadowed, Expression? command, - Expression? createdAt, - Expression? updatedAt, - Expression? deletedAt, + Expression? localCreatedAt, + Expression? remoteCreatedAt, + Expression? localUpdatedAt, + Expression? remoteUpdatedAt, + Expression? localDeletedAt, + Expression? remoteDeletedAt, Expression? userId, Expression? pinned, Expression? pinnedAt, @@ -1588,9 +1702,12 @@ class MessagesCompanion extends UpdateCompanion { if (showInChannel != null) 'show_in_channel': showInChannel, if (shadowed != null) 'shadowed': shadowed, if (command != null) 'command': command, - if (createdAt != null) 'created_at': createdAt, - if (updatedAt != null) 'updated_at': updatedAt, - if (deletedAt != null) 'deleted_at': deletedAt, + if (localCreatedAt != null) 'local_created_at': localCreatedAt, + if (remoteCreatedAt != null) 'remote_created_at': remoteCreatedAt, + if (localUpdatedAt != null) 'local_updated_at': localUpdatedAt, + if (remoteUpdatedAt != null) 'remote_updated_at': remoteUpdatedAt, + if (localDeletedAt != null) 'local_deleted_at': localDeletedAt, + if (remoteDeletedAt != null) 'remote_deleted_at': remoteDeletedAt, if (userId != null) 'user_id': userId, if (pinned != null) 'pinned': pinned, if (pinnedAt != null) 'pinned_at': pinnedAt, @@ -1618,9 +1735,12 @@ class MessagesCompanion extends UpdateCompanion { Value? showInChannel, Value? shadowed, Value? command, - Value? createdAt, - Value? updatedAt, - Value? deletedAt, + Value? localCreatedAt, + Value? remoteCreatedAt, + Value? localUpdatedAt, + Value? remoteUpdatedAt, + Value? localDeletedAt, + Value? remoteDeletedAt, Value? userId, Value? pinned, Value? pinnedAt, @@ -1645,9 +1765,12 @@ class MessagesCompanion extends UpdateCompanion { showInChannel: showInChannel ?? this.showInChannel, shadowed: shadowed ?? this.shadowed, command: command ?? this.command, - createdAt: createdAt ?? this.createdAt, - updatedAt: updatedAt ?? this.updatedAt, - deletedAt: deletedAt ?? this.deletedAt, + localCreatedAt: localCreatedAt ?? this.localCreatedAt, + remoteCreatedAt: remoteCreatedAt ?? this.remoteCreatedAt, + localUpdatedAt: localUpdatedAt ?? this.localUpdatedAt, + remoteUpdatedAt: remoteUpdatedAt ?? this.remoteUpdatedAt, + localDeletedAt: localDeletedAt ?? this.localDeletedAt, + remoteDeletedAt: remoteDeletedAt ?? this.remoteDeletedAt, userId: userId ?? this.userId, pinned: pinned ?? this.pinned, pinnedAt: pinnedAt ?? this.pinnedAt, @@ -1713,14 +1836,23 @@ class MessagesCompanion extends UpdateCompanion { if (command.present) { map['command'] = Variable(command.value); } - if (createdAt.present) { - map['created_at'] = Variable(createdAt.value); + if (localCreatedAt.present) { + map['local_created_at'] = Variable(localCreatedAt.value); } - if (updatedAt.present) { - map['updated_at'] = Variable(updatedAt.value); + if (remoteCreatedAt.present) { + map['remote_created_at'] = Variable(remoteCreatedAt.value); } - if (deletedAt.present) { - map['deleted_at'] = Variable(deletedAt.value); + if (localUpdatedAt.present) { + map['local_updated_at'] = Variable(localUpdatedAt.value); + } + if (remoteUpdatedAt.present) { + map['remote_updated_at'] = Variable(remoteUpdatedAt.value); + } + if (localDeletedAt.present) { + map['local_deleted_at'] = Variable(localDeletedAt.value); + } + if (remoteDeletedAt.present) { + map['remote_deleted_at'] = Variable(remoteDeletedAt.value); } if (userId.present) { map['user_id'] = Variable(userId.value); @@ -1771,9 +1903,12 @@ class MessagesCompanion extends UpdateCompanion { ..write('showInChannel: $showInChannel, ') ..write('shadowed: $shadowed, ') ..write('command: $command, ') - ..write('createdAt: $createdAt, ') - ..write('updatedAt: $updatedAt, ') - ..write('deletedAt: $deletedAt, ') + ..write('localCreatedAt: $localCreatedAt, ') + ..write('remoteCreatedAt: $remoteCreatedAt, ') + ..write('localUpdatedAt: $localUpdatedAt, ') + ..write('remoteUpdatedAt: $remoteUpdatedAt, ') + ..write('localDeletedAt: $localDeletedAt, ') + ..write('remoteDeletedAt: $remoteDeletedAt, ') ..write('userId: $userId, ') ..write('pinned: $pinned, ') ..write('pinnedAt: $pinnedAt, ') @@ -1905,28 +2040,42 @@ class $PinnedMessagesTable extends PinnedMessages late final GeneratedColumn command = GeneratedColumn( 'command', aliasedName, true, type: DriftSqlType.string, requiredDuringInsert: false); - static const VerificationMeta _createdAtMeta = - const VerificationMeta('createdAt'); + static const VerificationMeta _localCreatedAtMeta = + const VerificationMeta('localCreatedAt'); @override - late final GeneratedColumn createdAt = GeneratedColumn( - 'created_at', aliasedName, false, - type: DriftSqlType.dateTime, - requiredDuringInsert: false, - defaultValue: currentDateAndTime); - static const VerificationMeta _updatedAtMeta = - const VerificationMeta('updatedAt'); + late final GeneratedColumn localCreatedAt = + GeneratedColumn('local_created_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + static const VerificationMeta _remoteCreatedAtMeta = + const VerificationMeta('remoteCreatedAt'); @override - late final GeneratedColumn updatedAt = GeneratedColumn( - 'updated_at', aliasedName, false, - type: DriftSqlType.dateTime, - requiredDuringInsert: false, - defaultValue: currentDateAndTime); - static const VerificationMeta _deletedAtMeta = - const VerificationMeta('deletedAt'); + late final GeneratedColumn remoteCreatedAt = + GeneratedColumn('remote_created_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + static const VerificationMeta _localUpdatedAtMeta = + const VerificationMeta('localUpdatedAt'); @override - late final GeneratedColumn deletedAt = GeneratedColumn( - 'deleted_at', aliasedName, true, - type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn localUpdatedAt = + GeneratedColumn('local_updated_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + static const VerificationMeta _remoteUpdatedAtMeta = + const VerificationMeta('remoteUpdatedAt'); + @override + late final GeneratedColumn remoteUpdatedAt = + GeneratedColumn('remote_updated_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + static const VerificationMeta _localDeletedAtMeta = + const VerificationMeta('localDeletedAt'); + @override + late final GeneratedColumn localDeletedAt = + GeneratedColumn('local_deleted_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + static const VerificationMeta _remoteDeletedAtMeta = + const VerificationMeta('remoteDeletedAt'); + @override + late final GeneratedColumn remoteDeletedAt = + GeneratedColumn('remote_deleted_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); static const VerificationMeta _userIdMeta = const VerificationMeta('userId'); @override late final GeneratedColumn userId = GeneratedColumn( @@ -2002,9 +2151,12 @@ class $PinnedMessagesTable extends PinnedMessages showInChannel, shadowed, command, - createdAt, - updatedAt, - deletedAt, + localCreatedAt, + remoteCreatedAt, + localUpdatedAt, + remoteUpdatedAt, + localDeletedAt, + remoteDeletedAt, userId, pinned, pinnedAt, @@ -2074,17 +2226,41 @@ class $PinnedMessagesTable extends PinnedMessages context.handle(_commandMeta, command.isAcceptableOrUnknown(data['command']!, _commandMeta)); } - if (data.containsKey('created_at')) { - context.handle(_createdAtMeta, - createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta)); + if (data.containsKey('local_created_at')) { + context.handle( + _localCreatedAtMeta, + localCreatedAt.isAcceptableOrUnknown( + data['local_created_at']!, _localCreatedAtMeta)); } - if (data.containsKey('updated_at')) { - context.handle(_updatedAtMeta, - updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta)); + if (data.containsKey('remote_created_at')) { + context.handle( + _remoteCreatedAtMeta, + remoteCreatedAt.isAcceptableOrUnknown( + data['remote_created_at']!, _remoteCreatedAtMeta)); } - if (data.containsKey('deleted_at')) { - context.handle(_deletedAtMeta, - deletedAt.isAcceptableOrUnknown(data['deleted_at']!, _deletedAtMeta)); + if (data.containsKey('local_updated_at')) { + context.handle( + _localUpdatedAtMeta, + localUpdatedAt.isAcceptableOrUnknown( + data['local_updated_at']!, _localUpdatedAtMeta)); + } + if (data.containsKey('remote_updated_at')) { + context.handle( + _remoteUpdatedAtMeta, + remoteUpdatedAt.isAcceptableOrUnknown( + data['remote_updated_at']!, _remoteUpdatedAtMeta)); + } + if (data.containsKey('local_deleted_at')) { + context.handle( + _localDeletedAtMeta, + localDeletedAt.isAcceptableOrUnknown( + data['local_deleted_at']!, _localDeletedAtMeta)); + } + if (data.containsKey('remote_deleted_at')) { + context.handle( + _remoteDeletedAtMeta, + remoteDeletedAt.isAcceptableOrUnknown( + data['remote_deleted_at']!, _remoteDeletedAtMeta)); } if (data.containsKey('user_id')) { context.handle(_userIdMeta, @@ -2162,12 +2338,18 @@ class $PinnedMessagesTable extends PinnedMessages .read(DriftSqlType.bool, data['${effectivePrefix}shadowed'])!, command: attachedDatabase.typeMapping .read(DriftSqlType.string, data['${effectivePrefix}command']), - createdAt: attachedDatabase.typeMapping - .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, - updatedAt: attachedDatabase.typeMapping - .read(DriftSqlType.dateTime, data['${effectivePrefix}updated_at'])!, - deletedAt: attachedDatabase.typeMapping - .read(DriftSqlType.dateTime, data['${effectivePrefix}deleted_at']), + localCreatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}local_created_at']), + remoteCreatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}remote_created_at']), + localUpdatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}local_updated_at']), + remoteUpdatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}remote_updated_at']), + localDeletedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}local_deleted_at']), + remoteDeletedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}remote_deleted_at']), userId: attachedDatabase.typeMapping .read(DriftSqlType.string, data['${effectivePrefix}user_id']), pinned: attachedDatabase.typeMapping @@ -2195,23 +2377,23 @@ class $PinnedMessagesTable extends PinnedMessages } static TypeConverter, String> $converterattachments = - ListConverter(); + ListConverter(); static TypeConverter $converterstatus = MessageSendingStatusConverter(); static TypeConverter, String> $convertermentionedUsers = - ListConverter(); + ListConverter(); static TypeConverter, String> $converterreactionCounts = - MapConverter(); + MapConverter(); static TypeConverter?, String?> $converterreactionCountsn = NullAwareTypeConverter.wrap($converterreactionCounts); static TypeConverter, String> $converterreactionScores = - MapConverter(); + MapConverter(); static TypeConverter?, String?> $converterreactionScoresn = NullAwareTypeConverter.wrap($converterreactionScores); static TypeConverter?, String?> $converteri18n = - NullableMapConverter(); + NullableMapConverter(); static TypeConverter, String> $converterextraData = - MapConverter(); + MapConverter(); static TypeConverter?, String?> $converterextraDatan = NullAwareTypeConverter.wrap($converterextraData); } @@ -2261,14 +2443,23 @@ class PinnedMessageEntity extends DataClass /// A used command name. final String? command; - /// The DateTime when the message was created. - final DateTime createdAt; + /// The DateTime on which the message was created on the client. + final DateTime? localCreatedAt; - /// The DateTime when the message was updated last time. - final DateTime updatedAt; + /// The DateTime on which the message was created on the server. + final DateTime? remoteCreatedAt; - /// The DateTime when the message was deleted. - final DateTime? deletedAt; + /// The DateTime on which the message was updated on the client. + final DateTime? localUpdatedAt; + + /// The DateTime on which the message was updated on the server. + final DateTime? remoteUpdatedAt; + + /// The DateTime on which the message was deleted on the client. + final DateTime? localDeletedAt; + + /// The DateTime on which the message was deleted on the server. + final DateTime? remoteDeletedAt; /// Id of the User who sent the message final String? userId; @@ -2308,9 +2499,12 @@ class PinnedMessageEntity extends DataClass this.showInChannel, required this.shadowed, this.command, - required this.createdAt, - required this.updatedAt, - this.deletedAt, + this.localCreatedAt, + this.remoteCreatedAt, + this.localUpdatedAt, + this.remoteUpdatedAt, + this.localDeletedAt, + this.remoteDeletedAt, this.userId, required this.pinned, this.pinnedAt, @@ -2366,10 +2560,23 @@ class PinnedMessageEntity extends DataClass if (!nullToAbsent || command != null) { map['command'] = Variable(command); } - map['created_at'] = Variable(createdAt); - map['updated_at'] = Variable(updatedAt); - if (!nullToAbsent || deletedAt != null) { - map['deleted_at'] = Variable(deletedAt); + if (!nullToAbsent || localCreatedAt != null) { + map['local_created_at'] = Variable(localCreatedAt); + } + if (!nullToAbsent || remoteCreatedAt != null) { + map['remote_created_at'] = Variable(remoteCreatedAt); + } + if (!nullToAbsent || localUpdatedAt != null) { + map['local_updated_at'] = Variable(localUpdatedAt); + } + if (!nullToAbsent || remoteUpdatedAt != null) { + map['remote_updated_at'] = Variable(remoteUpdatedAt); + } + if (!nullToAbsent || localDeletedAt != null) { + map['local_deleted_at'] = Variable(localDeletedAt); + } + if (!nullToAbsent || remoteDeletedAt != null) { + map['remote_deleted_at'] = Variable(remoteDeletedAt); } if (!nullToAbsent || userId != null) { map['user_id'] = Variable(userId); @@ -2416,9 +2623,12 @@ class PinnedMessageEntity extends DataClass showInChannel: serializer.fromJson(json['showInChannel']), shadowed: serializer.fromJson(json['shadowed']), command: serializer.fromJson(json['command']), - createdAt: serializer.fromJson(json['createdAt']), - updatedAt: serializer.fromJson(json['updatedAt']), - deletedAt: serializer.fromJson(json['deletedAt']), + localCreatedAt: serializer.fromJson(json['localCreatedAt']), + remoteCreatedAt: serializer.fromJson(json['remoteCreatedAt']), + localUpdatedAt: serializer.fromJson(json['localUpdatedAt']), + remoteUpdatedAt: serializer.fromJson(json['remoteUpdatedAt']), + localDeletedAt: serializer.fromJson(json['localDeletedAt']), + remoteDeletedAt: serializer.fromJson(json['remoteDeletedAt']), userId: serializer.fromJson(json['userId']), pinned: serializer.fromJson(json['pinned']), pinnedAt: serializer.fromJson(json['pinnedAt']), @@ -2447,9 +2657,12 @@ class PinnedMessageEntity extends DataClass 'showInChannel': serializer.toJson(showInChannel), 'shadowed': serializer.toJson(shadowed), 'command': serializer.toJson(command), - 'createdAt': serializer.toJson(createdAt), - 'updatedAt': serializer.toJson(updatedAt), - 'deletedAt': serializer.toJson(deletedAt), + 'localCreatedAt': serializer.toJson(localCreatedAt), + 'remoteCreatedAt': serializer.toJson(remoteCreatedAt), + 'localUpdatedAt': serializer.toJson(localUpdatedAt), + 'remoteUpdatedAt': serializer.toJson(remoteUpdatedAt), + 'localDeletedAt': serializer.toJson(localDeletedAt), + 'remoteDeletedAt': serializer.toJson(remoteDeletedAt), 'userId': serializer.toJson(userId), 'pinned': serializer.toJson(pinned), 'pinnedAt': serializer.toJson(pinnedAt), @@ -2476,9 +2689,12 @@ class PinnedMessageEntity extends DataClass Value showInChannel = const Value.absent(), bool? shadowed, Value command = const Value.absent(), - DateTime? createdAt, - DateTime? updatedAt, - Value deletedAt = const Value.absent(), + Value localCreatedAt = const Value.absent(), + Value remoteCreatedAt = const Value.absent(), + Value localUpdatedAt = const Value.absent(), + Value remoteUpdatedAt = const Value.absent(), + Value localDeletedAt = const Value.absent(), + Value remoteDeletedAt = const Value.absent(), Value userId = const Value.absent(), bool? pinned, Value pinnedAt = const Value.absent(), @@ -2507,9 +2723,21 @@ class PinnedMessageEntity extends DataClass showInChannel.present ? showInChannel.value : this.showInChannel, shadowed: shadowed ?? this.shadowed, command: command.present ? command.value : this.command, - createdAt: createdAt ?? this.createdAt, - updatedAt: updatedAt ?? this.updatedAt, - deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + localCreatedAt: + localCreatedAt.present ? localCreatedAt.value : this.localCreatedAt, + remoteCreatedAt: remoteCreatedAt.present + ? remoteCreatedAt.value + : this.remoteCreatedAt, + localUpdatedAt: + localUpdatedAt.present ? localUpdatedAt.value : this.localUpdatedAt, + remoteUpdatedAt: remoteUpdatedAt.present + ? remoteUpdatedAt.value + : this.remoteUpdatedAt, + localDeletedAt: + localDeletedAt.present ? localDeletedAt.value : this.localDeletedAt, + remoteDeletedAt: remoteDeletedAt.present + ? remoteDeletedAt.value + : this.remoteDeletedAt, userId: userId.present ? userId.value : this.userId, pinned: pinned ?? this.pinned, pinnedAt: pinnedAt.present ? pinnedAt.value : this.pinnedAt, @@ -2537,9 +2765,12 @@ class PinnedMessageEntity extends DataClass ..write('showInChannel: $showInChannel, ') ..write('shadowed: $shadowed, ') ..write('command: $command, ') - ..write('createdAt: $createdAt, ') - ..write('updatedAt: $updatedAt, ') - ..write('deletedAt: $deletedAt, ') + ..write('localCreatedAt: $localCreatedAt, ') + ..write('remoteCreatedAt: $remoteCreatedAt, ') + ..write('localUpdatedAt: $localUpdatedAt, ') + ..write('remoteUpdatedAt: $remoteUpdatedAt, ') + ..write('localDeletedAt: $localDeletedAt, ') + ..write('remoteDeletedAt: $remoteDeletedAt, ') ..write('userId: $userId, ') ..write('pinned: $pinned, ') ..write('pinnedAt: $pinnedAt, ') @@ -2568,9 +2799,12 @@ class PinnedMessageEntity extends DataClass showInChannel, shadowed, command, - createdAt, - updatedAt, - deletedAt, + localCreatedAt, + remoteCreatedAt, + localUpdatedAt, + remoteUpdatedAt, + localDeletedAt, + remoteDeletedAt, userId, pinned, pinnedAt, @@ -2598,9 +2832,12 @@ class PinnedMessageEntity extends DataClass other.showInChannel == this.showInChannel && other.shadowed == this.shadowed && other.command == this.command && - other.createdAt == this.createdAt && - other.updatedAt == this.updatedAt && - other.deletedAt == this.deletedAt && + other.localCreatedAt == this.localCreatedAt && + other.remoteCreatedAt == this.remoteCreatedAt && + other.localUpdatedAt == this.localUpdatedAt && + other.remoteUpdatedAt == this.remoteUpdatedAt && + other.localDeletedAt == this.localDeletedAt && + other.remoteDeletedAt == this.remoteDeletedAt && other.userId == this.userId && other.pinned == this.pinned && other.pinnedAt == this.pinnedAt && @@ -2626,9 +2863,12 @@ class PinnedMessagesCompanion extends UpdateCompanion { final Value showInChannel; final Value shadowed; final Value command; - final Value createdAt; - final Value updatedAt; - final Value deletedAt; + final Value localCreatedAt; + final Value remoteCreatedAt; + final Value localUpdatedAt; + final Value remoteUpdatedAt; + final Value localDeletedAt; + final Value remoteDeletedAt; final Value userId; final Value pinned; final Value pinnedAt; @@ -2653,9 +2893,12 @@ class PinnedMessagesCompanion extends UpdateCompanion { this.showInChannel = const Value.absent(), this.shadowed = const Value.absent(), this.command = const Value.absent(), - this.createdAt = const Value.absent(), - this.updatedAt = const Value.absent(), - this.deletedAt = const Value.absent(), + this.localCreatedAt = const Value.absent(), + this.remoteCreatedAt = const Value.absent(), + this.localUpdatedAt = const Value.absent(), + this.remoteUpdatedAt = const Value.absent(), + this.localDeletedAt = const Value.absent(), + this.remoteDeletedAt = const Value.absent(), this.userId = const Value.absent(), this.pinned = const Value.absent(), this.pinnedAt = const Value.absent(), @@ -2681,9 +2924,12 @@ class PinnedMessagesCompanion extends UpdateCompanion { this.showInChannel = const Value.absent(), this.shadowed = const Value.absent(), this.command = const Value.absent(), - this.createdAt = const Value.absent(), - this.updatedAt = const Value.absent(), - this.deletedAt = const Value.absent(), + this.localCreatedAt = const Value.absent(), + this.remoteCreatedAt = const Value.absent(), + this.localUpdatedAt = const Value.absent(), + this.remoteUpdatedAt = const Value.absent(), + this.localDeletedAt = const Value.absent(), + this.remoteDeletedAt = const Value.absent(), this.userId = const Value.absent(), this.pinned = const Value.absent(), this.pinnedAt = const Value.absent(), @@ -2712,9 +2958,12 @@ class PinnedMessagesCompanion extends UpdateCompanion { Expression? showInChannel, Expression? shadowed, Expression? command, - Expression? createdAt, - Expression? updatedAt, - Expression? deletedAt, + Expression? localCreatedAt, + Expression? remoteCreatedAt, + Expression? localUpdatedAt, + Expression? remoteUpdatedAt, + Expression? localDeletedAt, + Expression? remoteDeletedAt, Expression? userId, Expression? pinned, Expression? pinnedAt, @@ -2740,9 +2989,12 @@ class PinnedMessagesCompanion extends UpdateCompanion { if (showInChannel != null) 'show_in_channel': showInChannel, if (shadowed != null) 'shadowed': shadowed, if (command != null) 'command': command, - if (createdAt != null) 'created_at': createdAt, - if (updatedAt != null) 'updated_at': updatedAt, - if (deletedAt != null) 'deleted_at': deletedAt, + if (localCreatedAt != null) 'local_created_at': localCreatedAt, + if (remoteCreatedAt != null) 'remote_created_at': remoteCreatedAt, + if (localUpdatedAt != null) 'local_updated_at': localUpdatedAt, + if (remoteUpdatedAt != null) 'remote_updated_at': remoteUpdatedAt, + if (localDeletedAt != null) 'local_deleted_at': localDeletedAt, + if (remoteDeletedAt != null) 'remote_deleted_at': remoteDeletedAt, if (userId != null) 'user_id': userId, if (pinned != null) 'pinned': pinned, if (pinnedAt != null) 'pinned_at': pinnedAt, @@ -2770,9 +3022,12 @@ class PinnedMessagesCompanion extends UpdateCompanion { Value? showInChannel, Value? shadowed, Value? command, - Value? createdAt, - Value? updatedAt, - Value? deletedAt, + Value? localCreatedAt, + Value? remoteCreatedAt, + Value? localUpdatedAt, + Value? remoteUpdatedAt, + Value? localDeletedAt, + Value? remoteDeletedAt, Value? userId, Value? pinned, Value? pinnedAt, @@ -2797,9 +3052,12 @@ class PinnedMessagesCompanion extends UpdateCompanion { showInChannel: showInChannel ?? this.showInChannel, shadowed: shadowed ?? this.shadowed, command: command ?? this.command, - createdAt: createdAt ?? this.createdAt, - updatedAt: updatedAt ?? this.updatedAt, - deletedAt: deletedAt ?? this.deletedAt, + localCreatedAt: localCreatedAt ?? this.localCreatedAt, + remoteCreatedAt: remoteCreatedAt ?? this.remoteCreatedAt, + localUpdatedAt: localUpdatedAt ?? this.localUpdatedAt, + remoteUpdatedAt: remoteUpdatedAt ?? this.remoteUpdatedAt, + localDeletedAt: localDeletedAt ?? this.localDeletedAt, + remoteDeletedAt: remoteDeletedAt ?? this.remoteDeletedAt, userId: userId ?? this.userId, pinned: pinned ?? this.pinned, pinnedAt: pinnedAt ?? this.pinnedAt, @@ -2865,14 +3123,23 @@ class PinnedMessagesCompanion extends UpdateCompanion { if (command.present) { map['command'] = Variable(command.value); } - if (createdAt.present) { - map['created_at'] = Variable(createdAt.value); + if (localCreatedAt.present) { + map['local_created_at'] = Variable(localCreatedAt.value); } - if (updatedAt.present) { - map['updated_at'] = Variable(updatedAt.value); + if (remoteCreatedAt.present) { + map['remote_created_at'] = Variable(remoteCreatedAt.value); } - if (deletedAt.present) { - map['deleted_at'] = Variable(deletedAt.value); + if (localUpdatedAt.present) { + map['local_updated_at'] = Variable(localUpdatedAt.value); + } + if (remoteUpdatedAt.present) { + map['remote_updated_at'] = Variable(remoteUpdatedAt.value); + } + if (localDeletedAt.present) { + map['local_deleted_at'] = Variable(localDeletedAt.value); + } + if (remoteDeletedAt.present) { + map['remote_deleted_at'] = Variable(remoteDeletedAt.value); } if (userId.present) { map['user_id'] = Variable(userId.value); @@ -2923,9 +3190,12 @@ class PinnedMessagesCompanion extends UpdateCompanion { ..write('showInChannel: $showInChannel, ') ..write('shadowed: $shadowed, ') ..write('command: $command, ') - ..write('createdAt: $createdAt, ') - ..write('updatedAt: $updatedAt, ') - ..write('deletedAt: $deletedAt, ') + ..write('localCreatedAt: $localCreatedAt, ') + ..write('remoteCreatedAt: $remoteCreatedAt, ') + ..write('localUpdatedAt: $localUpdatedAt, ') + ..write('remoteUpdatedAt: $remoteUpdatedAt, ') + ..write('localDeletedAt: $localDeletedAt, ') + ..write('remoteDeletedAt: $remoteDeletedAt, ') ..write('userId: $userId, ') ..write('pinned: $pinned, ') ..write('pinnedAt: $pinnedAt, ') @@ -3060,7 +3330,7 @@ class $PinnedMessageReactionsTable extends PinnedMessageReactions } static TypeConverter, String> $converterextraData = - MapConverter(); + MapConverter(); static TypeConverter?, String?> $converterextraDatan = NullAwareTypeConverter.wrap($converterextraData); } @@ -3403,7 +3673,7 @@ class $ReactionsTable extends Reactions } static TypeConverter, String> $converterextraData = - MapConverter(); + MapConverter(); static TypeConverter?, String?> $converterextraDatan = NullAwareTypeConverter.wrap($converterextraData); } @@ -3790,7 +4060,7 @@ class $UsersTable extends Users with TableInfo<$UsersTable, UserEntity> { } static TypeConverter, String> $converterextraData = - MapConverter(); + MapConverter(); } class UserEntity extends DataClass implements Insertable { diff --git a/packages/stream_chat_persistence/lib/src/entity/messages.dart b/packages/stream_chat_persistence/lib/src/entity/messages.dart index fe20013a..5d585619 100644 --- a/packages/stream_chat_persistence/lib/src/entity/messages.dart +++ b/packages/stream_chat_persistence/lib/src/entity/messages.dart @@ -53,14 +53,52 @@ class Messages extends Table { /// A used command name. TextColumn get command => text().nullable()(); - /// The DateTime when the message was created. - DateTimeColumn get createdAt => dateTime().withDefault(currentDateAndTime)(); + /// The DateTime on which the message was created. + /// + /// Returns the latest between [localCreatedAt] and [remoteCreatedAt]. + /// If both are null, returns [currentDateAndTime]. + Expression get createdAt { + return coalesce( + [localCreatedAt, remoteCreatedAt, currentDateAndTime], + ); + } - /// The DateTime when the message was updated last time. - DateTimeColumn get updatedAt => dateTime().withDefault(currentDateAndTime)(); + /// The DateTime on which the message was created on the client. + DateTimeColumn get localCreatedAt => dateTime().nullable()(); - /// The DateTime when the message was deleted. - DateTimeColumn get deletedAt => dateTime().nullable()(); + /// The DateTime on which the message was created on the server. + DateTimeColumn get remoteCreatedAt => dateTime().nullable()(); + + /// The DateTime on which the message was updated last time. + /// + /// Returns the latest between [localUpdatedAt] and [remoteUpdatedAt]. + /// If both are null, returns [createdAt]. + Expression get updatedAt { + return coalesce( + [localUpdatedAt, remoteUpdatedAt, createdAt], + ); + } + + /// The DateTime on which the message was updated on the client. + DateTimeColumn get localUpdatedAt => dateTime().nullable()(); + + /// The DateTime on which the message was updated on the server. + DateTimeColumn get remoteUpdatedAt => dateTime().nullable()(); + + /// The DateTime on which the message was deleted. + /// + /// Returns the latest between [localDeletedAt] and [remoteDeletedAt]. + Expression get deletedAt { + return coalesce( + [localDeletedAt, remoteDeletedAt], + ); + } + + /// The DateTime on which the message was deleted on the client. + DateTimeColumn get localDeletedAt => dateTime().nullable()(); + + /// The DateTime on which the message was deleted on the server. + DateTimeColumn get remoteDeletedAt => dateTime().nullable()(); /// Id of the User who sent the message TextColumn get userId => text().nullable()(); 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 72d3d30f..0fd69db8 100644 --- a/packages/stream_chat_persistence/lib/src/mapper/message_mapper.dart +++ b/packages/stream_chat_persistence/lib/src/mapper/message_mapper.dart @@ -21,9 +21,13 @@ extension MessageEntityX on MessageEntity { final json = jsonDecode(it); return Attachment.fromData(json); }).toList(), - createdAt: createdAt, extraData: extraData ?? {}, - updatedAt: updatedAt, + createdAt: remoteCreatedAt, + localCreatedAt: localCreatedAt, + updatedAt: remoteUpdatedAt, + localUpdatedAt: localUpdatedAt, + deletedAt: remoteDeletedAt, + localDeletedAt: localDeletedAt, id: id, type: type, status: status, @@ -37,7 +41,6 @@ extension MessageEntityX on MessageEntity { showInChannel: showInChannel, text: messageText, user: user, - deletedAt: deletedAt, pinned: pinned, pinnedAt: pinnedAt, pinExpires: pinExpires, @@ -59,7 +62,8 @@ extension MessageX on Message { parentId: parentId, quotedMessageId: quotedMessageId, command: command, - createdAt: createdAt, + remoteCreatedAt: remoteCreatedAt, + localCreatedAt: localCreatedAt, shadowed: shadowed, showInChannel: showInChannel, replyCount: replyCount, @@ -67,10 +71,12 @@ extension MessageX on Message { reactionCounts: reactionCounts, mentionedUsers: mentionedUsers.map(jsonEncode).toList(), status: status, - updatedAt: updatedAt, + remoteUpdatedAt: remoteUpdatedAt, + localUpdatedAt: localUpdatedAt, extraData: extraData, userId: user?.id, - deletedAt: deletedAt, + remoteDeletedAt: remoteDeletedAt, + localDeletedAt: localDeletedAt, messageText: text, pinned: pinned, pinnedAt: pinnedAt, 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 91a25a33..d4089a7c 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 @@ -21,9 +21,13 @@ extension PinnedMessageEntityX on PinnedMessageEntity { final json = jsonDecode(it); return Attachment.fromData(json); }).toList(), - createdAt: createdAt, extraData: extraData ?? {}, - updatedAt: updatedAt, + createdAt: remoteCreatedAt, + localCreatedAt: localCreatedAt, + updatedAt: remoteUpdatedAt, + localUpdatedAt: localUpdatedAt, + deletedAt: remoteDeletedAt, + localDeletedAt: localDeletedAt, id: id, type: type, status: status, @@ -37,7 +41,6 @@ extension PinnedMessageEntityX on PinnedMessageEntity { showInChannel: showInChannel, text: messageText, user: user, - deletedAt: deletedAt, pinned: pinned, pinnedAt: pinnedAt, pinExpires: pinExpires, @@ -60,7 +63,8 @@ extension PMessageX on Message { parentId: parentId, quotedMessageId: quotedMessageId, command: command, - createdAt: createdAt, + remoteCreatedAt: remoteCreatedAt, + localCreatedAt: localCreatedAt, shadowed: shadowed, showInChannel: showInChannel, replyCount: replyCount, @@ -68,10 +72,12 @@ extension PMessageX on Message { reactionCounts: reactionCounts, mentionedUsers: mentionedUsers.map(jsonEncode).toList(), status: status, - updatedAt: updatedAt, + remoteUpdatedAt: remoteUpdatedAt, + localUpdatedAt: localUpdatedAt, extraData: extraData, userId: user?.id, - deletedAt: deletedAt, + remoteDeletedAt: remoteDeletedAt, + localDeletedAt: localDeletedAt, messageText: text, pinned: pinned, pinnedAt: pinnedAt, diff --git a/packages/stream_chat_persistence/pubspec.yaml b/packages/stream_chat_persistence/pubspec.yaml index 9a1a6148..b4dfa792 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: 6.3.0 +version: 6.4.0 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -18,7 +18,7 @@ dependencies: path: ^1.8.2 path_provider: ^2.0.1 sqlite3_flutter_libs: ^0.5.0 - stream_chat: ^6.3.0 + stream_chat: ^6.4.0 dev_dependencies: build_runner: ^2.3.3 diff --git a/packages/stream_chat_persistence/test/src/mapper/message_mapper_test.dart b/packages/stream_chat_persistence/test/src/mapper/message_mapper_test.dart index ccb9108e..b6524861 100644 --- a/packages/stream_chat_persistence/test/src/mapper/message_mapper_test.dart +++ b/packages/stream_chat_persistence/test/src/mapper/message_mapper_test.dart @@ -38,7 +38,8 @@ void main() { parentId: 'testParentId', quotedMessageId: quotedMessage.id, command: 'testCommand', - createdAt: DateTime.now(), + localCreatedAt: DateTime.now(), + remoteCreatedAt: DateTime.now().add(const Duration(seconds: 1)), shadowed: math.Random().nextBool(), showInChannel: math.Random().nextBool(), replyCount: 33, @@ -52,10 +53,12 @@ void main() { jsonEncode(User(id: 'testuser')), ], status: MessageSendingStatus.sent, - updatedAt: DateTime.now(), + localUpdatedAt: DateTime.now(), + remoteUpdatedAt: DateTime.now().add(const Duration(seconds: 1)), extraData: {'extra_test_data': 'extraData'}, userId: user.id, - deletedAt: DateTime.now(), + localDeletedAt: DateTime.now(), + remoteDeletedAt: DateTime.now().add(const Duration(seconds: 1)), messageText: 'Hello', pinned: true, pinExpires: DateTime.now().toUtc(), @@ -81,7 +84,8 @@ void main() { expect(message.parentId, entity.parentId); expect(message.quotedMessageId, entity.quotedMessageId); expect(message.command, entity.command); - expect(message.createdAt, isSameDateAs(entity.createdAt)); + expect(message.localCreatedAt, isSameDateAs(entity.localCreatedAt)); + expect(message.remoteCreatedAt, isSameDateAs(entity.remoteCreatedAt)); expect(message.shadowed, entity.shadowed); expect(message.showInChannel, entity.showInChannel); for (var i = 0; i < message.mentionedUsers.length; i++) { @@ -93,10 +97,12 @@ void main() { expect(message.reactionScores, entity.reactionScores); expect(message.reactionCounts, entity.reactionCounts); expect(message.status, entity.status); - expect(message.updatedAt, isSameDateAs(entity.updatedAt)); + expect(message.localUpdatedAt, isSameDateAs(entity.localUpdatedAt)); + expect(message.remoteUpdatedAt, isSameDateAs(entity.remoteUpdatedAt)); expect(message.extraData, entity.extraData); expect(message.user!.id, entity.userId); - expect(message.deletedAt, isSameDateAs(entity.deletedAt)); + expect(message.localDeletedAt, isSameDateAs(entity.localDeletedAt)); + expect(message.remoteDeletedAt, isSameDateAs(entity.remoteDeletedAt)); expect(message.text, entity.messageText); expect(message.pinned, entity.pinned); expect(message.pinExpires, isSameDateAs(entity.pinExpires)); @@ -144,7 +150,8 @@ void main() { parentId: 'testParentId', quotedMessageId: quotedMessage.id, command: 'testCommand', - createdAt: DateTime.now(), + localCreatedAt: DateTime.now(), + createdAt: DateTime.now().add(const Duration(seconds: 1)), shadowed: math.Random().nextBool(), showInChannel: math.Random().nextBool(), replyCount: 33, @@ -157,10 +164,12 @@ void main() { (prev, curr) => prev?..update(curr.type, (value) => value + 1, ifAbsent: () => 1), ), - updatedAt: DateTime.now(), + localUpdatedAt: DateTime.now(), + updatedAt: DateTime.now().add(const Duration(seconds: 1)), extraData: const {'extra_test_data': 'extraData'}, user: user, - deletedAt: DateTime.now(), + localDeletedAt: DateTime.now(), + deletedAt: DateTime.now().add(const Duration(seconds: 1)), text: 'Hello', pinned: true, pinExpires: DateTime.now(), @@ -179,7 +188,8 @@ void main() { expect(entity.parentId, message.parentId); expect(entity.quotedMessageId, message.quotedMessageId); expect(entity.command, message.command); - expect(entity.createdAt, isSameDateAs(message.createdAt)); + expect(entity.localCreatedAt, isSameDateAs(message.localCreatedAt)); + expect(entity.remoteCreatedAt, isSameDateAs(message.remoteCreatedAt)); expect(entity.shadowed, message.shadowed); expect(entity.showInChannel, message.showInChannel); expect(entity.replyCount, message.replyCount); @@ -188,10 +198,12 @@ void main() { expect(entity.reactionScores, message.reactionScores); expect(entity.reactionCounts, message.reactionCounts); expect(entity.status, message.status); - expect(entity.updatedAt, isSameDateAs(message.updatedAt)); + expect(entity.localUpdatedAt, isSameDateAs(message.localUpdatedAt)); + expect(entity.remoteUpdatedAt, isSameDateAs(message.remoteUpdatedAt)); expect(entity.extraData, message.extraData); expect(entity.userId, message.user!.id); - expect(entity.deletedAt, isSameDateAs(message.deletedAt)); + expect(entity.localDeletedAt, isSameDateAs(message.localDeletedAt)); + expect(entity.remoteDeletedAt, isSameDateAs(message.remoteDeletedAt)); expect(entity.messageText, message.text); expect(entity.pinned, message.pinned); expect(entity.pinExpires, isSameDateAs(message.pinExpires)); diff --git a/packages/stream_chat_persistence/test/src/mapper/pinned_message_mapper_test.dart b/packages/stream_chat_persistence/test/src/mapper/pinned_message_mapper_test.dart index fd3e075c..490af8ca 100644 --- a/packages/stream_chat_persistence/test/src/mapper/pinned_message_mapper_test.dart +++ b/packages/stream_chat_persistence/test/src/mapper/pinned_message_mapper_test.dart @@ -38,7 +38,8 @@ void main() { parentId: 'testParentId', quotedMessageId: quotedMessage.id, command: 'testCommand', - createdAt: DateTime.now(), + localCreatedAt: DateTime.now(), + remoteCreatedAt: DateTime.now().add(const Duration(seconds: 1)), shadowed: math.Random().nextBool(), showInChannel: math.Random().nextBool(), replyCount: 33, @@ -48,12 +49,16 @@ void main() { (prev, curr) => prev?..update(curr.type, (value) => value + 1, ifAbsent: () => 1), ), - mentionedUsers: [], + mentionedUsers: [ + jsonEncode(User(id: 'testuser')), + ], status: MessageSendingStatus.sent, - updatedAt: DateTime.now(), + localUpdatedAt: DateTime.now(), + remoteUpdatedAt: DateTime.now().add(const Duration(seconds: 1)), extraData: {'extra_test_data': 'extraData'}, userId: user.id, - deletedAt: DateTime.now(), + localDeletedAt: DateTime.now(), + remoteDeletedAt: DateTime.now().add(const Duration(seconds: 1)), messageText: 'Hello', pinned: true, pinExpires: DateTime.now().toUtc(), @@ -79,17 +84,25 @@ void main() { expect(message.parentId, entity.parentId); expect(message.quotedMessageId, entity.quotedMessageId); expect(message.command, entity.command); - expect(message.createdAt, isSameDateAs(entity.createdAt)); + expect(message.localCreatedAt, isSameDateAs(entity.localCreatedAt)); + expect(message.remoteCreatedAt, isSameDateAs(entity.remoteCreatedAt)); expect(message.shadowed, entity.shadowed); expect(message.showInChannel, entity.showInChannel); + for (var i = 0; i < message.mentionedUsers.length; i++) { + final entityMentionedUser = + User.fromJson(jsonDecode(entity.mentionedUsers[i])); + expect(message.mentionedUsers[i].id, entityMentionedUser.id); + } expect(message.replyCount, entity.replyCount); expect(message.reactionScores, entity.reactionScores); expect(message.reactionCounts, entity.reactionCounts); expect(message.status, entity.status); - expect(message.updatedAt, isSameDateAs(entity.updatedAt)); + expect(message.localUpdatedAt, isSameDateAs(entity.localUpdatedAt)); + expect(message.remoteUpdatedAt, isSameDateAs(entity.remoteUpdatedAt)); expect(message.extraData, entity.extraData); expect(message.user!.id, entity.userId); - expect(message.deletedAt, isSameDateAs(entity.deletedAt)); + expect(message.localDeletedAt, isSameDateAs(entity.localDeletedAt)); + expect(message.remoteDeletedAt, isSameDateAs(entity.remoteDeletedAt)); expect(message.text, entity.messageText); expect(message.pinned, entity.pinned); expect(message.pinExpires, isSameDateAs(entity.pinExpires)); @@ -108,7 +121,7 @@ void main() { } }); - test('toPinnedEntity should map message into PinnedMessageEntity', () { + test('toEntity should map message into MessageEntity', () { const cid = 'testCid'; final user = User(id: 'testUserId'); final quotedMessage = Message(id: 'testQuotedMessageId'); @@ -137,20 +150,26 @@ void main() { parentId: 'testParentId', quotedMessageId: quotedMessage.id, command: 'testCommand', - createdAt: DateTime.now(), + localCreatedAt: DateTime.now(), + createdAt: DateTime.now().add(const Duration(seconds: 1)), shadowed: math.Random().nextBool(), showInChannel: math.Random().nextBool(), replyCount: 33, + mentionedUsers: [ + User(id: 'testuser'), + ], reactionScores: {for (final r in reactions) r.type: r.score}, reactionCounts: reactions.fold( {}, (prev, curr) => prev?..update(curr.type, (value) => value + 1, ifAbsent: () => 1), ), - updatedAt: DateTime.now(), + localUpdatedAt: DateTime.now(), + updatedAt: DateTime.now().add(const Duration(seconds: 1)), extraData: const {'extra_test_data': 'extraData'}, user: user, - deletedAt: DateTime.now(), + localDeletedAt: DateTime.now(), + deletedAt: DateTime.now().add(const Duration(seconds: 1)), text: 'Hello', pinned: true, pinExpires: DateTime.now(), @@ -169,17 +188,22 @@ void main() { expect(entity.parentId, message.parentId); expect(entity.quotedMessageId, message.quotedMessageId); expect(entity.command, message.command); - expect(entity.createdAt, isSameDateAs(message.createdAt)); + expect(entity.localCreatedAt, isSameDateAs(message.localCreatedAt)); + expect(entity.remoteCreatedAt, isSameDateAs(message.remoteCreatedAt)); expect(entity.shadowed, message.shadowed); expect(entity.showInChannel, message.showInChannel); expect(entity.replyCount, message.replyCount); + expect( + entity.mentionedUsers, message.mentionedUsers.map(jsonEncode).toList()); expect(entity.reactionScores, message.reactionScores); expect(entity.reactionCounts, message.reactionCounts); expect(entity.status, message.status); - expect(entity.updatedAt, isSameDateAs(message.updatedAt)); + expect(entity.localUpdatedAt, isSameDateAs(message.localUpdatedAt)); + expect(entity.remoteUpdatedAt, isSameDateAs(message.remoteUpdatedAt)); expect(entity.extraData, message.extraData); expect(entity.userId, message.user!.id); - expect(entity.deletedAt, isSameDateAs(message.deletedAt)); + expect(entity.localDeletedAt, isSameDateAs(message.localDeletedAt)); + expect(entity.remoteDeletedAt, isSameDateAs(message.remoteDeletedAt)); expect(entity.messageText, message.text); expect(entity.pinned, message.pinned); expect(entity.pinExpires, isSameDateAs(message.pinExpires));