diff --git a/.github/workflows/dart_code_metrics.yaml b/.github/workflows/dart_code_metrics.yaml index 9162b1a7..52837c1e 100644 --- a/.github/workflows/dart_code_metrics.yaml +++ b/.github/workflows/dart_code_metrics.yaml @@ -1,9 +1,8 @@ name: Dart Code Metrics env: - flutter_version: "3.3.3" + flutter_version: "3.7.0" folders: "lib, test" - melos_version: "2.7.1" on: pull_request: @@ -12,62 +11,61 @@ on: - master - develop +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: check: name: dart-code-metrics runs-on: ubuntu-latest steps: - name: "Git Checkout" - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 - - name: "Cache Flutter dependencies" - uses: actions/cache@v2 - with: - path: /opt/hostedtoolcache/flutter - key: ${{ env.flutter_version }}-flutter - - name: "Install Flutter" - uses: subosito/flutter-action@v1 + uses: subosito/flutter-action@v2 with: + cache: true flutter-version: ${{ env.flutter_version }} - name: "Install Tools" - run: flutter pub global activate melos ${{ env.melos_version }} + run: flutter pub global activate melos - name: "Bootstrap Workspace" run: melos bootstrap - name: "Stream Chat Metrics" - uses: dart-code-checker/dart-code-metrics-action@v2.0.0 + uses: dart-code-checker/dart-code-metrics-action@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} relative_path: 'packages/stream_chat' folders: ${{ env.folders }} - name: "Stream Chat Flutter Core Metrics" - uses: dart-code-checker/dart-code-metrics-action@v2.0.0 + uses: dart-code-checker/dart-code-metrics-action@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} relative_path: 'packages/stream_chat_flutter_core' folders: ${{ env.folders }} - name: "Stream Chat Flutter Metrics" - uses: dart-code-checker/dart-code-metrics-action@v2.0.0 + uses: dart-code-checker/dart-code-metrics-action@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} relative_path: 'packages/stream_chat_flutter' folders: ${{ env.folders }} - name: "Stream Chat Localizations Metrics" - uses: dart-code-checker/dart-code-metrics-action@v2.0.0 + uses: dart-code-checker/dart-code-metrics-action@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} relative_path: 'packages/stream_chat_localizations' folders: ${{ env.folders }} - name: "Stream Chat Persistence Metrics" - uses: dart-code-checker/dart-code-metrics-action@v2.0.0 + uses: dart-code-checker/dart-code-metrics-action@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} relative_path: 'packages/stream_chat_persistence' diff --git a/.github/workflows/docusaurus.yml b/.github/workflows/docusaurus.yml index f46fa893..fc29804f 100644 --- a/.github/workflows/docusaurus.yml +++ b/.github/workflows/docusaurus.yml @@ -11,7 +11,7 @@ jobs: push_docusaurus: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: push uses: GetStream/push-stream-chat-docusaurus-action@main with: diff --git a/.github/workflows/pana.yml b/.github/workflows/pana.yml index a6a7e822..aa72f61a 100644 --- a/.github/workflows/pana.yml +++ b/.github/workflows/pana.yml @@ -14,12 +14,16 @@ on: - master paths-ignore: - 'docs/**' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true jobs: stream_chat: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: axel-op/dart-package-analyzer@v3 id: analysis with: @@ -39,7 +43,7 @@ jobs: stream_chat_persistence: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: axel-op/dart-package-analyzer@v3 id: analysis with: @@ -60,7 +64,7 @@ jobs: stream_chat_flutter_core: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: axel-op/dart-package-analyzer@v3 id: analysis with: @@ -80,7 +84,7 @@ jobs: stream_chat_flutter: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: axel-op/dart-package-analyzer@v3 id: analysis with: diff --git a/.github/workflows/pr_title.yml b/.github/workflows/pr_title.yml index b7d1ad9b..bd4e36cb 100644 --- a/.github/workflows/pr_title.yml +++ b/.github/workflows/pr_title.yml @@ -7,6 +7,10 @@ on: - synchronize branches: - develop + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true jobs: conventional_pr_title: diff --git a/.github/workflows/stream_flutter_workflow.yml b/.github/workflows/stream_flutter_workflow.yml index 9de7ca4d..8e6df33b 100644 --- a/.github/workflows/stream_flutter_workflow.yml +++ b/.github/workflows/stream_flutter_workflow.yml @@ -2,8 +2,7 @@ name: stream_flutter_workflow env: ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true' - flutter_version: "3.3.3" - melos_version: "2.7.1" + flutter_version: "3.7.0" on: pull_request: @@ -12,6 +11,10 @@ on: branches: - master - develop + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true jobs: analyze: @@ -20,21 +23,17 @@ jobs: runs-on: ubuntu-latest steps: - name: "Git Checkout" - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 - - name: Cache Flutter dependencies - uses: actions/cache@v2 - with: - path: /opt/hostedtoolcache/flutter - key: ${{ env.flutter_version }}-flutter - name: "Install Flutter" - uses: subosito/flutter-action@v1 + uses: subosito/flutter-action@v2 with: + cache: true flutter-version: ${{ env.flutter_version }} - name: "Install Tools" run: | - flutter pub global activate melos ${{ env.melos_version }} + flutter pub global activate melos - name: "Bootstrap Workspace" run: melos bootstrap --verbose - name: "Dart Analyze" @@ -51,21 +50,17 @@ jobs: timeout-minutes: 15 steps: - name: "Git Checkout" - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 - - name: Cache Flutter dependencies - uses: actions/cache@v2 - with: - path: /opt/hostedtoolcache/flutter - key: ${{ env.flutter_version }}-flutter - name: "Install Flutter" - uses: subosito/flutter-action@v1 + uses: subosito/flutter-action@v2 with: + cache: true flutter-version: ${{ env.flutter_version }} - name: "Install Tools" run: | - flutter pub global activate melos ${{ env.melos_version }} + flutter pub global activate melos - name: "Bootstrap Workspace" run: melos bootstrap - name: "Melos Format" @@ -75,26 +70,22 @@ jobs: ./.github/workflows/scripts/validate-formatting.sh test: - runs-on: macos-latest + runs-on: ubuntu-latest if: github.event.pull_request.draft == false timeout-minutes: 30 steps: - name: "Git Checkout" - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 - - name: Cache Flutter dependencies - uses: actions/cache@v2 - with: - path: /Users/runner/hostedtoolcache/flutter - key: ${{ env.flutter_version }}-flutter - name: "Install Flutter" - uses: subosito/flutter-action@v1 + uses: subosito/flutter-action@v2 with: + cache: true flutter-version: ${{ env.flutter_version }} - name: "Install Tools" run: | - flutter pub global activate melos ${{ env.melos_version }} + flutter pub global activate melos flutter pub global activate remove_from_coverage - name: "Bootstrap Workspace" run: melos bootstrap diff --git a/docusaurus/docs/Flutter/05-guides/09-initialize_stream_chat_widget_tree.mdx b/docusaurus/docs/Flutter/05-guides/09-initialize_stream_chat_widget_tree.mdx index 5443c51f..3137cb06 100644 --- a/docusaurus/docs/Flutter/05-guides/09-initialize_stream_chat_widget_tree.mdx +++ b/docusaurus/docs/Flutter/05-guides/09-initialize_stream_chat_widget_tree.mdx @@ -14,7 +14,7 @@ Before investigating potential solutions, let’s first take a look at the relev Most of the Stream Chat Flutter UI widgets rely on having a [StreamChat](../../customization/stream_chat_and_theming/) ancestor in the widget tree. The **StreamChat** widget is an [InheritedWidget](https://api.flutter.dev/flutter/widgets/InheritedWidget-class.html) that exposes the **StreamChatClient** through **BuildContext**. -This widget also initializes the [StreamChatCore](../../stream_chat_flutter_core/stream_chat_core.mdx) widget and the **StreamChatTheme**. +This widget also initializes the [StreamChatCore](../04-stream_chat_flutter_core/stream_chat_core.mdx) widget and the **StreamChatTheme**. **StreamChatCore** is a **StatefulWidget** used to react to life cycle changes and system updates. When the app goes into the background, the WebSocket connection is closed. diff --git a/melos.yaml b/melos.yaml index 217f4bc5..baa8761d 100644 --- a/melos.yaml +++ b/melos.yaml @@ -51,11 +51,11 @@ scripts: description: Build all generated files for Dart & Flutter packages in this project. generate:dart: - run: melos exec -c 1 --depends-on="build_runner" --no-flutter -- "dart run build_runner build --delete-conflicting-outputs --enable-experiment=super-parameters,enhanced-enums" + run: melos exec -c 1 --depends-on="build_runner" --no-flutter -- "dart run build_runner build --delete-conflicting-outputs" description: Build all generated files for Dart packages in this project. generate:flutter: - run: melos exec -c 1 --depends-on="build_runner" --flutter -- "flutter run build_runner build --delete-conflicting-outputs --enable-experiment=super-parameters,enhanced-enums" + run: melos exec -c 1 --depends-on="build_runner" --flutter -- "flutter pub run build_runner build --delete-conflicting-outputs" description: Build all generated files for Flutter packages in this project. test:all: @@ -65,29 +65,29 @@ scripts: test:dart: run: melos exec -c 1 --fail-fast -- "flutter test --coverage" description: Run Dart tests for a specific package in this project. - select-package: + packageFilters: flutter: false - dir-exists: test + dirExists: test test:flutter: run: melos exec -c 4 --fail-fast -- "flutter test --coverage" description: Run Flutter tests for a specific package in this project. - select-package: + packageFilters: flutter: true - dir-exists: test + dirExists: test clean:flutter: run: melos exec -c 4 --fail-fast -- "flutter clean" description: Run Flutter clean for a specific package in this project. - select-package: + packageFilters: flutter: true coverage:ignore-file: run: | melos exec -c 5 --fail-fast -- "\$MELOS_ROOT_PATH/.github/workflows/scripts/remove-from-coverage.sh" description: Removes all the ignored files from the coverage report. - select-package: - dir-exists: coverage + packageFilters: + dirExists: coverage docs: run: | diff --git a/packages/stream_chat/CHANGELOG.md b/packages/stream_chat/CHANGELOG.md index 15a9a9b2..3d4dd563 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -1,3 +1,19 @@ +## Upcoming + +🐞 Fixed + +- Fixed streamWatchers. Before it was always new, now it is possible to follow the watchers of a channel. +- Make `Message.i18n` field read-only. + +πŸ”„ Changed + +- Cancelling a attachment upload now removes the attachment from the message. +- Updated `dio` and other dependencies to resolvable versions. + +βœ… Added + +- Added `presence` property to `Channel::watch` method. + ## 5.3.0 πŸ”„ Changed diff --git a/packages/stream_chat/example/pubspec.yaml b/packages/stream_chat/example/pubspec.yaml index 9faa8ec7..49e226c2 100644 --- a/packages/stream_chat/example/pubspec.yaml +++ b/packages/stream_chat/example/pubspec.yaml @@ -6,6 +6,7 @@ version: 1.0.0+1 environment: sdk: '>=2.17.0 <3.0.0' + flutter: ">=1.17.0" dependencies: cupertino_icons: ^1.0.0 diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index bfaae76a..7d8515c7 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -463,12 +463,19 @@ class Channel { client.logger.info('Found ${attachments.length} attachments'); - void updateAttachment(Attachment attachment) { + void updateAttachment(Attachment attachment, {bool remove = false}) { final index = message!.attachments.indexWhere( (it) => it.id == attachment.id, ); if (index != -1) { - final newAttachments = [...message!.attachments]..[index] = attachment; + // update or remove attachment from message. + final List newAttachments; + if (remove) { + newAttachments = [...message!.attachments]..removeAt(index); + } else { + newAttachments = [...message!.attachments]..[index] = attachment; + } + final updatedMessage = message!.copyWith(attachments: newAttachments); state?.updateMessage(updatedMessage); // updating original message for next iteration @@ -533,6 +540,14 @@ class Channel { ); } }).catchError((e, stk) { + if (e is StreamChatNetworkError && e.isRequestCancelledError) { + client.logger.info('Attachment ${it.id} upload cancelled'); + + // remove attachment from message if cancelled. + updateAttachment(it, remove: true); + return; + } + client.logger.severe('error uploading the attachment', e, stk); updateAttachment( it.copyWith(uploadState: UploadState.failed(error: e.toString())), @@ -1219,11 +1234,11 @@ class Channel { } /// Loads the initial channel state and watches for changes. - Future watch() async { + Future watch({bool presence = false}) async { ChannelState response; try { - response = await query(watch: true); + response = await query(watch: true, presence: presence); } catch (error, stackTrace) { if (!_initializedCompleter.isCompleted) { _initializedCompleter.completeError(error, stackTrace); @@ -1613,6 +1628,10 @@ class ChannelClientState { _listenMemberUnbanned(); + _listenUserStartWatching(); + + _listenUserStopWatching(); + _startCleaningStaleTypingEvents(); _startCleaningStalePinnedMessages(); @@ -1754,6 +1773,39 @@ class ChannelClientState { )); } + void _listenUserStartWatching() { + _subscriptions.add( + _channel.on(EventType.userWatchingStart).listen((event) { + final watcher = event.user; + if (watcher != null) { + final existingWatchers = channelState.watchers; + updateChannelState(channelState.copyWith( + watchers: [ + ...?existingWatchers, + watcher, + ], + )); + } + }), + ); + } + + void _listenUserStopWatching() { + _subscriptions.add( + _channel.on(EventType.userWatchingStop).listen((event) { + final watcher = event.user; + if (watcher != null) { + final existingWatchers = channelState.watchers; + updateChannelState(channelState.copyWith( + watchers: existingWatchers + ?.where((user) => user.id != watcher.id) + .toList(growable: false), + )); + } + }), + ); + } + void _listenMemberUnbanned() { _subscriptions.add(_channel .on(EventType.userUnbanned) @@ -2083,7 +2135,7 @@ class ChannelClientState { channelStateStream.map((cs) => cs.watchers), _channel.client.state.usersStream, (watchers, users) => watchers!.map((e) => users[e.id] ?? e).toList(), - ); + ).distinct(const ListEquality().equals); /// Channel member for the current user. Member? get currentUserMember => members.firstWhereOrNull( diff --git a/packages/stream_chat/lib/src/core/api/requests.dart b/packages/stream_chat/lib/src/core/api/requests.dart index 719b2b9b..f81ee70b 100644 --- a/packages/stream_chat/lib/src/core/api/requests.dart +++ b/packages/stream_chat/lib/src/core/api/requests.dart @@ -40,7 +40,7 @@ class SortOption { final int direction; /// Sorting field Comparator required for offline sorting - @JsonKey(ignore: true) + @JsonKey(includeToJson: false, includeFromJson: false) final Comparator? comparator; /// Serialize model to json diff --git a/packages/stream_chat/lib/src/core/error/stream_chat_error.dart b/packages/stream_chat/lib/src/core/error/stream_chat_error.dart index 80e83079..1df28558 100644 --- a/packages/stream_chat/lib/src/core/error/stream_chat_error.dart +++ b/packages/stream_chat/lib/src/core/error/stream_chat_error.dart @@ -74,6 +74,7 @@ class StreamChatNetworkError extends StreamChatError { ChatErrorCode errorCode, { int? statusCode, this.data, + this.isRequestCancelledError = false, }) : code = errorCode.code, statusCode = statusCode ?? data?.statusCode, super(errorCode.message); @@ -84,6 +85,7 @@ class StreamChatNetworkError extends StreamChatError { required String message, this.statusCode, this.data, + this.isRequestCancelledError = false, }) : super(message); /// @@ -96,10 +98,13 @@ class StreamChatNetworkError extends StreamChatError { } return StreamChatNetworkError.raw( code: errorResponse?.code ?? -1, - message: - errorResponse?.message ?? response?.statusMessage ?? error.message, + message: errorResponse?.message ?? + response?.statusMessage ?? + error.message ?? + '', statusCode: errorResponse?.statusCode ?? response?.statusCode, data: errorResponse, + isRequestCancelledError: error.type == DioErrorType.cancel, )..stackTrace = error.stackTrace; } @@ -112,6 +117,9 @@ class StreamChatNetworkError extends StreamChatError { /// Response body. please refer to [ErrorResponse]. final ErrorResponse? data; + /// True, in case the error is due to a cancelled network request. + final bool isRequestCancelledError; + StackTrace? _stackTrace; /// diff --git a/packages/stream_chat/lib/src/core/http/interceptor/logging_interceptor.dart b/packages/stream_chat/lib/src/core/http/interceptor/logging_interceptor.dart index 57ffda7d..6b07495d 100644 --- a/packages/stream_chat/lib/src/core/http/interceptor/logging_interceptor.dart +++ b/packages/stream_chat/lib/src/core/http/interceptor/logging_interceptor.dart @@ -87,8 +87,8 @@ class LoggingInterceptor extends Interceptor { requestHeaders['contentType'] = options.contentType?.toString(); requestHeaders['responseType'] = options.responseType.toString(); requestHeaders['followRedirects'] = options.followRedirects; - requestHeaders['connectTimeout'] = options.connectTimeout; - requestHeaders['receiveTimeout'] = options.receiveTimeout; + requestHeaders['connectTimeout'] = options.connectTimeout?.toString(); + requestHeaders['receiveTimeout'] = options.receiveTimeout?.toString(); _printMapAsTable(_logPrintRequest, requestHeaders, header: 'Headers'); _printMapAsTable(_logPrintRequest, options.extra, header: 'Extras'); } @@ -101,7 +101,8 @@ class LoggingInterceptor extends Interceptor { options.data as Map?, header: 'Body', ); - } else if (data is FormData) { + } + if (data is FormData) { final formDataMap = {} ..addEntries(data.fields) ..addEntries(data.files); @@ -121,7 +122,7 @@ class LoggingInterceptor extends Interceptor { @override void onError(DioError err, ErrorInterceptorHandler handler) { if (error) { - if (err.type == DioErrorType.response) { + if (err.type == DioErrorType.badResponse) { final uri = err.response?.requestOptions.uri; _printBoxed( _logPrintError, @@ -162,7 +163,7 @@ class LoggingInterceptor extends Interceptor { _logPrintResponse('β•‘'); _printResponse(_logPrintResponse, response); _logPrintResponse('β•‘'); - _printLine(_logPrintResponse, 'β•š'); + _logPrintResponse('β•š'); } super.onResponse(response, handler); } diff --git a/packages/stream_chat/lib/src/core/http/stream_http_client.dart b/packages/stream_chat/lib/src/core/http/stream_http_client.dart index 7052ce38..4a13fbaf 100644 --- a/packages/stream_chat/lib/src/core/http/stream_http_client.dart +++ b/packages/stream_chat/lib/src/core/http/stream_http_client.dart @@ -29,8 +29,8 @@ class StreamHttpClient { httpClient = dio ?? Dio() { httpClient ..options.baseUrl = _options.baseUrl - ..options.receiveTimeout = _options.receiveTimeout.inMilliseconds - ..options.connectTimeout = _options.connectTimeout.inMilliseconds + ..options.receiveTimeout = _options.receiveTimeout + ..options.connectTimeout = _options.connectTimeout ..options.queryParameters = { 'api_key': apiKey, ..._options.queryParameters, diff --git a/packages/stream_chat/lib/src/core/models/attachment.dart b/packages/stream_chat/lib/src/core/models/attachment.dart index 4d9a3b30..bceaaacc 100644 --- a/packages/stream_chat/lib/src/core/models/attachment.dart +++ b/packages/stream_chat/lib/src/core/models/attachment.dart @@ -135,7 +135,6 @@ class Attachment extends Equatable { late final UploadState uploadState; /// Map of custom channel extraData - @JsonKey(includeIfNull: false) final Map extraData; /// The attachment ID. @@ -146,13 +145,13 @@ class Attachment extends Equatable { /// Shortcut for file size. /// /// {@macro fileSize} - @JsonKey(ignore: true) + @JsonKey(includeToJson: false, includeFromJson: false) int? get fileSize => extraData['file_size'] as int?; /// Shortcut for file mimeType. /// /// {@macro mimeType} - @JsonKey(ignore: true) + @JsonKey(includeToJson: false, includeFromJson: false) String? get mimeType => extraData['mime_type'] as String?; /// Known top level fields. diff --git a/packages/stream_chat/lib/src/core/models/attachment_file.dart b/packages/stream_chat/lib/src/core/models/attachment_file.dart index e6750843..ee6690ca 100644 --- a/packages/stream_chat/lib/src/core/models/attachment_file.dart +++ b/packages/stream_chat/lib/src/core/models/attachment_file.dart @@ -52,7 +52,7 @@ class AttachmentFile { /// Byte data for this file. Particularly useful if you want to manipulate /// its data or easily upload to somewhere else. - @JsonKey(ignore: true) + @JsonKey(includeToJson: false, includeFromJson: false) final Uint8List? bytes; /// The file size in bytes. diff --git a/packages/stream_chat/lib/src/core/models/attachment_file.freezed.dart b/packages/stream_chat/lib/src/core/models/attachment_file.freezed.dart index f0ccc584..9a0f3d1c 100644 --- a/packages/stream_chat/lib/src/core/models/attachment_file.freezed.dart +++ b/packages/stream_chat/lib/src/core/models/attachment_file.freezed.dart @@ -1,7 +1,7 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND // ignore_for_file: type=lint -// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark part of 'attachment_file.dart'; @@ -43,10 +43,10 @@ mixin _$UploadState { throw _privateConstructorUsedError; @optionalTypeArgs TResult? whenOrNull({ - TResult Function()? preparing, - TResult Function(int uploaded, int total)? inProgress, - TResult Function()? success, - TResult Function(String error)? failed, + TResult? Function()? preparing, + TResult? Function(int uploaded, int total)? inProgress, + TResult? Function()? success, + TResult? Function(String error)? failed, }) => throw _privateConstructorUsedError; @optionalTypeArgs @@ -68,10 +68,10 @@ mixin _$UploadState { throw _privateConstructorUsedError; @optionalTypeArgs TResult? mapOrNull({ - TResult Function(Preparing value)? preparing, - TResult Function(InProgress value)? inProgress, - TResult Function(Success value)? success, - TResult Function(Failed value)? failed, + TResult? Function(Preparing value)? preparing, + TResult? Function(InProgress value)? inProgress, + TResult? Function(Success value)? success, + TResult? Function(Failed value)? failed, }) => throw _privateConstructorUsedError; @optionalTypeArgs @@ -90,16 +90,18 @@ mixin _$UploadState { abstract class $UploadStateCopyWith<$Res> { factory $UploadStateCopyWith( UploadState value, $Res Function(UploadState) then) = - _$UploadStateCopyWithImpl<$Res>; + _$UploadStateCopyWithImpl<$Res, UploadState>; } /// @nodoc -class _$UploadStateCopyWithImpl<$Res> implements $UploadStateCopyWith<$Res> { +class _$UploadStateCopyWithImpl<$Res, $Val extends UploadState> + implements $UploadStateCopyWith<$Res> { _$UploadStateCopyWithImpl(this._value, this._then); - final UploadState _value; // ignore: unused_field - final $Res Function(UploadState) _then; + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; } /// @nodoc @@ -110,14 +112,12 @@ abstract class _$$PreparingCopyWith<$Res> { } /// @nodoc -class __$$PreparingCopyWithImpl<$Res> extends _$UploadStateCopyWithImpl<$Res> +class __$$PreparingCopyWithImpl<$Res> + extends _$UploadStateCopyWithImpl<$Res, _$Preparing> implements _$$PreparingCopyWith<$Res> { __$$PreparingCopyWithImpl( _$Preparing _value, $Res Function(_$Preparing) _then) - : super(_value, (v) => _then(v as _$Preparing)); - - @override - _$Preparing get _value => super._value as _$Preparing; + : super(_value, _then); } /// @nodoc @@ -162,10 +162,10 @@ class _$Preparing extends Preparing { @override @optionalTypeArgs TResult? whenOrNull({ - TResult Function()? preparing, - TResult Function(int uploaded, int total)? inProgress, - TResult Function()? success, - TResult Function(String error)? failed, + TResult? Function()? preparing, + TResult? Function(int uploaded, int total)? inProgress, + TResult? Function()? success, + TResult? Function(String error)? failed, }) { return preparing?.call(); } @@ -199,10 +199,10 @@ class _$Preparing extends Preparing { @override @optionalTypeArgs TResult? mapOrNull({ - TResult Function(Preparing value)? preparing, - TResult Function(InProgress value)? inProgress, - TResult Function(Success value)? success, - TResult Function(Failed value)? failed, + TResult? Function(Preparing value)? preparing, + TResult? Function(InProgress value)? inProgress, + TResult? Function(Success value)? success, + TResult? Function(Failed value)? failed, }) { return preparing?.call(this); } @@ -242,30 +242,30 @@ abstract class _$$InProgressCopyWith<$Res> { factory _$$InProgressCopyWith( _$InProgress value, $Res Function(_$InProgress) then) = __$$InProgressCopyWithImpl<$Res>; + @useResult $Res call({int uploaded, int total}); } /// @nodoc -class __$$InProgressCopyWithImpl<$Res> extends _$UploadStateCopyWithImpl<$Res> +class __$$InProgressCopyWithImpl<$Res> + extends _$UploadStateCopyWithImpl<$Res, _$InProgress> implements _$$InProgressCopyWith<$Res> { __$$InProgressCopyWithImpl( _$InProgress _value, $Res Function(_$InProgress) _then) - : super(_value, (v) => _then(v as _$InProgress)); - - @override - _$InProgress get _value => super._value as _$InProgress; + : super(_value, _then); + @pragma('vm:prefer-inline') @override $Res call({ - Object? uploaded = freezed, - Object? total = freezed, + Object? uploaded = null, + Object? total = null, }) { return _then(_$InProgress( - uploaded: uploaded == freezed + uploaded: null == uploaded ? _value.uploaded : uploaded // ignore: cast_nullable_to_non_nullable as int, - total: total == freezed + total: null == total ? _value.total : total // ignore: cast_nullable_to_non_nullable as int, @@ -302,19 +302,18 @@ class _$InProgress extends InProgress { return identical(this, other) || (other.runtimeType == runtimeType && other is _$InProgress && - const DeepCollectionEquality().equals(other.uploaded, uploaded) && - const DeepCollectionEquality().equals(other.total, total)); + (identical(other.uploaded, uploaded) || + other.uploaded == uploaded) && + (identical(other.total, total) || other.total == total)); } @JsonKey(ignore: true) @override - int get hashCode => Object.hash( - runtimeType, - const DeepCollectionEquality().hash(uploaded), - const DeepCollectionEquality().hash(total)); + int get hashCode => Object.hash(runtimeType, uploaded, total); @JsonKey(ignore: true) @override + @pragma('vm:prefer-inline') _$$InProgressCopyWith<_$InProgress> get copyWith => __$$InProgressCopyWithImpl<_$InProgress>(this, _$identity); @@ -332,10 +331,10 @@ class _$InProgress extends InProgress { @override @optionalTypeArgs TResult? whenOrNull({ - TResult Function()? preparing, - TResult Function(int uploaded, int total)? inProgress, - TResult Function()? success, - TResult Function(String error)? failed, + TResult? Function()? preparing, + TResult? Function(int uploaded, int total)? inProgress, + TResult? Function()? success, + TResult? Function(String error)? failed, }) { return inProgress?.call(uploaded, total); } @@ -369,10 +368,10 @@ class _$InProgress extends InProgress { @override @optionalTypeArgs TResult? mapOrNull({ - TResult Function(Preparing value)? preparing, - TResult Function(InProgress value)? inProgress, - TResult Function(Success value)? success, - TResult Function(Failed value)? failed, + TResult? Function(Preparing value)? preparing, + TResult? Function(InProgress value)? inProgress, + TResult? Function(Success value)? success, + TResult? Function(Failed value)? failed, }) { return inProgress?.call(this); } @@ -422,13 +421,11 @@ abstract class _$$SuccessCopyWith<$Res> { } /// @nodoc -class __$$SuccessCopyWithImpl<$Res> extends _$UploadStateCopyWithImpl<$Res> +class __$$SuccessCopyWithImpl<$Res> + extends _$UploadStateCopyWithImpl<$Res, _$Success> implements _$$SuccessCopyWith<$Res> { __$$SuccessCopyWithImpl(_$Success _value, $Res Function(_$Success) _then) - : super(_value, (v) => _then(v as _$Success)); - - @override - _$Success get _value => super._value as _$Success; + : super(_value, _then); } /// @nodoc @@ -473,10 +470,10 @@ class _$Success extends Success { @override @optionalTypeArgs TResult? whenOrNull({ - TResult Function()? preparing, - TResult Function(int uploaded, int total)? inProgress, - TResult Function()? success, - TResult Function(String error)? failed, + TResult? Function()? preparing, + TResult? Function(int uploaded, int total)? inProgress, + TResult? Function()? success, + TResult? Function(String error)? failed, }) { return success?.call(); } @@ -510,10 +507,10 @@ class _$Success extends Success { @override @optionalTypeArgs TResult? mapOrNull({ - TResult Function(Preparing value)? preparing, - TResult Function(InProgress value)? inProgress, - TResult Function(Success value)? success, - TResult Function(Failed value)? failed, + TResult? Function(Preparing value)? preparing, + TResult? Function(InProgress value)? inProgress, + TResult? Function(Success value)? success, + TResult? Function(Failed value)? failed, }) { return success?.call(this); } @@ -552,24 +549,24 @@ abstract class Success extends UploadState { abstract class _$$FailedCopyWith<$Res> { factory _$$FailedCopyWith(_$Failed value, $Res Function(_$Failed) then) = __$$FailedCopyWithImpl<$Res>; + @useResult $Res call({String error}); } /// @nodoc -class __$$FailedCopyWithImpl<$Res> extends _$UploadStateCopyWithImpl<$Res> +class __$$FailedCopyWithImpl<$Res> + extends _$UploadStateCopyWithImpl<$Res, _$Failed> implements _$$FailedCopyWith<$Res> { __$$FailedCopyWithImpl(_$Failed _value, $Res Function(_$Failed) _then) - : super(_value, (v) => _then(v as _$Failed)); - - @override - _$Failed get _value => super._value as _$Failed; + : super(_value, _then); + @pragma('vm:prefer-inline') @override $Res call({ - Object? error = freezed, + Object? error = null, }) { return _then(_$Failed( - error: error == freezed + error: null == error ? _value.error : error // ignore: cast_nullable_to_non_nullable as String, @@ -603,16 +600,16 @@ class _$Failed extends Failed { return identical(this, other) || (other.runtimeType == runtimeType && other is _$Failed && - const DeepCollectionEquality().equals(other.error, error)); + (identical(other.error, error) || other.error == error)); } @JsonKey(ignore: true) @override - int get hashCode => - Object.hash(runtimeType, const DeepCollectionEquality().hash(error)); + int get hashCode => Object.hash(runtimeType, error); @JsonKey(ignore: true) @override + @pragma('vm:prefer-inline') _$$FailedCopyWith<_$Failed> get copyWith => __$$FailedCopyWithImpl<_$Failed>(this, _$identity); @@ -630,10 +627,10 @@ class _$Failed extends Failed { @override @optionalTypeArgs TResult? whenOrNull({ - TResult Function()? preparing, - TResult Function(int uploaded, int total)? inProgress, - TResult Function()? success, - TResult Function(String error)? failed, + TResult? Function()? preparing, + TResult? Function(int uploaded, int total)? inProgress, + TResult? Function()? success, + TResult? Function(String error)? failed, }) { return failed?.call(error); } @@ -667,10 +664,10 @@ class _$Failed extends Failed { @override @optionalTypeArgs TResult? mapOrNull({ - TResult Function(Preparing value)? preparing, - TResult Function(InProgress value)? inProgress, - TResult Function(Success value)? success, - TResult Function(Failed value)? failed, + TResult? Function(Preparing value)? preparing, + TResult? Function(InProgress value)? inProgress, + TResult? Function(Success value)? success, + TResult? Function(Failed value)? failed, }) { return failed?.call(this); } diff --git a/packages/stream_chat/lib/src/core/models/channel_model.dart b/packages/stream_chat/lib/src/core/models/channel_model.dart index 8d01f89d..00fa1fcc 100644 --- a/packages/stream_chat/lib/src/core/models/channel_model.dart +++ b/packages/stream_chat/lib/src/core/models/channel_model.dart @@ -62,19 +62,19 @@ class ChannelModel { final String type; /// The cid of this channel - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final String cid; /// List of user permissions on this channel - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final List? ownCapabilities; /// The channel configuration data - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final ChannelConfig config; /// The user that created this channel - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final User? createdBy; /// True if this channel is frozen @@ -82,23 +82,23 @@ class ChannelModel { final bool frozen; /// The date of the last message - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final DateTime? lastMessageAt; /// The date of channel creation - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final DateTime createdAt; /// The date of the last channel update - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final DateTime updatedAt; /// The date of channel deletion - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final DateTime? deletedAt; /// The count of this channel members - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final int memberCount; /// The number of seconds in a cooldown @@ -106,15 +106,15 @@ class ChannelModel { final int cooldown; /// True if the channel is disabled - @JsonKey(ignore: true) + @JsonKey(includeToJson: false, includeFromJson: false) bool? get disabled => extraData['disabled'] as bool?; /// True if the channel is hidden - @JsonKey(ignore: true) + @JsonKey(includeToJson: false, includeFromJson: false) bool? get hidden => extraData['hidden'] as bool?; /// The date of the last time channel got truncated - @JsonKey(ignore: true) + @JsonKey(includeToJson: false, includeFromJson: false) DateTime? get truncatedAt { final truncatedAt = extraData['truncated_at'] as String?; if (truncatedAt == null) return null; @@ -122,11 +122,10 @@ class ChannelModel { } /// Map of custom channel extraData - @JsonKey(includeIfNull: false) final Map extraData; /// The team the channel belongs to - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final String? team; /// Known top level fields. diff --git a/packages/stream_chat/lib/src/core/models/channel_model.g.dart b/packages/stream_chat/lib/src/core/models/channel_model.g.dart index 9bd8f062..b1a691e3 100644 --- a/packages/stream_chat/lib/src/core/models/channel_model.g.dart +++ b/packages/stream_chat/lib/src/core/models/channel_model.g.dart @@ -38,30 +38,11 @@ ChannelModel _$ChannelModelFromJson(Map json) => ChannelModel( cooldown: json['cooldown'] as int? ?? 0, ); -Map _$ChannelModelToJson(ChannelModel instance) { - final val = { - 'id': instance.id, - 'type': instance.type, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('cid', readonly(instance.cid)); - writeNotNull('own_capabilities', readonly(instance.ownCapabilities)); - writeNotNull('config', readonly(instance.config)); - writeNotNull('created_by', readonly(instance.createdBy)); - val['frozen'] = instance.frozen; - writeNotNull('last_message_at', readonly(instance.lastMessageAt)); - writeNotNull('created_at', readonly(instance.createdAt)); - writeNotNull('updated_at', readonly(instance.updatedAt)); - writeNotNull('deleted_at', readonly(instance.deletedAt)); - writeNotNull('member_count', readonly(instance.memberCount)); - val['cooldown'] = instance.cooldown; - val['extra_data'] = instance.extraData; - writeNotNull('team', readonly(instance.team)); - return val; -} +Map _$ChannelModelToJson(ChannelModel instance) => + { + 'id': instance.id, + 'type': instance.type, + 'frozen': instance.frozen, + 'cooldown': instance.cooldown, + 'extra_data': instance.extraData, + }; diff --git a/packages/stream_chat/lib/src/core/models/message.dart b/packages/stream_chat/lib/src/core/models/message.dart index 017bb06f..f8631e1c 100644 --- a/packages/stream_chat/lib/src/core/models/message.dart +++ b/packages/stream_chat/lib/src/core/models/message.dart @@ -95,14 +95,11 @@ class Message extends Equatable { final String? text; /// The status of a sending message. - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) final MessageSendingStatus status; /// The message type. - @JsonKey( - includeIfNull: false, - toJson: Serializer.readOnly, - ) + @JsonKey(includeToJson: false) final String type; /// The list of attachments, either provided by the user or generated from a @@ -115,26 +112,26 @@ class Message extends Equatable { final List mentionedUsers; /// A map describing the count of number of every reaction. - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final Map? reactionCounts; /// A map describing the count of score of every reaction. - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final Map? reactionScores; /// The latest reactions to the message created by any user. - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final List? latestReactions; /// The reactions added to the message by the current user. - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final List? ownReactions; /// The ID of the parent message, if the message is a thread reply. final String? parentId; /// A quoted reply message. - @JsonKey(toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final Message? quotedMessage; final String? _quotedMessageId; @@ -143,11 +140,11 @@ class Message extends Equatable { String? get quotedMessageId => _quotedMessageId ?? quotedMessage?.id; /// Reserved field indicating the number of replies for this message. - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final int? replyCount; /// Reserved field indicating the thread participants for this message. - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final List? threadParticipants; /// Check if this message needs to show in the channel. @@ -157,41 +154,38 @@ class Message extends Equatable { final bool silent; /// If true the message is shadowed. - @JsonKey( - includeIfNull: false, - toJson: Serializer.readOnly, - ) + @JsonKey(includeToJson: false) final bool shadowed; /// A used command name. - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final String? command; final DateTime? _createdAt; /// Reserved field indicating when the message was deleted. - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final DateTime? deletedAt; /// Reserved field indicating when the message was created. - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) DateTime get createdAt => _createdAt ?? DateTime.now(); final DateTime? _updatedAt; /// Reserved field indicating when the message was updated last time. - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) DateTime get updatedAt => _updatedAt ?? DateTime.now(); /// User who sent the message. - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final User? user; /// If true the message is pinned. final bool pinned; /// Reserved field indicating when the message was pinned. - @JsonKey(toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final DateTime? pinnedAt; /// Reserved field indicating when the message will expire. @@ -200,11 +194,10 @@ class Message extends Equatable { final DateTime? pinExpires; /// Reserved field indicating who pinned the message. - @JsonKey(toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final User? pinnedBy; /// Message custom extraData. - @JsonKey(includeIfNull: false) final Map extraData; /// True if the message is a system info. @@ -217,7 +210,7 @@ class Message extends Equatable { bool get isEphemeral => type == 'ephemeral'; /// A Map of translations. - @JsonKey(includeIfNull: false) + @JsonKey(includeToJson: false) final Map? i18n; /// Known top level fields. diff --git a/packages/stream_chat/lib/src/core/models/message.g.dart b/packages/stream_chat/lib/src/core/models/message.g.dart index e2ff89b4..506ac7a9 100644 --- a/packages/stream_chat/lib/src/core/models/message.g.dart +++ b/packages/stream_chat/lib/src/core/models/message.g.dart @@ -71,43 +71,16 @@ Message _$MessageFromJson(Map json) => Message( ), ); -Map _$MessageToJson(Message instance) { - final val = { - 'id': instance.id, - 'text': instance.text, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('type', readonly(instance.type)); - val['attachments'] = instance.attachments.map((e) => e.toJson()).toList(); - val['mentioned_users'] = User.toIds(instance.mentionedUsers); - writeNotNull('reaction_counts', readonly(instance.reactionCounts)); - writeNotNull('reaction_scores', readonly(instance.reactionScores)); - writeNotNull('latest_reactions', readonly(instance.latestReactions)); - writeNotNull('own_reactions', readonly(instance.ownReactions)); - val['parent_id'] = instance.parentId; - val['quoted_message'] = readonly(instance.quotedMessage); - val['quoted_message_id'] = instance.quotedMessageId; - writeNotNull('reply_count', readonly(instance.replyCount)); - writeNotNull('thread_participants', readonly(instance.threadParticipants)); - val['show_in_channel'] = instance.showInChannel; - val['silent'] = instance.silent; - writeNotNull('shadowed', readonly(instance.shadowed)); - writeNotNull('command', readonly(instance.command)); - writeNotNull('deleted_at', readonly(instance.deletedAt)); - writeNotNull('created_at', readonly(instance.createdAt)); - writeNotNull('updated_at', readonly(instance.updatedAt)); - writeNotNull('user', readonly(instance.user)); - val['pinned'] = instance.pinned; - val['pinned_at'] = readonly(instance.pinnedAt); - val['pin_expires'] = instance.pinExpires?.toIso8601String(); - val['pinned_by'] = readonly(instance.pinnedBy); - val['extra_data'] = instance.extraData; - writeNotNull('i18n', instance.i18n); - return val; -} +Map _$MessageToJson(Message instance) => { + 'id': instance.id, + 'text': instance.text, + 'attachments': instance.attachments.map((e) => e.toJson()).toList(), + 'mentioned_users': User.toIds(instance.mentionedUsers), + 'parent_id': instance.parentId, + 'quoted_message_id': instance.quotedMessageId, + 'show_in_channel': instance.showInChannel, + 'silent': instance.silent, + 'pinned': instance.pinned, + 'pin_expires': instance.pinExpires?.toIso8601String(), + 'extra_data': instance.extraData, + }; diff --git a/packages/stream_chat/lib/src/core/models/reaction.dart b/packages/stream_chat/lib/src/core/models/reaction.dart index f16fb09f..474b6dff 100644 --- a/packages/stream_chat/lib/src/core/models/reaction.dart +++ b/packages/stream_chat/lib/src/core/models/reaction.dart @@ -33,22 +33,21 @@ class Reaction { final String type; /// The date of the reaction - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final DateTime createdAt; /// The user that sent the reaction - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final User? user; /// The score of the reaction (ie. number of reactions sent) final int score; /// The userId that sent the reaction - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final String? userId; /// Reaction custom extraData - @JsonKey(includeIfNull: false) final Map extraData; /// Map of custom user extraData diff --git a/packages/stream_chat/lib/src/core/models/reaction.g.dart b/packages/stream_chat/lib/src/core/models/reaction.g.dart index 3554106d..6dcac5e1 100644 --- a/packages/stream_chat/lib/src/core/models/reaction.g.dart +++ b/packages/stream_chat/lib/src/core/models/reaction.g.dart @@ -20,22 +20,9 @@ Reaction _$ReactionFromJson(Map json) => Reaction( extraData: json['extra_data'] as Map? ?? const {}, ); -Map _$ReactionToJson(Reaction instance) { - final val = { - 'message_id': instance.messageId, - 'type': instance.type, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('created_at', readonly(instance.createdAt)); - writeNotNull('user', readonly(instance.user)); - val['score'] = instance.score; - writeNotNull('user_id', readonly(instance.userId)); - val['extra_data'] = instance.extraData; - return val; -} +Map _$ReactionToJson(Reaction instance) => { + 'message_id': instance.messageId, + 'type': instance.type, + 'score': instance.score, + 'extra_data': instance.extraData, + }; diff --git a/packages/stream_chat/lib/src/core/models/user.dart b/packages/stream_chat/lib/src/core/models/user.dart index 6cce01df..a280d18c 100644 --- a/packages/stream_chat/lib/src/core/models/user.dart +++ b/packages/stream_chat/lib/src/core/models/user.dart @@ -79,7 +79,7 @@ class User extends Equatable { /// Shortcut for user name. /// /// {@macro name} - @JsonKey(ignore: true) + @JsonKey(includeToJson: false, includeFromJson: false) String get name { if (extraData.containsKey('name') && extraData['name'] != null) { final name = extraData['name']! as String; @@ -91,48 +91,39 @@ class User extends Equatable { /// Shortcut for user image. /// /// {@macro image} - @JsonKey(ignore: true) + @JsonKey(includeToJson: false, includeFromJson: false) String? get image => extraData['image'] as String?; /// User role. - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final String? role; /// User teams - @JsonKey( - includeIfNull: false, - toJson: Serializer.readOnly, - ) + @JsonKey(includeToJson: false) final List teams; /// Date of user creation. - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final DateTime createdAt; /// Date of last user update. - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final DateTime updatedAt; /// Date of last user connection. - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final DateTime? lastActive; /// True if user is online. - @JsonKey( - includeIfNull: false, - toJson: Serializer.readOnly, - ) + @JsonKey(includeToJson: false) final bool online; /// True if user is banned from the chat. - @JsonKey( - includeIfNull: false, - toJson: Serializer.readOnly, - ) + @JsonKey(includeToJson: false) final bool banned; /// The date at which the ban will expire. - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) + @JsonKey(includeToJson: false) final DateTime? banExpires; /// The language this user prefers. @@ -140,7 +131,6 @@ class User extends Equatable { final String? language; /// Map of custom user extraData. - @JsonKey(includeIfNull: false) final Map extraData; /// List of users to list of userIds. diff --git a/packages/stream_chat/lib/src/core/models/user.g.dart b/packages/stream_chat/lib/src/core/models/user.g.dart index 9e6ae3dc..47094ffc 100644 --- a/packages/stream_chat/lib/src/core/models/user.g.dart +++ b/packages/stream_chat/lib/src/core/models/user.g.dart @@ -41,14 +41,6 @@ Map _$UserToJson(User instance) { } } - writeNotNull('role', readonly(instance.role)); - writeNotNull('teams', readonly(instance.teams)); - writeNotNull('created_at', readonly(instance.createdAt)); - writeNotNull('updated_at', readonly(instance.updatedAt)); - writeNotNull('last_active', readonly(instance.lastActive)); - writeNotNull('online', readonly(instance.online)); - writeNotNull('banned', readonly(instance.banned)); - writeNotNull('ban_expires', readonly(instance.banExpires)); writeNotNull('language', instance.language); val['extra_data'] = instance.extraData; return val; diff --git a/packages/stream_chat/lib/src/core/util/serializer.dart b/packages/stream_chat/lib/src/core/util/serializer.dart index 2bf92e39..9c1cb71f 100644 --- a/packages/stream_chat/lib/src/core/util/serializer.dart +++ b/packages/stream_chat/lib/src/core/util/serializer.dart @@ -1,12 +1,5 @@ -/// Used to avoid to serialize properties to json -// ignore: prefer_void_to_null -Null readonly(_) => null; - /// Helper class for serialization to and from json class Serializer { - /// Used to avoid to serialize properties to json - static const Function readOnly = readonly; - /// Takes unknown json keys and puts them in the `extra_data` key static Map moveToExtraDataFromRoot( Map json, diff --git a/packages/stream_chat/lib/src/event_type.dart b/packages/stream_chat/lib/src/event_type.dart index b553943e..f8fb7ed7 100644 --- a/packages/stream_chat/lib/src/event_type.dart +++ b/packages/stream_chat/lib/src/event_type.dart @@ -36,6 +36,12 @@ class EventType { /// Event sent when updating a message static const String messageUpdated = 'message.updated'; + /// Event sent when a user starts watching a channel + static const String userWatchingStart = 'user.watching.start'; + + /// Event sent when a user stops watching a channel + static const String userWatchingStop = 'user.watching.stop'; + /// Event sent when reading a message static const String messageRead = 'message.read'; diff --git a/packages/stream_chat/pubspec.yaml b/packages/stream_chat/pubspec.yaml index 67eb5a21..fe2bfe00 100644 --- a/packages/stream_chat/pubspec.yaml +++ b/packages/stream_chat/pubspec.yaml @@ -9,26 +9,26 @@ environment: sdk: '>=2.17.0 <3.0.0' dependencies: - async: ^2.5.0 - collection: ^1.15.0 - dio: ^4.0.0 - equatable: ^2.0.0 - freezed_annotation: ^2.0.3 - http_parser: ^4.0.0 - jose: ^0.3.2 - json_annotation: ^4.5.0 - logging: ^1.0.1 - meta: ^1.3.0 - mime: ^1.0.0 + async: ^2.10.0 + collection: ^1.17.0 + dio: ^5.1.1 + equatable: ^2.0.5 + freezed_annotation: ^2.2.0 + http_parser: ^4.0.2 + jose: ^0.3.3 + json_annotation: ^4.8.0 + logging: ^1.1.1 + meta: ^1.8.0 + mime: ^1.0.4 rate_limiter: ^1.0.0 - rxdart: ^0.27.0 - uuid: ^3.0.4 - web_socket_channel: ^2.0.0 + rxdart: ^0.27.7 + uuid: ^3.0.7 + web_socket_channel: ^2.3.0 dev_dependencies: - build_runner: ^2.0.1 - dart_code_metrics: ^4.4.0 - freezed: ^2.0.3 - json_serializable: ^6.2.0 + build_runner: ^2.3.3 + dart_code_metrics: ^5.7.0 + freezed: ^2.3.2 + json_serializable: ^6.6.1 mocktail: ^0.3.0 - test: ^1.17.12 + test: ^1.24.1 diff --git a/packages/stream_chat/test/fixtures/channel_state_to_json.json b/packages/stream_chat/test/fixtures/channel_state_to_json.json index c0c06f9e..aedc5ccd 100644 --- a/packages/stream_chat/test/fixtures/channel_state_to_json.json +++ b/packages/stream_chat/test/fixtures/channel_state_to_json.json @@ -1,4 +1,3 @@ - { "channel": { "id": "dev", @@ -18,400 +17,325 @@ "text": "fasdfa", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "dry-meadow-0-e8e74482-b4cd-48db-9d1e-30e6c191786f", "text": "test message", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "dry-meadow-0-53e6299f-9b97-4a9c-a27e-7e2dde49b7e0", "text": "test message", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "dry-meadow-0-80925be0-786e-40a5-b225-486518dafd35", "text": "asdfadf", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "dry-meadow-0-64d7970f-ede8-4b31-9738-1bc1756d2bfe", "text": "test", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "withered-cell-0-84cbd760-cf55-4f7e-9207-c5f66cccc6dc", "text": "hi", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "dry-meadow-0-e9203588-43c3-40b1-91f7-f217fc42aa53", "text": "fantastic", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "withered-cell-0-7e3552d7-7a0d-45f2-a856-e91b23a7e240", "text": "nice to meet you", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "dry-meadow-0-1ffeafd4-e4fc-4c84-9394-9d7cb10fff42", "text": "hey", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "dry-meadow-0-3f147324-12c8-4b41-9fb5-2db88d065efa", "text": "hello, everyone", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "dry-meadow-0-51a348ae-0c0a-44de-a556-eac7891c0cf0", "text": "who is there?", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "icy-recipe-7-a29e237b-8d81-4a97-9bc8-d42bca3f1356", "text": "ν•˜μ΄", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "icy-recipe-7-935c396e-ddf8-4a9a-951c-0a12fa5bf055", "text": "what are you doing?", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "throbbing-boat-5-1e4d5730-5ff0-4d25-9948-9f34ffda43e4", "text": "πŸ‘", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "snowy-credit-3-3e0c1a0d-d22f-42ee-b2a1-f9f49477bf21", "text": "sdasas", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "snowy-credit-3-3319537e-2d0e-4876-8170-a54f046e4b7d", "text": "cjshsa", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "snowy-credit-3-cfaf0b46-1daa-49c5-947c-b16d6697487d", "text": "nhisagdhsadz", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "snowy-credit-3-cebe25a7-a3a3-49fc-9919-91c6725e81f3", "text": "hvadhsahzd", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "divine-glade-9-0cea9262-5766-48e9-8b22-311870aed3bf", "text": "hello", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "red-firefly-9-c4e9007b-bb7d-4238-ae08-5f8e3cd03d73", "text": "hello", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "bitter-glade-2-02aee4eb-4093-4736-808b-2de75820e854", "text": "hello", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "morning-sea-1-0c700bcb-46dd-4224-b590-e77bdbccc480", "text": "http://jaeger.ui.gtstrm.com/", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "ancient-salad-0-53e8b4e6-5b7b-43ad-aeee-8bfb6a9ed0be", "text": "hi", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "ancient-salad-0-8c225075-bd4c-42e2-8024-530aae13cd40", "text": "hi", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null }, { "id": "proud-sea-7-17802096-cbf8-4e3c-addd-4ee31f4c8b5c", "text": "πŸ˜ƒ", "attachments": [], "parent_id": null, - "quoted_message": null, "quoted_message_id": null, "show_in_channel": null, "mentioned_users": [], "status": "SENT", "silent": false, "pinned": false, - "pinned_at": null, - "pin_expires": null, - "pinned_by": null + "pin_expires": null } ], "pinned_messages": [], diff --git a/packages/stream_chat/test/fixtures/message_to_json.json b/packages/stream_chat/test/fixtures/message_to_json.json index b3b1dd6b..bfd9d71c 100644 --- a/packages/stream_chat/test/fixtures/message_to_json.json +++ b/packages/stream_chat/test/fixtures/message_to_json.json @@ -18,12 +18,9 @@ ], "mentioned_users": [], "parent_id": "parentId", - "quoted_message": null, "quoted_message_id": null, "pinned": false, - "pinned_at": null, "pin_expires": null, - "pinned_by": null, "show_in_channel": true, "hey": "test" } \ No newline at end of file diff --git a/packages/stream_chat/test/src/core/api/message_api_test.dart b/packages/stream_chat/test/src/core/api/message_api_test.dart index ed7fefd6..8ae82e94 100644 --- a/packages/stream_chat/test/src/core/api/message_api_test.dart +++ b/packages/stream_chat/test/src/core/api/message_api_test.dart @@ -394,7 +394,12 @@ void main() { path, data: {'language': language}, )).thenAnswer((_) async => successResponse(path, data: { - 'message': translatedMessage.toJson(), + 'message': { + ...translatedMessage.toJson(), + 'i18n': { + language: translatedMessageText, + }, + }, })); final res = await messageApi.translateMessage(messageId, language); diff --git a/packages/stream_chat/test/src/core/http/stream_http_client_test.dart b/packages/stream_chat/test/src/core/http/stream_http_client_test.dart index 6abed8ae..4854b98f 100644 --- a/packages/stream_chat/test/src/core/http/stream_http_client_test.dart +++ b/packages/stream_chat/test/src/core/http/stream_http_client_test.dart @@ -129,7 +129,11 @@ void main() { await client.get('path'); } on StreamChatNetworkError catch (e) { expect(e, isA()); - expect(e.message, "Dio can't establish new connection after closed."); + expect( + e.message, + "The connection errored: Dio can't establish a new connection" + ' after it was closed.', + ); } }); diff --git a/packages/stream_chat_flutter/CHANGELOG.md b/packages/stream_chat_flutter/CHANGELOG.md index 20c9cd51..61ab52cc 100644 --- a/packages/stream_chat_flutter/CHANGELOG.md +++ b/packages/stream_chat_flutter/CHANGELOG.md @@ -1,3 +1,19 @@ +## Upcoming + +🐞 Fixed + +- [#1462](https://github.com/GetStream/stream-chat-flutter/issues/1462) Fixed support for iPad in the share button for images. +- [#1475](https://github.com/GetStream/stream-chat-flutter/issues/1475) Fixed typo to fix compilation. + +βœ… Added + +- Now it is possible to customize the max lines of the title of a url attachment. Before it was always 1 line. +- Added `attachmentActionsModalBuilder` parameter to `StreamMessageWidget` that allows to customize `AttachmentActionsModal`. + +πŸ”„ Changed + +- Updated dependencies to resolvable versions. + ## 5.3.0 πŸ”„ Changed diff --git a/packages/stream_chat_flutter/example/ios/Runner.xcodeproj/project.pbxproj b/packages/stream_chat_flutter/example/ios/Runner.xcodeproj/project.pbxproj index 9b47e613..e5d8f743 100644 --- a/packages/stream_chat_flutter/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/stream_chat_flutter/example/ios/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -199,6 +199,7 @@ /* Begin PBXShellScriptBuildPhase section */ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -235,6 +236,7 @@ }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); diff --git a/packages/stream_chat_flutter/example/ios/Runner/Info.plist b/packages/stream_chat_flutter/example/ios/Runner/Info.plist index 299ebd4c..d49f0173 100644 --- a/packages/stream_chat_flutter/example/ios/Runner/Info.plist +++ b/packages/stream_chat_flutter/example/ios/Runner/Info.plist @@ -61,5 +61,7 @@ Explain why your app uses the mic CADisableMinimumFrameDurationOnPhone + UIApplicationSupportsIndirectInputEvents + diff --git a/packages/stream_chat_flutter/example/lib/main.dart b/packages/stream_chat_flutter/example/lib/main.dart index c8978a45..e4f291fe 100644 --- a/packages/stream_chat_flutter/example/lib/main.dart +++ b/packages/stream_chat_flutter/example/lib/main.dart @@ -177,7 +177,7 @@ class _SplitViewState extends State { : Center( child: Text( 'Pick a channel to show the messages πŸ’¬', - style: Theme.of(context).textTheme.headline5, + style: Theme.of(context).textTheme.headlineSmall, ), ), ), diff --git a/packages/stream_chat_flutter/example/lib/split_view.dart b/packages/stream_chat_flutter/example/lib/split_view.dart index 2ae8e8aa..bbfe6301 100644 --- a/packages/stream_chat_flutter/example/lib/split_view.dart +++ b/packages/stream_chat_flutter/example/lib/split_view.dart @@ -78,7 +78,7 @@ class _SplitViewState extends State { : Center( child: Text( 'Pick a channel to show the messages πŸ’¬', - style: Theme.of(context).textTheme.headline5, + style: Theme.of(context).textTheme.headlineSmall, ), ), ), diff --git a/packages/stream_chat_flutter/example/lib/tutorial_part_6.dart b/packages/stream_chat_flutter/example/lib/tutorial_part_6.dart index cd80af44..dca8eaa1 100644 --- a/packages/stream_chat_flutter/example/lib/tutorial_part_6.dart +++ b/packages/stream_chat_flutter/example/lib/tutorial_part_6.dart @@ -74,6 +74,9 @@ class MyApp extends StatelessWidget { fit: BoxFit.cover, ), ), + ownMessageTheme: const StreamMessageThemeData( + urlAttachmentTitleMaxLine: 1, + ), otherMessageTheme: StreamMessageThemeData( messageBackgroundColor: colorTheme.textHighEmphasis, messageTextStyle: TextStyle( @@ -82,6 +85,7 @@ class MyApp extends StatelessWidget { avatarTheme: StreamAvatarThemeData( borderRadius: BorderRadius.circular(8), ), + urlAttachmentTitleMaxLine: 1, ), ).merge(defaultTheme); diff --git a/packages/stream_chat_flutter/example/linux/flutter/generated_plugin_registrant.cc b/packages/stream_chat_flutter/example/linux/flutter/generated_plugin_registrant.cc index bb19d0b5..5d1305ad 100644 --- a/packages/stream_chat_flutter/example/linux/flutter/generated_plugin_registrant.cc +++ b/packages/stream_chat_flutter/example/linux/flutter/generated_plugin_registrant.cc @@ -8,10 +8,9 @@ #include #include -#include +#include #include #include -#include void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) dart_vlc_registrar = @@ -20,16 +19,13 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) desktop_drop_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "DesktopDropPlugin"); desktop_drop_plugin_register_with_registrar(desktop_drop_registrar); - g_autoptr(FlPluginRegistrar) screen_retriever_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverPlugin"); - screen_retriever_plugin_register_with_registrar(screen_retriever_registrar); + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); g_autoptr(FlPluginRegistrar) sqlite3_flutter_libs_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "Sqlite3FlutterLibsPlugin"); sqlite3_flutter_libs_plugin_register_with_registrar(sqlite3_flutter_libs_registrar); g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); - g_autoptr(FlPluginRegistrar) window_manager_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "WindowManagerPlugin"); - window_manager_plugin_register_with_registrar(window_manager_registrar); } diff --git a/packages/stream_chat_flutter/example/linux/flutter/generated_plugins.cmake b/packages/stream_chat_flutter/example/linux/flutter/generated_plugins.cmake index fb9923e9..631f39a5 100644 --- a/packages/stream_chat_flutter/example/linux/flutter/generated_plugins.cmake +++ b/packages/stream_chat_flutter/example/linux/flutter/generated_plugins.cmake @@ -5,10 +5,9 @@ list(APPEND FLUTTER_PLUGIN_LIST dart_vlc desktop_drop - screen_retriever + file_selector_linux sqlite3_flutter_libs url_launcher_linux - window_manager ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/packages/stream_chat_flutter/example/macos/Runner.xcodeproj/project.pbxproj b/packages/stream_chat_flutter/example/macos/Runner.xcodeproj/project.pbxproj index f8c105bb..747ee4d9 100644 --- a/packages/stream_chat_flutter/example/macos/Runner.xcodeproj/project.pbxproj +++ b/packages/stream_chat_flutter/example/macos/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 54; objects = { /* Begin PBXAggregateTarget section */ @@ -203,7 +203,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 0930; + LastUpgradeCheck = 1300; ORGANIZATIONNAME = ""; TargetAttributes = { 33CC10EC2044A3C60003C045 = { @@ -256,6 +256,7 @@ /* Begin PBXShellScriptBuildPhase section */ 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -404,7 +405,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; @@ -484,7 +485,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -531,7 +532,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; diff --git a/packages/stream_chat_flutter/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/stream_chat_flutter/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index ae8ff59d..7fd7126b 100644 --- a/packages/stream_chat_flutter/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/stream_chat_flutter/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ =2.17.0 <3.0.0' + flutter: ">=1.17.0" dependencies: # The following adds the Cupertino Icons font to your application. @@ -27,7 +28,7 @@ dependencies: cupertino_icons: ^1.0.4 flutter: sdk: flutter - responsive_builder: ^0.4.2 + responsive_builder: ^0.6.4 stream_chat_flutter: path: ../ stream_chat_localizations: diff --git a/packages/stream_chat_flutter/example/windows/flutter/generated_plugin_registrant.cc b/packages/stream_chat_flutter/example/windows/flutter/generated_plugin_registrant.cc index c01a56ac..0402854c 100644 --- a/packages/stream_chat_flutter/example/windows/flutter/generated_plugin_registrant.cc +++ b/packages/stream_chat_flutter/example/windows/flutter/generated_plugin_registrant.cc @@ -6,16 +6,14 @@ #include "generated_plugin_registrant.h" -#include +#include #include #include #include -#include -#include +#include #include #include #include -#include void RegisterPlugins(flutter::PluginRegistry* registry) { ConnectivityPlusWindowsPluginRegisterWithRegistrar( @@ -26,16 +24,12 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("DesktopDropPlugin")); FileSelectorWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("FileSelectorWindows")); - FlutterNativeViewPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("FlutterNativeViewPlugin")); - ScreenRetrieverPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("ScreenRetrieverPlugin")); + SharePlusWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); Sqlite3FlutterLibsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("Sqlite3FlutterLibsPlugin")); ThumblrWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("ThumblrWindowsPlugin")); UrlLauncherWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("UrlLauncherWindows")); - WindowManagerPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("WindowManagerPlugin")); } diff --git a/packages/stream_chat_flutter/example/windows/flutter/generated_plugins.cmake b/packages/stream_chat_flutter/example/windows/flutter/generated_plugins.cmake index 72783874..aeb58c22 100644 --- a/packages/stream_chat_flutter/example/windows/flutter/generated_plugins.cmake +++ b/packages/stream_chat_flutter/example/windows/flutter/generated_plugins.cmake @@ -3,16 +3,14 @@ # list(APPEND FLUTTER_PLUGIN_LIST - connectivity_plus_windows + connectivity_plus dart_vlc desktop_drop file_selector_windows - flutter_native_view - screen_retriever + share_plus sqlite3_flutter_libs thumblr_windows url_launcher_windows - window_manager ) list(APPEND FLUTTER_FFI_PLUGIN_LIST 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 563beb8d..be756aca 100644 --- a/packages/stream_chat_flutter/lib/src/attachment/giphy_attachment.dart +++ b/packages/stream_chat_flutter/lib/src/attachment/giphy_attachment.dart @@ -17,6 +17,7 @@ class StreamGiphyAttachment extends StreamAttachmentWidget { this.onShowMessage, this.onReplyMessage, this.onAttachmentTap, + this.attachmentActionsModalBuilder, }); /// {@macro showMessageCallback} @@ -28,6 +29,9 @@ class StreamGiphyAttachment extends StreamAttachmentWidget { /// {@macro onAttachmentTap} final OnAttachmentTap? onAttachmentTap; + /// {@macro attachmentActionsBuilder} + final AttachmentActionsBuilder? attachmentActionsModalBuilder; + @override Widget build(BuildContext context) { final imageUrl = @@ -260,6 +264,7 @@ class StreamGiphyAttachment extends StreamAttachmentWidget { userName: message.user!.name, onShowMessage: onShowMessage, onReplyMessage: onReplyMessage, + attachmentActionsModalBuilder: attachmentActionsModalBuilder, ), ); }, 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 6a6ee780..36a0df3a 100644 --- a/packages/stream_chat_flutter/lib/src/attachment/image_attachment.dart +++ b/packages/stream_chat_flutter/lib/src/attachment/image_attachment.dart @@ -22,6 +22,7 @@ class StreamImageAttachment extends StreamAttachmentWidget { this.imageThumbnailSize = const Size(400, 400), this.imageThumbnailResizeType = 'clip', this.imageThumbnailCropType = 'center', + this.attachmentActionsModalBuilder, }); /// The [StreamMessageThemeData] to use for the image title @@ -52,6 +53,9 @@ class StreamImageAttachment extends StreamAttachmentWidget { /// Defaults to [center] final String /*center|top|bottom|left|right*/ imageThumbnailCropType; + /// {@macro attachmentActionsBuilder} + final AttachmentActionsBuilder? attachmentActionsModalBuilder; + @override Widget build(BuildContext context) { return source.when( @@ -161,6 +165,8 @@ class StreamImageAttachment extends StreamAttachmentWidget { userName: message.user!.name, onShowMessage: onShowMessage, onReplyMessage: onReplyMessage, + attachmentActionsModalBuilder: + attachmentActionsModalBuilder, ), ); }, diff --git a/packages/stream_chat_flutter/lib/src/attachment/image_group.dart b/packages/stream_chat_flutter/lib/src/attachment/image_group.dart index 6b7859fd..5756b24a 100644 --- a/packages/stream_chat_flutter/lib/src/attachment/image_group.dart +++ b/packages/stream_chat_flutter/lib/src/attachment/image_group.dart @@ -18,6 +18,7 @@ class StreamImageGroup extends StatelessWidget { this.imageThumbnailSize = const Size(400, 400), this.imageThumbnailResizeType = 'clip', this.imageThumbnailCropType = 'center', + this.attachmentActionsModalBuilder, }); /// List of attachments to show @@ -54,6 +55,9 @@ class StreamImageGroup extends StatelessWidget { /// Defaults to [center] final String /*center|top|bottom|left|right*/ imageThumbnailCropType; + /// {@macro attachmentActionsBuilder} + final AttachmentActionsBuilder? attachmentActionsModalBuilder; + @override Widget build(BuildContext context) { return ConstrainedBox( @@ -154,6 +158,7 @@ class StreamImageGroup extends StatelessWidget { userName: message.user!.name, onShowMessage: onShowMessage, onReplyMessage: onReplyMessage, + attachmentActionsModalBuilder: attachmentActionsModalBuilder, ), ), ), @@ -170,6 +175,7 @@ class StreamImageGroup extends StatelessWidget { imageThumbnailSize: imageThumbnailSize, imageThumbnailResizeType: imageThumbnailResizeType, imageThumbnailCropType: imageThumbnailCropType, + attachmentActionsModalBuilder: attachmentActionsModalBuilder, ); } } diff --git a/packages/stream_chat_flutter/lib/src/attachment/url_attachment.dart b/packages/stream_chat_flutter/lib/src/attachment/url_attachment.dart index ce166195..10170bb1 100644 --- a/packages/stream_chat_flutter/lib/src/attachment/url_attachment.dart +++ b/packages/stream_chat_flutter/lib/src/attachment/url_attachment.dart @@ -107,7 +107,7 @@ class StreamUrlAttachment extends StatelessWidget { if (urlAttachment.title != null) Text( urlAttachment.title!.trim(), - maxLines: 1, + maxLines: messageTheme.urlAttachmentTitleMaxLine ?? 1, overflow: TextOverflow.ellipsis, style: chatThemeData.textTheme.body .copyWith(fontWeight: FontWeight.w700), diff --git a/packages/stream_chat_flutter/lib/src/attachment/video_attachment.dart b/packages/stream_chat_flutter/lib/src/attachment/video_attachment.dart index b3aed834..10efca0b 100644 --- a/packages/stream_chat_flutter/lib/src/attachment/video_attachment.dart +++ b/packages/stream_chat_flutter/lib/src/attachment/video_attachment.dart @@ -17,6 +17,7 @@ class StreamVideoAttachment extends StreamAttachmentWidget { this.onShowMessage, this.onReplyMessage, this.onAttachmentTap, + this.attachmentActionsModalBuilder, }); /// The [StreamMessageThemeData] to use for the title @@ -31,6 +32,9 @@ class StreamVideoAttachment extends StreamAttachmentWidget { /// {@macro onAttachmentTap} final OnAttachmentTap? onAttachmentTap; + /// {@macro attachmentActionsBuilder} + final AttachmentActionsBuilder? attachmentActionsModalBuilder; + @override Widget build(BuildContext context) { return source.when( @@ -86,6 +90,8 @@ class StreamVideoAttachment extends StreamAttachmentWidget { userName: message.user!.name, onShowMessage: onShowMessage, onReplyMessage: onReplyMessage, + attachmentActionsModalBuilder: + attachmentActionsModalBuilder, ), ), ), diff --git a/packages/stream_chat_flutter/lib/src/channel/channel_header.dart b/packages/stream_chat_flutter/lib/src/channel/channel_header.dart index d8dce9ff..b97af492 100644 --- a/packages/stream_chat_flutter/lib/src/channel/channel_header.dart +++ b/packages/stream_chat_flutter/lib/src/channel/channel_header.dart @@ -162,8 +162,8 @@ class StreamChannelHeader extends StatelessWidget showMessage: showConnectionStateTile && showStatus, message: statusString, child: AppBar( - toolbarTextStyle: theme.textTheme.bodyText2, - titleTextStyle: theme.textTheme.headline6, + toolbarTextStyle: theme.textTheme.bodyMedium, + titleTextStyle: theme.textTheme.titleLarge, systemOverlayStyle: theme.brightness == Brightness.dark ? SystemUiOverlayStyle.light : SystemUiOverlayStyle.dark, diff --git a/packages/stream_chat_flutter/lib/src/channel/channel_list_header.dart b/packages/stream_chat_flutter/lib/src/channel/channel_list_header.dart index 95cf640d..20c214b1 100644 --- a/packages/stream_chat_flutter/lib/src/channel/channel_list_header.dart +++ b/packages/stream_chat_flutter/lib/src/channel/channel_list_header.dart @@ -131,8 +131,8 @@ class StreamChannelListHeader extends StatelessWidget showMessage: showConnectionStateTile && showStatus, message: statusString, child: AppBar( - toolbarTextStyle: theme.textTheme.bodyText2, - titleTextStyle: theme.textTheme.headline6, + toolbarTextStyle: theme.textTheme.bodyMedium, + titleTextStyle: theme.textTheme.titleLarge, systemOverlayStyle: theme.brightness == Brightness.dark ? SystemUiOverlayStyle.light : SystemUiOverlayStyle.dark, @@ -181,7 +181,10 @@ class StreamChannelListHeader extends StatelessWidget package: 'stream_chat_flutter', width: 24, height: 24, - color: color, + colorFilter: ColorFilter.mode( + color, + BlendMode.srcIn, + ), ); }, ), diff --git a/packages/stream_chat_flutter/lib/src/gallery/gallery_footer.dart b/packages/stream_chat_flutter/lib/src/gallery/gallery_footer.dart index e46ec3bc..98ae7df2 100644 --- a/packages/stream_chat_flutter/lib/src/gallery/gallery_footer.dart +++ b/packages/stream_chat_flutter/lib/src/gallery/gallery_footer.dart @@ -1,7 +1,6 @@ import 'dart:io'; import 'package:cached_network_image/cached_network_image.dart'; -import 'package:file_selector/file_selector.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:path_provider/path_provider.dart'; @@ -61,6 +60,7 @@ class StreamGalleryFooter extends StatefulWidget class _StreamGalleryFooterState extends State { final shareButtonKey = GlobalKey(); + @override Widget build(BuildContext context) { const showShareButton = !kIsWeb; @@ -108,12 +108,19 @@ class _StreamGalleryFooterState extends State { await file.writeAsBytes(bytes); final box = shareButtonKey.currentContext?.findRenderObject(); + final size = shareButtonKey.currentContext?.size; + final position = (box! as RenderBox).localToGlobal(Offset.zero); + await Share.shareXFiles( [XFile(filePath)], - sharePositionOrigin: - Rect.fromLTWH(position.dx, position.dy, 0, 0), + sharePositionOrigin: Rect.fromLTWH( + position.dx, + position.dy, + size?.width ?? 50, + (size?.height ?? 2) / 2, + ), ); }, ), diff --git a/packages/stream_chat_flutter/lib/src/gallery/gallery_header.dart b/packages/stream_chat_flutter/lib/src/gallery/gallery_header.dart index 866e3c5e..19aed6e6 100644 --- a/packages/stream_chat_flutter/lib/src/gallery/gallery_header.dart +++ b/packages/stream_chat_flutter/lib/src/gallery/gallery_header.dart @@ -80,8 +80,8 @@ class StreamGalleryHeader extends StatelessWidget final galleryHeaderThemeData = StreamGalleryHeaderTheme.of(context); final theme = Theme.of(context); return AppBar( - toolbarTextStyle: theme.textTheme.bodyText2, - titleTextStyle: theme.textTheme.headline6, + toolbarTextStyle: theme.textTheme.bodyMedium, + titleTextStyle: theme.textTheme.titleLarge, systemOverlayStyle: theme.brightness == Brightness.dark ? SystemUiOverlayStyle.light : SystemUiOverlayStyle.dark, 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 5a0fd63a..a04ab829 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 @@ -80,7 +80,6 @@ class StreamMessageTextField extends StatefulWidget { this.textAlignVertical, this.textDirection, this.readOnly = false, - ToolbarOptions? toolbarOptions, this.showCursor, this.autofocus = false, this.obscuringCharacter = 'β€’', @@ -155,31 +154,7 @@ class StreamMessageTextField extends StatefulWidget { keyboardType = keyboardType ?? (maxLines == 1 ? TextInputType.text : TextInputType.multiline), enableInteractiveSelection = - enableInteractiveSelection ?? (!readOnly || !obscureText), - toolbarOptions = toolbarOptions ?? - (obscureText - ? (readOnly - // No point in even offering "Select All" in a read-only obscured - // field. - ? const ToolbarOptions() - // Writable, but obscured. - : const ToolbarOptions( - selectAll: true, - paste: true, - )) - : (readOnly - // Read-only, not obscured. - ? const ToolbarOptions( - selectAll: true, - copy: true, - ) - // Writable, not obscured. - : const ToolbarOptions( - copy: true, - cut: true, - selectAll: true, - paste: true, - ))); + enableInteractiveSelection ?? (!readOnly || !obscureText); /// Controls the message being edited. /// @@ -304,13 +279,6 @@ class StreamMessageTextField extends StatefulWidget { /// {@macro flutter.widgets.editableText.readOnly} final bool readOnly; - /// Configuration of toolbar options. - /// - /// If not set, select all and paste will default to be enabled. Copy and cut - /// will be disabled if [obscureText] is true. If [readOnly] is true, - /// paste and cut will be disabled regardless. - final ToolbarOptions toolbarOptions; - /// {@macro flutter.widgets.editableText.showCursor} final bool? showCursor; @@ -720,7 +688,6 @@ class _StreamMessageTextFieldState extends State textAlignVertical: widget.textAlignVertical, textDirection: widget.textDirection, readOnly: widget.readOnly, - toolbarOptions: widget.toolbarOptions, showCursor: widget.showCursor, autofocus: widget.autofocus, obscuringCharacter: widget.obscuringCharacter, diff --git a/packages/stream_chat_flutter/lib/src/message_widget/message_widget.dart b/packages/stream_chat_flutter/lib/src/message_widget/message_widget.dart index 0975320f..7d51eb8b 100644 --- a/packages/stream_chat_flutter/lib/src/message_widget/message_widget.dart +++ b/packages/stream_chat_flutter/lib/src/message_widget/message_widget.dart @@ -107,6 +107,7 @@ class StreamMessageWidget extends StatefulWidget { this.imageAttachmentThumbnailSize = const Size(400, 400), this.imageAttachmentThumbnailResizeType = 'clip', this.imageAttachmentThumbnailCropType = 'center', + this.attachmentActionsModalBuilder, }) : assert( bottomRowBuilder == null || bottomRowBuilderWithDefaultWidget == null, 'You can only use one of the two bottom row builders', @@ -144,6 +145,8 @@ class StreamMessageWidget extends StatefulWidget { imageThumbnailResizeType: imageAttachmentThumbnailResizeType, imageThumbnailCropType: imageAttachmentThumbnailCropType, + attachmentActionsModalBuilder: + attachmentActionsModalBuilder, ), ), attachmentShape: border, @@ -171,6 +174,7 @@ class StreamMessageWidget extends StatefulWidget { imageThumbnailSize: imageAttachmentThumbnailSize, imageThumbnailResizeType: imageAttachmentThumbnailResizeType, imageThumbnailCropType: imageAttachmentThumbnailCropType, + attachmentActionsModalBuilder: attachmentActionsModalBuilder, ), attachmentShape: border, ); @@ -204,6 +208,8 @@ class StreamMessageWidget extends StatefulWidget { onAttachmentTap(message, attachment); } : null, + attachmentActionsModalBuilder: + attachmentActionsModalBuilder, ); }).toList(), ), @@ -533,6 +539,9 @@ class StreamMessageWidget extends StatefulWidget { /// {@macro onMessageWidgetAttachmentTap} final OnMessageWidgetAttachmentTap? onAttachmentTap; + /// {@macro attachmentActionsBuilder} + final AttachmentActionsBuilder? attachmentActionsModalBuilder; + /// Size of the image attachment thumbnail. final Size imageAttachmentThumbnailSize; @@ -617,6 +626,7 @@ class StreamMessageWidget extends StatefulWidget { Size? imageAttachmentThumbnailSize, String? imageAttachmentThumbnailResizeType, String? imageAttachmentThumbnailCropType, + AttachmentActionsBuilder? attachmentActionsModalBuilder, }) { assert( bottomRowBuilder == null || bottomRowBuilderWithDefaultWidget == null, @@ -703,6 +713,8 @@ class StreamMessageWidget extends StatefulWidget { this.imageAttachmentThumbnailResizeType, imageAttachmentThumbnailCropType: imageAttachmentThumbnailCropType ?? this.imageAttachmentThumbnailCropType, + attachmentActionsModalBuilder: + attachmentActionsModalBuilder ?? this.attachmentActionsModalBuilder, ); } diff --git a/packages/stream_chat_flutter/lib/src/misc/stream_svg_icon.dart b/packages/stream_chat_flutter/lib/src/misc/stream_svg_icon.dart index 8472af6e..a040bd42 100644 --- a/packages/stream_chat_flutter/lib/src/misc/stream_svg_icon.dart +++ b/packages/stream_chat_flutter/lib/src/misc/stream_svg_icon.dart @@ -1088,7 +1088,12 @@ class StreamSvgIcon extends StatelessWidget { key: key, width: width, height: height, - color: color, + colorFilter: color != null + ? ColorFilter.mode( + color!, + BlendMode.srcIn, + ) + : null, ); } } diff --git a/packages/stream_chat_flutter/lib/src/misc/thread_header.dart b/packages/stream_chat_flutter/lib/src/misc/thread_header.dart index b6e24cf9..1142ac45 100644 --- a/packages/stream_chat_flutter/lib/src/misc/thread_header.dart +++ b/packages/stream_chat_flutter/lib/src/misc/thread_header.dart @@ -149,8 +149,8 @@ class StreamThreadHeader extends StatelessWidget final theme = Theme.of(context); return AppBar( automaticallyImplyLeading: false, - toolbarTextStyle: theme.textTheme.bodyText2, - titleTextStyle: theme.textTheme.headline6, + toolbarTextStyle: theme.textTheme.bodyMedium, + titleTextStyle: theme.textTheme.titleLarge, systemOverlayStyle: theme.brightness == Brightness.dark ? SystemUiOverlayStyle.light : SystemUiOverlayStyle.dark, diff --git a/packages/stream_chat_flutter/lib/src/scroll_view/channel_scroll_view/stream_channel_list_view.dart b/packages/stream_chat_flutter/lib/src/scroll_view/channel_scroll_view/stream_channel_list_view.dart index 6cc18e69..d2829ffd 100644 --- a/packages/stream_chat_flutter/lib/src/scroll_view/channel_scroll_view/stream_channel_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/scroll_view/channel_scroll_view/stream_channel_list_view.dart @@ -409,7 +409,7 @@ class StreamChannelListErrorWidget extends StatelessWidget { TextSpan(text: context.translations.loadingChannelsError), ], ), - style: Theme.of(context).textTheme.headline6, + style: Theme.of(context).textTheme.titleLarge, ), TextButton( onPressed: onPressed, diff --git a/packages/stream_chat_flutter/lib/src/theme/message_theme.dart b/packages/stream_chat_flutter/lib/src/theme/message_theme.dart index f83971f2..d95ed7bb 100644 --- a/packages/stream_chat_flutter/lib/src/theme/message_theme.dart +++ b/packages/stream_chat_flutter/lib/src/theme/message_theme.dart @@ -21,6 +21,7 @@ class StreamMessageThemeData with Diagnosticable { this.avatarTheme, this.createdAtStyle, this.linkBackgroundColor, + this.urlAttachmentTitleMaxLine, }); /// Text style for message text @@ -59,6 +60,9 @@ class StreamMessageThemeData with Diagnosticable { /// Background color for messages with url attachments. final Color? linkBackgroundColor; + /// Max number of lines in Url link title + final int? urlAttachmentTitleMaxLine; + /// Copy with a theme StreamMessageThemeData copyWith({ TextStyle? messageTextStyle, @@ -73,6 +77,7 @@ class StreamMessageThemeData with Diagnosticable { Color? reactionsBorderColor, Color? reactionsMaskColor, Color? linkBackgroundColor, + int? urlAttachmentTitleMaxLine, }) { return StreamMessageThemeData( messageTextStyle: messageTextStyle ?? this.messageTextStyle, @@ -89,6 +94,8 @@ class StreamMessageThemeData with Diagnosticable { reactionsBorderColor: reactionsBorderColor ?? this.reactionsBorderColor, reactionsMaskColor: reactionsMaskColor ?? this.reactionsMaskColor, linkBackgroundColor: linkBackgroundColor ?? this.linkBackgroundColor, + urlAttachmentTitleMaxLine: + urlAttachmentTitleMaxLine ?? this.urlAttachmentTitleMaxLine, ); } @@ -148,6 +155,7 @@ class StreamMessageThemeData with Diagnosticable { reactionsBorderColor: other.reactionsBorderColor, reactionsMaskColor: other.reactionsMaskColor, linkBackgroundColor: other.linkBackgroundColor, + urlAttachmentTitleMaxLine: other.urlAttachmentTitleMaxLine, ); } @@ -167,7 +175,8 @@ class StreamMessageThemeData with Diagnosticable { reactionsBorderColor == other.reactionsBorderColor && reactionsMaskColor == other.reactionsMaskColor && avatarTheme == other.avatarTheme && - linkBackgroundColor == other.linkBackgroundColor; + linkBackgroundColor == other.linkBackgroundColor && + urlAttachmentTitleMaxLine == other.urlAttachmentTitleMaxLine; @override int get hashCode => @@ -182,7 +191,8 @@ class StreamMessageThemeData with Diagnosticable { reactionsBorderColor.hashCode ^ reactionsMaskColor.hashCode ^ avatarTheme.hashCode ^ - linkBackgroundColor.hashCode; + linkBackgroundColor.hashCode ^ + urlAttachmentTitleMaxLine.hashCode; @override void debugFillProperties(DiagnosticPropertiesBuilder properties) { @@ -199,6 +209,10 @@ class StreamMessageThemeData with Diagnosticable { ..add(ColorProperty('reactionsBackgroundColor', reactionsBackgroundColor)) ..add(ColorProperty('reactionsBorderColor', reactionsBorderColor)) ..add(ColorProperty('reactionsMaskColor', reactionsMaskColor)) - ..add(ColorProperty('linkBackgroundColor', linkBackgroundColor)); + ..add(ColorProperty('linkBackgroundColor', linkBackgroundColor)) + ..add(DiagnosticsProperty( + 'urlAttachmentTitleMaxLine', + urlAttachmentTitleMaxLine, + )); } } diff --git a/packages/stream_chat_flutter/lib/src/video/vlc/vlc_manager.dart b/packages/stream_chat_flutter/lib/src/video/vlc/vlc_manager.dart index f721e244..adecfc56 100644 --- a/packages/stream_chat_flutter/lib/src/video/vlc/vlc_manager.dart +++ b/packages/stream_chat_flutter/lib/src/video/vlc/vlc_manager.dart @@ -1,6 +1,6 @@ import 'package:stream_chat_flutter/src/video/vlc/vlc_stub.dart' if (dart.library.io) 'vlc_manager_desktop.dart' - if (dar.library.html) 'vlc_manager_web.dart'; + if (dart.library.html) 'vlc_manager_web.dart'; /// {@template vlcManager} /// An abstract class for the purpose of ensuring Flutter applications that diff --git a/packages/stream_chat_flutter/pubspec.yaml b/packages/stream_chat_flutter/pubspec.yaml index ae24dbe5..d67aa740 100644 --- a/packages/stream_chat_flutter/pubspec.yaml +++ b/packages/stream_chat_flutter/pubspec.yaml @@ -12,12 +12,11 @@ environment: dependencies: cached_network_image: ^3.0.0 chewie: ^1.3.4 - collection: ^1.15.0 + collection: ^1.17.0 contextmenu: ^3.0.0 dart_vlc: ^0.4.0 desktop_drop: ^0.4.0 diacritic: ^0.1.3 - dio: ^4.0.6 ezanimation: ^0.6.0 file_picker: ^5.2.4 file_selector: ^0.9.0 @@ -25,26 +24,25 @@ dependencies: sdk: flutter flutter_markdown: ^0.6.1 flutter_portal: ^1.0.0 - flutter_svg: ^1.0.1 - http: ^0.13.4 + flutter_svg: ^2.0.4 http_parser: ^4.0.0 image_gallery_saver: ^1.7.1 image_picker: ^0.8.2 jiffy: ^5.0.0 lottie: ^2.0.0 - meta: ^1.3.0 + meta: ^1.8.0 path_provider: ^2.0.9 photo_manager: ^2.5.2 photo_view: ^0.14.0 rxdart: ^0.27.0 - share_plus: ^4.5.0 + share_plus: ^6.3.0 shimmer: ^2.0.0 stream_chat_flutter_core: ^5.3.0 synchronized: ^3.0.0 thumblr: ^0.0.4 url_launcher: ^6.1.0 video_player: ^2.4.5 - video_player_macos: ^1.0.6 + video_player_macos: ^2.0.1 video_thumbnail: ^0.5.0 flutter: @@ -56,9 +54,9 @@ flutter: uses-material-design: true dev_dependencies: - dart_code_metrics: ^4.4.0 + dart_code_metrics: ^5.7.0 flutter_test: sdk: flutter - golden_toolkit: ^0.13.0 + golden_toolkit: ^0.15.0 mocktail: ^0.3.0 - path: ^1.8.0 + path: ^1.8.2 diff --git a/packages/stream_chat_flutter_core/CHANGELOG.md b/packages/stream_chat_flutter_core/CHANGELOG.md index 60d41e05..6f26af26 100644 --- a/packages/stream_chat_flutter_core/CHANGELOG.md +++ b/packages/stream_chat_flutter_core/CHANGELOG.md @@ -1,3 +1,7 @@ +## Upcoming + +- Updated dependencies to resolvable versions. + ## 5.3.0 - Updated `stream_chat` dependency to [`5.3.0`](https://pub.dev/packages/stream_chat/changelog). diff --git a/packages/stream_chat_flutter_core/example/pubspec.yaml b/packages/stream_chat_flutter_core/example/pubspec.yaml index 7cd391bc..0abc0cdc 100644 --- a/packages/stream_chat_flutter_core/example/pubspec.yaml +++ b/packages/stream_chat_flutter_core/example/pubspec.yaml @@ -19,6 +19,7 @@ version: 1.0.0+1 environment: sdk: '>=2.17.0 <3.0.0' + flutter: ">=1.17.0" dependencies: # The following adds the Cupertino Icons font to your application. @@ -27,6 +28,7 @@ dependencies: flutter: sdk: flutter stream_chat_flutter_core: ^5.1.0 + dev_dependencies: flutter_test: sdk: flutter diff --git a/packages/stream_chat_flutter_core/example/windows/flutter/generated_plugin_registrant.cc b/packages/stream_chat_flutter_core/example/windows/flutter/generated_plugin_registrant.cc index 8083d749..8777c93d 100644 --- a/packages/stream_chat_flutter_core/example/windows/flutter/generated_plugin_registrant.cc +++ b/packages/stream_chat_flutter_core/example/windows/flutter/generated_plugin_registrant.cc @@ -6,7 +6,7 @@ #include "generated_plugin_registrant.h" -#include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { ConnectivityPlusWindowsPluginRegisterWithRegistrar( diff --git a/packages/stream_chat_flutter_core/example/windows/flutter/generated_plugins.cmake b/packages/stream_chat_flutter_core/example/windows/flutter/generated_plugins.cmake index 8cf5d426..cc1361d8 100644 --- a/packages/stream_chat_flutter_core/example/windows/flutter/generated_plugins.cmake +++ b/packages/stream_chat_flutter_core/example/windows/flutter/generated_plugins.cmake @@ -3,7 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST - connectivity_plus_windows + connectivity_plus ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/packages/stream_chat_flutter_core/lib/src/paged_value_notifier.dart b/packages/stream_chat_flutter_core/lib/src/paged_value_notifier.dart index c122be1d..0209c223 100644 --- a/packages/stream_chat_flutter_core/lib/src/paged_value_notifier.dart +++ b/packages/stream_chat_flutter_core/lib/src/paged_value_notifier.dart @@ -83,7 +83,7 @@ abstract class PagedValueNotifier /// Paged value that can be used with [PagedValueNotifier]. @freezed -abstract class PagedValue with _$PagedValue { +class PagedValue with _$PagedValue { /// Represents the success state of the [PagedValue] // @Assert( // 'nextPageKey != null', diff --git a/packages/stream_chat_flutter_core/lib/src/paged_value_notifier.freezed.dart b/packages/stream_chat_flutter_core/lib/src/paged_value_notifier.freezed.dart index 9e325531..4a85ff07 100644 --- a/packages/stream_chat_flutter_core/lib/src/paged_value_notifier.freezed.dart +++ b/packages/stream_chat_flutter_core/lib/src/paged_value_notifier.freezed.dart @@ -1,7 +1,7 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND // ignore_for_file: type=lint -// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark part of 'paged_value_notifier.dart'; @@ -27,11 +27,11 @@ mixin _$PagedValue { throw _privateConstructorUsedError; @optionalTypeArgs TResult? whenOrNull( - TResult Function( + TResult? Function( List items, Key? nextPageKey, StreamChatError? error)? $default, { - TResult Function()? loading, - TResult Function(StreamChatError error)? error, + TResult? Function()? loading, + TResult? Function(StreamChatError error)? error, }) => throw _privateConstructorUsedError; @optionalTypeArgs @@ -53,9 +53,9 @@ mixin _$PagedValue { throw _privateConstructorUsedError; @optionalTypeArgs TResult? mapOrNull( - TResult Function(Success value)? $default, { - TResult Function(Loading value)? loading, - TResult Function(Error value)? error, + TResult? Function(Success value)? $default, { + TResult? Function(Loading value)? loading, + TResult? Function(Error value)? error, }) => throw _privateConstructorUsedError; @optionalTypeArgs @@ -72,17 +72,19 @@ mixin _$PagedValue { abstract class $PagedValueCopyWith { factory $PagedValueCopyWith(PagedValue value, $Res Function(PagedValue) then) = - _$PagedValueCopyWithImpl; + _$PagedValueCopyWithImpl>; } /// @nodoc -class _$PagedValueCopyWithImpl +class _$PagedValueCopyWithImpl> implements $PagedValueCopyWith { _$PagedValueCopyWithImpl(this._value, this._then); - final PagedValue _value; // ignore: unused_field - final $Res Function(PagedValue) _then; + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; } /// @nodoc @@ -90,36 +92,35 @@ abstract class _$$SuccessCopyWith { factory _$$SuccessCopyWith(_$Success value, $Res Function(_$Success) then) = __$$SuccessCopyWithImpl; + @useResult $Res call({List items, Key? nextPageKey, StreamChatError? error}); } /// @nodoc class __$$SuccessCopyWithImpl - extends _$PagedValueCopyWithImpl + extends _$PagedValueCopyWithImpl> implements _$$SuccessCopyWith { __$$SuccessCopyWithImpl( _$Success _value, $Res Function(_$Success) _then) - : super(_value, (v) => _then(v as _$Success)); - - @override - _$Success get _value => super._value as _$Success; + : super(_value, _then); + @pragma('vm:prefer-inline') @override $Res call({ - Object? items = freezed, + Object? items = null, Object? nextPageKey = freezed, Object? error = freezed, }) { return _then(_$Success( - items: items == freezed + items: null == items ? _value._items : items // ignore: cast_nullable_to_non_nullable as List, - nextPageKey: nextPageKey == freezed + nextPageKey: freezed == nextPageKey ? _value.nextPageKey : nextPageKey // ignore: cast_nullable_to_non_nullable as Key?, - error: error == freezed + error: freezed == error ? _value.error : error // ignore: cast_nullable_to_non_nullable as StreamChatError?, @@ -142,6 +143,7 @@ class _$Success extends Success /// List with all items loaded so far. @override List get items { + if (_items is EqualUnmodifiableListView) return _items; // ignore: implicit_dynamic_type return EqualUnmodifiableListView(_items); } @@ -177,7 +179,7 @@ class _$Success extends Success const DeepCollectionEquality().equals(other._items, _items) && const DeepCollectionEquality() .equals(other.nextPageKey, nextPageKey) && - const DeepCollectionEquality().equals(other.error, error)); + (identical(other.error, error) || other.error == error)); } @override @@ -185,10 +187,11 @@ class _$Success extends Success runtimeType, const DeepCollectionEquality().hash(_items), const DeepCollectionEquality().hash(nextPageKey), - const DeepCollectionEquality().hash(error)); + error); @JsonKey(ignore: true) @override + @pragma('vm:prefer-inline') _$$SuccessCopyWith> get copyWith => __$$SuccessCopyWithImpl>( this, _$identity); @@ -208,11 +211,11 @@ class _$Success extends Success @override @optionalTypeArgs TResult? whenOrNull( - TResult Function( + TResult? Function( List items, Key? nextPageKey, StreamChatError? error)? $default, { - TResult Function()? loading, - TResult Function(StreamChatError error)? error, + TResult? Function()? loading, + TResult? Function(StreamChatError error)? error, }) { return $default?.call(items, nextPageKey, this.error); } @@ -246,9 +249,9 @@ class _$Success extends Success @override @optionalTypeArgs TResult? mapOrNull( - TResult Function(Success value)? $default, { - TResult Function(Loading value)? loading, - TResult Function(Error value)? error, + TResult? Function(Success value)? $default, { + TResult? Function(Loading value)? loading, + TResult? Function(Error value)? error, }) { return $default?.call(this); } @@ -276,13 +279,13 @@ abstract class Success extends PagedValue { const Success._() : super._(); /// List with all items loaded so far. - List get items => throw _privateConstructorUsedError; + List get items; /// The key for the next page to be fetched. - Key? get nextPageKey => throw _privateConstructorUsedError; + Key? get nextPageKey; /// The current error, if any. - StreamChatError? get error => throw _privateConstructorUsedError; + StreamChatError? get error; @JsonKey(ignore: true) _$$SuccessCopyWith> get copyWith => throw _privateConstructorUsedError; @@ -297,14 +300,11 @@ abstract class _$$LoadingCopyWith { /// @nodoc class __$$LoadingCopyWithImpl - extends _$PagedValueCopyWithImpl + extends _$PagedValueCopyWithImpl> implements _$$LoadingCopyWith { __$$LoadingCopyWithImpl( _$Loading _value, $Res Function(_$Loading) _then) - : super(_value, (v) => _then(v as _$Loading)); - - @override - _$Loading get _value => super._value as _$Loading; + : super(_value, _then); } /// @nodoc @@ -349,11 +349,11 @@ class _$Loading extends Loading @override @optionalTypeArgs TResult? whenOrNull( - TResult Function( + TResult? Function( List items, Key? nextPageKey, StreamChatError? error)? $default, { - TResult Function()? loading, - TResult Function(StreamChatError error)? error, + TResult? Function()? loading, + TResult? Function(StreamChatError error)? error, }) { return loading?.call(); } @@ -387,9 +387,9 @@ class _$Loading extends Loading @override @optionalTypeArgs TResult? mapOrNull( - TResult Function(Success value)? $default, { - TResult Function(Loading value)? loading, - TResult Function(Error value)? error, + TResult? Function(Success value)? $default, { + TResult? Function(Loading value)? loading, + TResult? Function(Error value)? error, }) { return loading?.call(this); } @@ -419,26 +419,25 @@ abstract class _$$ErrorCopyWith { factory _$$ErrorCopyWith( _$Error value, $Res Function(_$Error) then) = __$$ErrorCopyWithImpl; + @useResult $Res call({StreamChatError error}); } /// @nodoc class __$$ErrorCopyWithImpl - extends _$PagedValueCopyWithImpl + extends _$PagedValueCopyWithImpl> implements _$$ErrorCopyWith { __$$ErrorCopyWithImpl( _$Error _value, $Res Function(_$Error) _then) - : super(_value, (v) => _then(v as _$Error)); - - @override - _$Error get _value => super._value as _$Error; + : super(_value, _then); + @pragma('vm:prefer-inline') @override $Res call({ - Object? error = freezed, + Object? error = null, }) { return _then(_$Error( - error == freezed + null == error ? _value.error : error // ignore: cast_nullable_to_non_nullable as StreamChatError, @@ -473,15 +472,15 @@ class _$Error extends Error return identical(this, other) || (other.runtimeType == runtimeType && other is _$Error && - const DeepCollectionEquality().equals(other.error, error)); + (identical(other.error, error) || other.error == error)); } @override - int get hashCode => - Object.hash(runtimeType, const DeepCollectionEquality().hash(error)); + int get hashCode => Object.hash(runtimeType, error); @JsonKey(ignore: true) @override + @pragma('vm:prefer-inline') _$$ErrorCopyWith> get copyWith => __$$ErrorCopyWithImpl>(this, _$identity); @@ -500,11 +499,11 @@ class _$Error extends Error @override @optionalTypeArgs TResult? whenOrNull( - TResult Function( + TResult? Function( List items, Key? nextPageKey, StreamChatError? error)? $default, { - TResult Function()? loading, - TResult Function(StreamChatError error)? error, + TResult? Function()? loading, + TResult? Function(StreamChatError error)? error, }) { return error?.call(this.error); } @@ -538,9 +537,9 @@ class _$Error extends Error @override @optionalTypeArgs TResult? mapOrNull( - TResult Function(Success value)? $default, { - TResult Function(Loading value)? loading, - TResult Function(Error value)? error, + TResult? Function(Success value)? $default, { + TResult? Function(Loading value)? loading, + TResult? Function(Error value)? error, }) { return error?.call(this); } @@ -564,7 +563,7 @@ abstract class Error extends PagedValue { const factory Error(final StreamChatError error) = _$Error; const Error._() : super._(); - StreamChatError get error => throw _privateConstructorUsedError; + StreamChatError get error; @JsonKey(ignore: true) _$$ErrorCopyWith> get copyWith => throw _privateConstructorUsedError; diff --git a/packages/stream_chat_flutter_core/lib/src/stream_channel.dart b/packages/stream_chat_flutter_core/lib/src/stream_channel.dart index bf37aa11..9842c3e2 100644 --- a/packages/stream_chat_flutter_core/lib/src/stream_channel.dart +++ b/packages/stream_chat_flutter_core/lib/src/stream_channel.dart @@ -425,8 +425,8 @@ class StreamChannelState extends State { var message = snapshot.error.toString(); if (snapshot.error is DioError) { final dioError = snapshot.error as DioError?; - if (dioError?.type == DioErrorType.response) { - message = dioError!.message; + if (dioError?.type == DioErrorType.badResponse) { + message = dioError!.message ?? 'Bad response'; } else { message = 'Check your connection and retry'; } diff --git a/packages/stream_chat_flutter_core/lib/src/stream_channel_list_controller.dart b/packages/stream_chat_flutter_core/lib/src/stream_channel_list_controller.dart index bc98780d..71bc0694 100644 --- a/packages/stream_chat_flutter_core/lib/src/stream_channel_list_controller.dart +++ b/packages/stream_chat_flutter_core/lib/src/stream_channel_list_controller.dart @@ -244,10 +244,11 @@ class StreamChannelListController extends PagedValueNotifier { _unsubscribeFromChannelListEvents(); } - _channelEventSubscription = - client.on().skip(1) // Skipping the last emitted event. - // We only need to handle the latest events. - .listen((event) { + _channelEventSubscription = client + .on() + .skip(1) // Skipping the last emitted event. + // We only need to handle the latest events. + .listen((event) { // Only handle the event if the value is in success state. if (value.isNotSuccess) return; diff --git a/packages/stream_chat_flutter_core/pubspec.yaml b/packages/stream_chat_flutter_core/pubspec.yaml index 81fbe319..78a3e813 100644 --- a/packages/stream_chat_flutter_core/pubspec.yaml +++ b/packages/stream_chat_flutter_core/pubspec.yaml @@ -10,20 +10,21 @@ environment: flutter: ">=1.17.0" dependencies: - collection: ^1.15.0 + collection: ^1.17.0 connectivity_plus: ^3.0.2 flutter: sdk: flutter freezed_annotation: ^2.0.3 - meta: ^1.3.0 + meta: ^1.8.0 rxdart: ^0.27.0 stream_chat: ^5.3.0 + dev_dependencies: - build_runner: ^2.0.1 - dart_code_metrics: ^4.4.0 + build_runner: ^2.3.3 + dart_code_metrics: ^5.7.0 fake_async: ^1.2.0 flutter_test: sdk: flutter - freezed: ^2.0.3 + freezed: ^2.3.2 mocktail: ^0.3.0 diff --git a/packages/stream_chat_flutter_core/test/matchers/channel_matcher.dart b/packages/stream_chat_flutter_core/test/matchers/channel_matcher.dart deleted file mode 100644 index 514462e0..00000000 --- a/packages/stream_chat_flutter_core/test/matchers/channel_matcher.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart'; - -Matcher isSameChannelAs(Channel targetChannel) => - _IsSameChannelAs(targetChannel: targetChannel); - -class _IsSameChannelAs extends Matcher { - const _IsSameChannelAs({ - required this.targetChannel, - }); - - final Channel targetChannel; - - @override - bool matches(covariant Channel channel, Map matchState) => - channel.cid == targetChannel.cid; - - @override - Description describe(Description description) => - description.add('is same channel as $targetChannel'); -} - -Matcher isSameChannelListAs(List targetChannelList) => - _IsSameChannelListAs(targetChannelList: targetChannelList); - -class _IsSameChannelListAs extends Matcher { - const _IsSameChannelListAs({ - required this.targetChannelList, - }); - - final List targetChannelList; - - @override - bool matches(covariant List channelList, Map matchState) { - var matches = true; - for (var i = 0; i < channelList.length; i++) { - final channel = channelList[i]; - final targetChannel = targetChannelList[i]; - matches = isSameChannelAs(targetChannel).matches(channel, matchState); - if (!matches) break; - } - return matches; - } - - @override - Description describe(Description description) => - description.add('is same channelList as $targetChannelList'); -} diff --git a/packages/stream_chat_flutter_core/test/matchers/get_message_response_matcher.dart b/packages/stream_chat_flutter_core/test/matchers/get_message_response_matcher.dart deleted file mode 100644 index c3a6629d..00000000 --- a/packages/stream_chat_flutter_core/test/matchers/get_message_response_matcher.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart'; - -Matcher isSameMessageResponseAs(GetMessageResponse targetResponse) => - _IsSameMessageResponseAs(targetResponse: targetResponse); - -class _IsSameMessageResponseAs extends Matcher { - const _IsSameMessageResponseAs({ - required this.targetResponse, - }); - - final GetMessageResponse targetResponse; - - @override - bool matches(covariant GetMessageResponse response, Map matchState) => - response.message.id == targetResponse.message.id && - response.channel?.cid == targetResponse.channel?.cid; - - @override - Description describe(Description description) => - description.add('is same message response as $targetResponse'); -} - -Matcher isSameMessageResponseListAs( - List targetResponseList) => - _IsSameMessageResponseListAs(targetResponseList: targetResponseList); - -class _IsSameMessageResponseListAs extends Matcher { - const _IsSameMessageResponseListAs({ - required this.targetResponseList, - }); - - final List targetResponseList; - - @override - bool matches( - covariant List responseList, Map matchState) { - var matches = true; - for (var i = 0; i < responseList.length; i++) { - final response = responseList[i]; - final targetResponse = targetResponseList[i]; - matches = isSameMessageResponseAs(targetResponse).matches( - response, - matchState, - ); - if (!matches) break; - } - return matches; - } - - @override - Description describe(Description description) => - description.add('is same userResponseList as $targetResponseList'); -} diff --git a/packages/stream_chat_flutter_core/test/matchers/message_matcher.dart b/packages/stream_chat_flutter_core/test/matchers/message_matcher.dart deleted file mode 100644 index 776665ff..00000000 --- a/packages/stream_chat_flutter_core/test/matchers/message_matcher.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart'; - -Matcher isSameMessageAs(Message targetMessage) => - _IsSameMessageAs(targetMessage: targetMessage); - -class _IsSameMessageAs extends Matcher { - const _IsSameMessageAs({ - required this.targetMessage, - }); - - final Message targetMessage; - - @override - bool matches(covariant Message message, Map matchState) => - message.id == targetMessage.id; - - @override - Description describe(Description description) => - description.add('is same message as $targetMessage'); -} - -Matcher isSameMessageListAs(List targetMessageList) => - _IsSameMessageListAs(targetMessageList: targetMessageList); - -class _IsSameMessageListAs extends Matcher { - const _IsSameMessageListAs({ - required this.targetMessageList, - }); - - final List targetMessageList; - - @override - bool matches(covariant List messageList, Map matchState) { - var matches = true; - for (var i = 0; i < messageList.length; i++) { - final message = messageList[i]; - final targetMessage = targetMessageList[i]; - matches = isSameMessageAs(targetMessage).matches(message, matchState); - if (!matches) break; - } - return matches; - } - - @override - Description describe(Description description) => - description.add('is same messageList as $targetMessageList'); -} diff --git a/packages/stream_chat_flutter_core/test/matchers/users_matcher.dart b/packages/stream_chat_flutter_core/test/matchers/users_matcher.dart deleted file mode 100644 index fa0f0c08..00000000 --- a/packages/stream_chat_flutter_core/test/matchers/users_matcher.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart'; - -Matcher isSameUserAs(User targetUser) => _IsSameUserAs(targetUser: targetUser); - -class _IsSameUserAs extends Matcher { - const _IsSameUserAs({ - required this.targetUser, - }); - - final User targetUser; - - @override - bool matches(covariant User user, Map matchState) => user.id == targetUser.id; - - @override - Description describe(Description description) => - description.add('is same user as $targetUser'); -} - -Matcher isSameUserListAs(List targetUserList) => - _IsSameUserListAs(targetUserList: targetUserList); - -class _IsSameUserListAs extends Matcher { - const _IsSameUserListAs({ - required this.targetUserList, - }); - - final List targetUserList; - - @override - bool matches(covariant List userList, Map matchState) { - var matches = true; - for (var i = 0; i < userList.length; i++) { - final user = userList[i]; - final targetUser = targetUserList[i]; - matches = isSameUserAs(targetUser).matches(user, matchState); - if (!matches) break; - } - return matches; - } - - @override - Description describe(Description description) => - description.add('is same userList as $targetUserList'); -} diff --git a/packages/stream_chat_flutter_core/test/stream_channel_test.dart b/packages/stream_chat_flutter_core/test/stream_channel_test.dart index 86ce7c2b..f4acf3c9 100644 --- a/packages/stream_chat_flutter_core/test/stream_channel_test.dart +++ b/packages/stream_chat_flutter_core/test/stream_channel_test.dart @@ -92,9 +92,9 @@ void main() { const errorMessage = 'Error! Error! Error!'; final error = DioError( - type: DioErrorType.response, - error: errorMessage, - requestOptions: RequestOptions(path: ''), + type: DioErrorType.badResponse, + message: errorMessage, + requestOptions: RequestOptions(), ); when(() => mockChannel.initialized) .thenAnswer((_) => Future.error(error)); diff --git a/packages/stream_chat_localizations/pubspec.yaml b/packages/stream_chat_localizations/pubspec.yaml index ce2e5e3a..7462a287 100644 --- a/packages/stream_chat_localizations/pubspec.yaml +++ b/packages/stream_chat_localizations/pubspec.yaml @@ -15,6 +15,7 @@ dependencies: flutter_localizations: sdk: flutter stream_chat_flutter: ^5.3.0 + dev_dependencies: dart_code_metrics: ^4.16.0 flutter_test: diff --git a/packages/stream_chat_localizations/test/basics_test.dart b/packages/stream_chat_localizations/test/basics_test.dart index ae52a1af..2c8bb4db 100644 --- a/packages/stream_chat_localizations/test/basics_test.dart +++ b/packages/stream_chat_localizations/test/basics_test.dart @@ -103,7 +103,7 @@ class LocalizationTrackerState extends State { @override Widget build(BuildContext context) { - captionFontSize = Theme.of(context).textTheme.caption!.fontSize!; + captionFontSize = Theme.of(context).textTheme.bodySmall!.fontSize!; return Container(); } } diff --git a/packages/stream_chat_persistence/CHANGELOG.md b/packages/stream_chat_persistence/CHANGELOG.md index 5622e0ab..e0dabaa7 100644 --- a/packages/stream_chat_persistence/CHANGELOG.md +++ b/packages/stream_chat_persistence/CHANGELOG.md @@ -1,3 +1,7 @@ +## Upcoming + +- Updated dependencies to resolvable versions. + ## 5.1.0 - Reintroduce support for experimental indexedDB on Web. diff --git a/packages/stream_chat_persistence/example/pubspec.yaml b/packages/stream_chat_persistence/example/pubspec.yaml index 435b1442..80a35fc7 100644 --- a/packages/stream_chat_persistence/example/pubspec.yaml +++ b/packages/stream_chat_persistence/example/pubspec.yaml @@ -6,6 +6,7 @@ version: 1.0.0+1 environment: sdk: '>=2.17.0 <3.0.0' + flutter: ">=1.17.0" dependencies: cupertino_icons: ^1.0.3 @@ -13,6 +14,7 @@ dependencies: sdk: flutter stream_chat: ^5.1.0 stream_chat_persistence: ^5.1.0 + dev_dependencies: flutter_test: sdk: flutter diff --git a/packages/stream_chat_persistence/pubspec.yaml b/packages/stream_chat_persistence/pubspec.yaml index dcdf8bd1..5628688b 100644 --- a/packages/stream_chat_persistence/pubspec.yaml +++ b/packages/stream_chat_persistence/pubspec.yaml @@ -10,20 +10,21 @@ environment: flutter: ">=1.17.0" dependencies: - drift: ^1.5.0 + drift: ^1.7.1 flutter: sdk: flutter logging: ^1.0.1 - meta: ^1.3.0 + meta: ^1.8.0 mutex: ^3.0.0 - path: ^1.8.0 + path: ^1.8.2 path_provider: ^2.0.1 sqlite3_flutter_libs: ^0.5.0 stream_chat: ^5.1.0 + dev_dependencies: - build_runner: ^2.0.1 - dart_code_metrics: ^4.4.0 - drift_dev: ^1.5.2 + build_runner: ^2.3.3 + dart_code_metrics: ^4.18.0 + drift_dev: ^1.7.1 flutter_test: sdk: flutter mocktail: ^0.3.0 diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 00000000..9016fa8f --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,7 @@ +name: stream_chat_flutter_workspace + +environment: + sdk: '>=2.18.0 <3.0.0' + +dev_dependencies: + melos: ^3.0.0