diff --git a/packages/stream_chat/CHANGELOG.md b/packages/stream_chat/CHANGELOG.md index a9fe56004..745b0ccef 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -8,6 +8,8 @@ ✅ Added - Added support for `Channel.messageCount` field. +- Added support for Pending Messages. Pending messages can be accessed via + `ChannelState.pendingMessages` or `ChannelState.pendingMessagesStream`. 🐞 Fixed diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index 17f1641df..30bac98f2 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -3152,6 +3152,15 @@ class ChannelClientState { .map((cs) => cs.pinnedMessages ?? []) .distinct(const ListEquality().equals); + /// Channel pending message list. + List get pendingMessages => + _channelState.pendingMessages ?? []; + + /// Channel pending message list as a stream. + Stream> get pendingMessagesStream => channelStateStream + .map((cs) => cs.pendingMessages ?? []) + .distinct(const ListEquality().equals); + /// Get channel last message. Message? get lastMessage => _channelState.messages != null && _channelState.messages!.isNotEmpty @@ -3376,6 +3385,7 @@ class ChannelClientState { read: newReads, draft: updatedState.draft, pinnedMessages: updatedState.pinnedMessages, + pendingMessages: updatedState.pendingMessages, pushPreferences: updatedState.pushPreferences, ); } diff --git a/packages/stream_chat/lib/src/core/models/channel_config.dart b/packages/stream_chat/lib/src/core/models/channel_config.dart index 2bcf0a1ed..55ad2b2fb 100644 --- a/packages/stream_chat/lib/src/core/models/channel_config.dart +++ b/packages/stream_chat/lib/src/core/models/channel_config.dart @@ -26,6 +26,7 @@ class ChannelConfig { this.urlEnrichment = false, this.skipLastMsgUpdateForSystemMsgs = false, this.userMessageReminders = false, + this.markMessagesPending = false, }) : createdAt = createdAt ?? DateTime.now(), updatedAt = updatedAt ?? DateTime.now(); @@ -91,6 +92,9 @@ class ChannelConfig { /// True if the user can set reminders for messages in this channel. final bool userMessageReminders; + /// Whether pending messages are enabled for this channel. + final bool markMessagesPending; + /// Serialize to json Map toJson() => _$ChannelConfigToJson(this); } diff --git a/packages/stream_chat/lib/src/core/models/channel_config.g.dart b/packages/stream_chat/lib/src/core/models/channel_config.g.dart index 8cb758b87..ae1221b99 100644 --- a/packages/stream_chat/lib/src/core/models/channel_config.g.dart +++ b/packages/stream_chat/lib/src/core/models/channel_config.g.dart @@ -34,6 +34,7 @@ ChannelConfig _$ChannelConfigFromJson(Map json) => skipLastMsgUpdateForSystemMsgs: json['skip_last_msg_update_for_system_msgs'] as bool? ?? false, userMessageReminders: json['user_message_reminders'] as bool? ?? false, + markMessagesPending: json['mark_messages_pending'] as bool? ?? false, ); Map _$ChannelConfigToJson(ChannelConfig instance) => @@ -57,4 +58,5 @@ Map _$ChannelConfigToJson(ChannelConfig instance) => 'skip_last_msg_update_for_system_msgs': instance.skipLastMsgUpdateForSystemMsgs, 'user_message_reminders': instance.userMessageReminders, + 'mark_messages_pending': instance.markMessagesPending, }; 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 601ef679a..e3dc81ad2 100644 --- a/packages/stream_chat/lib/src/core/models/channel_state.dart +++ b/packages/stream_chat/lib/src/core/models/channel_state.dart @@ -30,6 +30,7 @@ class ChannelState implements ComparableFieldProvider { this.read, this.membership, this.draft, + this.pendingMessages, this.pushPreferences, }); @@ -60,6 +61,28 @@ class ChannelState implements ComparableFieldProvider { /// The draft message for this channel if it exists. final Draft? draft; + static Object? _pendingMessagesReadValue( + Map json, + String key, + ) { + final pendingMessageResponse = json[key]; + if (pendingMessageResponse is! List) return null; + + final value = pendingMessageResponse.map((it) { + if (it is! Map) return null; + return it['message']; + }).nonNulls; + + if (value.isEmpty) return null; + return value.toList(growable: false); + } + + /// List of messages pending for moderation on this channel. + /// + /// These messages are only visible to the author until they are approved. + @JsonKey(readValue: _pendingMessagesReadValue) + final List? pendingMessages; + /// The push preferences for this channel if it exists. final ChannelPushPreference? pushPreferences; @@ -81,6 +104,7 @@ class ChannelState implements ComparableFieldProvider { List? read, Member? membership, Object? draft = _nullConst, + List? pendingMessages, ChannelPushPreference? pushPreferences, }) => ChannelState( @@ -93,6 +117,7 @@ class ChannelState implements ComparableFieldProvider { read: read ?? this.read, membership: membership ?? this.membership, draft: draft == _nullConst ? this.draft : draft as Draft?, + pendingMessages: pendingMessages ?? this.pendingMessages, pushPreferences: pushPreferences ?? this.pushPreferences, ); 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 e154f1235..b7499ba8b 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 @@ -32,6 +32,11 @@ ChannelState _$ChannelStateFromJson(Map json) => ChannelState( draft: json['draft'] == null ? null : Draft.fromJson(json['draft'] as Map), + pendingMessages: + (ChannelState._pendingMessagesReadValue(json, 'pending_messages') + as List?) + ?.map((e) => Message.fromJson(e as Map)) + .toList(), pushPreferences: json['push_preferences'] == null ? null : ChannelPushPreference.fromJson( @@ -50,5 +55,7 @@ Map _$ChannelStateToJson(ChannelState instance) => 'read': instance.read?.map((e) => e.toJson()).toList(), 'membership': instance.membership?.toJson(), 'draft': instance.draft?.toJson(), + 'pending_messages': + instance.pendingMessages?.map((e) => e.toJson()).toList(), 'push_preferences': instance.pushPreferences?.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 95f5d5693..f497da7c9 100644 --- a/packages/stream_chat/test/fixtures/channel_state_to_json.json +++ b/packages/stream_chat/test/fixtures/channel_state_to_json.json @@ -12,6 +12,7 @@ "read": [], "membership": null, "draft": null, + "pending_messages": null, "push_preferences": { "chat_level": "all", "disabled_until": "2020-01-30T13:43:41.062362Z"