diff --git a/analysis_options.yaml b/analysis_options.yaml index c2c1d692..52f50e45 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -159,7 +159,6 @@ linter: - avoid_escaping_inner_quotes - unnecessary_overrides - prefer_null_aware_method_calls - - prefer_null_aware_operators - use_named_constants - use_raw_strings diff --git a/packages/stream_chat/CHANGELOG.md b/packages/stream_chat/CHANGELOG.md index 48c4dd4d..6ac8b580 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -7,6 +7,7 @@ - Added `PaginationParams.createdAtBeforeOrEqual` for message pagination. - Added `PaginationParams.createdAtBefore` for message pagination. - Added `PaginationParams.createdAtAround` for message pagination. +- Added support for `channel.membership` and `channel.membershipStream` in `Channel`. 🔄 Changed diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index f5d87404..6076a57f 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -171,6 +171,18 @@ class Channel { return state!.channelStateStream.map((cs) => cs.channel?.config); } + /// Relationship of the current user to this channel. + Member? get membership { + _checkInitialized(); + return state!._channelState.membership; + } + + /// Relationship of the current user to this channel as a stream. + Stream get membershipStream { + _checkInitialized(); + return state!.channelStateStream.map((cs) => cs.membership); + } + /// Channel user creator. User? get createdBy { _checkInitialized(); 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 94f15db4..9140ec5e 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 @@ -12,7 +12,7 @@ part of 'attachment_file.dart'; T _$identity(T value) => value; final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); UploadState _$UploadStateFromJson(Map json) { switch (json['runtimeType']) { @@ -31,39 +31,6 @@ UploadState _$UploadStateFromJson(Map json) { } } -/// @nodoc -class _$UploadStateTearOff { - const _$UploadStateTearOff(); - - Preparing preparing() { - return const Preparing(); - } - - InProgress inProgress({required int uploaded, required int total}) { - return InProgress( - uploaded: uploaded, - total: total, - ); - } - - Success success() { - return const Success(); - } - - Failed failed({required String error}) { - return Failed( - error: error, - ); - } - - UploadState fromJson(Map json) { - return UploadState.fromJson(json); - } -} - -/// @nodoc -const $UploadState = _$UploadStateTearOff(); - /// @nodoc mixin _$UploadState { @optionalTypeArgs @@ -156,7 +123,7 @@ class __$$PreparingCopyWithImpl<$Res> extends _$UploadStateCopyWithImpl<$Res> /// @nodoc @JsonSerializable() class _$Preparing implements Preparing { - const _$Preparing({String? $type}) : $type = $type ?? 'preparing'; + const _$Preparing({final String? $type}) : $type = $type ?? 'preparing'; factory _$Preparing.fromJson(Map json) => _$$PreparingFromJson(json); @@ -175,6 +142,7 @@ class _$Preparing implements Preparing { (other.runtimeType == runtimeType && other is _$Preparing); } + @JsonKey(ignore: true) @override int get hashCode => runtimeType.hashCode; @@ -304,7 +272,7 @@ class __$$InProgressCopyWithImpl<$Res> extends _$UploadStateCopyWithImpl<$Res> @JsonSerializable() class _$InProgress implements InProgress { const _$InProgress( - {required this.uploaded, required this.total, String? $type}) + {required this.uploaded, required this.total, final String? $type}) : $type = $type ?? 'inProgress'; factory _$InProgress.fromJson(Map json) => @@ -332,6 +300,7 @@ class _$InProgress implements InProgress { const DeepCollectionEquality().equals(other.total, total)); } + @JsonKey(ignore: true) @override int get hashCode => Object.hash( runtimeType, @@ -424,14 +393,14 @@ class _$InProgress implements InProgress { } abstract class InProgress implements UploadState { - const factory InProgress({required int uploaded, required int total}) = - _$InProgress; + const factory InProgress( + {required final int uploaded, required final int total}) = _$InProgress; factory InProgress.fromJson(Map json) = _$InProgress.fromJson; - int get uploaded; - int get total; + int get uploaded => throw _privateConstructorUsedError; + int get total => throw _privateConstructorUsedError; @JsonKey(ignore: true) _$$InProgressCopyWith<_$InProgress> get copyWith => throw _privateConstructorUsedError; @@ -456,7 +425,7 @@ class __$$SuccessCopyWithImpl<$Res> extends _$UploadStateCopyWithImpl<$Res> /// @nodoc @JsonSerializable() class _$Success implements Success { - const _$Success({String? $type}) : $type = $type ?? 'success'; + const _$Success({final String? $type}) : $type = $type ?? 'success'; factory _$Success.fromJson(Map json) => _$$SuccessFromJson(json); @@ -475,6 +444,7 @@ class _$Success implements Success { (other.runtimeType == runtimeType && other is _$Success); } + @JsonKey(ignore: true) @override int get hashCode => runtimeType.hashCode; @@ -596,7 +566,7 @@ class __$$FailedCopyWithImpl<$Res> extends _$UploadStateCopyWithImpl<$Res> /// @nodoc @JsonSerializable() class _$Failed implements Failed { - const _$Failed({required this.error, String? $type}) + const _$Failed({required this.error, final String? $type}) : $type = $type ?? 'failed'; factory _$Failed.fromJson(Map json) => @@ -621,6 +591,7 @@ class _$Failed implements Failed { const DeepCollectionEquality().equals(other.error, error)); } + @JsonKey(ignore: true) @override int get hashCode => Object.hash(runtimeType, const DeepCollectionEquality().hash(error)); @@ -711,11 +682,11 @@ class _$Failed implements Failed { } abstract class Failed implements UploadState { - const factory Failed({required String error}) = _$Failed; + const factory Failed({required final String error}) = _$Failed; factory Failed.fromJson(Map json) = _$Failed.fromJson; - String get error; + String get error => throw _privateConstructorUsedError; @JsonKey(ignore: true) _$$FailedCopyWith<_$Failed> get copyWith => throw _privateConstructorUsedError; diff --git a/packages/stream_chat/lib/src/core/models/channel_state.dart b/packages/stream_chat/lib/src/core/models/channel_state.dart index 3ba3c5f8..65e22f38 100644 --- a/packages/stream_chat/lib/src/core/models/channel_state.dart +++ b/packages/stream_chat/lib/src/core/models/channel_state.dart @@ -19,6 +19,7 @@ class ChannelState { this.watcherCount, this.watchers, this.read, + this.membership, }); /// The channel to which this state belongs @@ -42,6 +43,9 @@ class ChannelState { /// The list of channel reads final List? read; + /// Relationship of the current user to this channel. + final Member? membership; + /// Create a new instance from a json static ChannelState fromJson(Map json) => _$ChannelStateFromJson(json); @@ -58,6 +62,7 @@ class ChannelState { int? watcherCount, List? watchers, List? read, + Member? membership, }) => ChannelState( channel: channel ?? this.channel, @@ -67,5 +72,6 @@ class ChannelState { watcherCount: watcherCount ?? this.watcherCount, watchers: watchers ?? this.watchers, read: read ?? this.read, + membership: membership ?? this.membership, ); } diff --git a/packages/stream_chat/lib/src/core/models/channel_state.g.dart b/packages/stream_chat/lib/src/core/models/channel_state.g.dart index afec76c4..40e11a32 100644 --- a/packages/stream_chat/lib/src/core/models/channel_state.g.dart +++ b/packages/stream_chat/lib/src/core/models/channel_state.g.dart @@ -26,6 +26,9 @@ ChannelState _$ChannelStateFromJson(Map json) => ChannelState( read: (json['read'] as List?) ?.map((e) => Read.fromJson(e as Map)) .toList(), + membership: json['membership'] == null + ? null + : Member.fromJson(json['membership'] as Map), ); Map _$ChannelStateToJson(ChannelState instance) => @@ -38,4 +41,5 @@ Map _$ChannelStateToJson(ChannelState instance) => 'watcher_count': instance.watcherCount, 'watchers': instance.watchers?.map((e) => e.toJson()).toList(), 'read': instance.read?.map((e) => e.toJson()).toList(), + 'membership': instance.membership?.toJson(), }; 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 ebb74fb6..c0c06f9e 100644 --- a/packages/stream_chat/test/fixtures/channel_state_to_json.json +++ b/packages/stream_chat/test/fixtures/channel_state_to_json.json @@ -11,6 +11,7 @@ }, "watchers": [], "read": [], + "membership": null, "messages": [ { "id": "dry-meadow-0-2b73cc8b-cd86-4a01-8d40-bd82ad07a030", diff --git a/packages/stream_chat_flutter/lib/src/v4/message_input/stream_message_input.dart b/packages/stream_chat_flutter/lib/src/v4/message_input/stream_message_input.dart index b99c0b8a..ef0ddffb 100644 --- a/packages/stream_chat_flutter/lib/src/v4/message_input/stream_message_input.dart +++ b/packages/stream_chat_flutter/lib/src/v4/message_input/stream_message_input.dart @@ -608,7 +608,6 @@ class StreamMessageInputState extends State widget: _buildCommandsOverlayEntry(), ), if (widget.enableEmojiSuggestionsOverlay && - // ignore: deprecated_member_use_from_same_package !widget.disableEmojiSuggestionsOverlay) OverlayOptions( visible: _focusNode.hasFocus &&