Skip to content

Commit 9adfbdb

Browse files
Merge branch 'master' into feat/floating_date_divider_builder
2 parents 051480d + fe326e7 commit 9adfbdb

38 files changed

+257
-32
lines changed

.github/workflows/update_goldens.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ jobs:
3030
run: melos run update:goldens
3131

3232
- name: 📤 Commit Changes
33-
uses: stefanzweifel/git-auto-commit-action@v6
33+
uses: stefanzweifel/git-auto-commit-action@v7
3434
with:
3535
commit_message: "chore: Update Goldens"
3636
file_pattern: "**/test/**/goldens/*.png"

melos.yaml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,11 @@ command:
7979
share_plus: ">=11.0.0 <13.0.0"
8080
shimmer: ^3.0.0
8181
sqlite3_flutter_libs: ^0.5.26
82-
stream_chat: ^9.17.0
83-
stream_chat_flutter: ^9.17.0
84-
stream_chat_flutter_core: ^9.17.0
85-
stream_chat_localizations: ^9.17.0
86-
stream_chat_persistence: ^9.17.0
82+
stream_chat: ^9.18.0
83+
stream_chat_flutter: ^9.18.0
84+
stream_chat_flutter_core: ^9.18.0
85+
stream_chat_localizations: ^9.18.0
86+
stream_chat_persistence: ^9.18.0
8787
streaming_shared_preferences: ^2.0.0
8888
svg_icon_widget: ^0.0.1
8989
synchronized: ^3.1.0+1

packages/stream_chat/CHANGELOG.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
## Upcoming
1+
## 9.18.0
22

33
🐞 Fixed
44

@@ -7,7 +7,10 @@
77

88
✅ Added
99

10+
- Added support for `Message.channelRole` field to provide access to the sender's channel role.
1011
- Added support for `Channel.messageCount` field.
12+
- Added support for Pending Messages. Pending messages can be accessed via
13+
`ChannelState.pendingMessages` or `ChannelState.pendingMessagesStream`.
1114

1215
🐞 Fixed
1316

packages/stream_chat/example/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ dependencies:
2424
cupertino_icons: ^1.0.3
2525
flutter:
2626
sdk: flutter
27-
stream_chat: ^9.17.0
27+
stream_chat: ^9.18.0
2828

2929
flutter:
3030
uses-material-design: true

packages/stream_chat/lib/src/client/channel.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3152,6 +3152,15 @@ class ChannelClientState {
31523152
.map((cs) => cs.pinnedMessages ?? <Message>[])
31533153
.distinct(const ListEquality().equals);
31543154

3155+
/// Channel pending message list.
3156+
List<Message> get pendingMessages =>
3157+
_channelState.pendingMessages ?? <Message>[];
3158+
3159+
/// Channel pending message list as a stream.
3160+
Stream<List<Message>> get pendingMessagesStream => channelStateStream
3161+
.map((cs) => cs.pendingMessages ?? <Message>[])
3162+
.distinct(const ListEquality().equals);
3163+
31553164
/// Get channel last message.
31563165
Message? get lastMessage =>
31573166
_channelState.messages != null && _channelState.messages!.isNotEmpty
@@ -3376,6 +3385,7 @@ class ChannelClientState {
33763385
read: newReads,
33773386
draft: updatedState.draft,
33783387
pinnedMessages: updatedState.pinnedMessages,
3388+
pendingMessages: updatedState.pendingMessages,
33793389
pushPreferences: updatedState.pushPreferences,
33803390
);
33813391
}

packages/stream_chat/lib/src/core/models/channel_config.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class ChannelConfig {
2626
this.urlEnrichment = false,
2727
this.skipLastMsgUpdateForSystemMsgs = false,
2828
this.userMessageReminders = false,
29+
this.markMessagesPending = false,
2930
}) : createdAt = createdAt ?? DateTime.now(),
3031
updatedAt = updatedAt ?? DateTime.now();
3132

@@ -91,6 +92,9 @@ class ChannelConfig {
9192
/// True if the user can set reminders for messages in this channel.
9293
final bool userMessageReminders;
9394

95+
/// Whether pending messages are enabled for this channel.
96+
final bool markMessagesPending;
97+
9498
/// Serialize to json
9599
Map<String, dynamic> toJson() => _$ChannelConfigToJson(this);
96100
}

packages/stream_chat/lib/src/core/models/channel_config.g.dart

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/stream_chat/lib/src/core/models/channel_state.dart

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class ChannelState implements ComparableFieldProvider {
3030
this.read,
3131
this.membership,
3232
this.draft,
33+
this.pendingMessages,
3334
this.pushPreferences,
3435
});
3536

@@ -60,6 +61,28 @@ class ChannelState implements ComparableFieldProvider {
6061
/// The draft message for this channel if it exists.
6162
final Draft? draft;
6263

64+
static Object? _pendingMessagesReadValue(
65+
Map<Object?, Object?> json,
66+
String key,
67+
) {
68+
final pendingMessageResponse = json[key];
69+
if (pendingMessageResponse is! List<Object?>) return null;
70+
71+
final value = pendingMessageResponse.map((it) {
72+
if (it is! Map<String, Object?>) return null;
73+
return it['message'];
74+
}).nonNulls;
75+
76+
if (value.isEmpty) return null;
77+
return value.toList(growable: false);
78+
}
79+
80+
/// List of messages pending for moderation on this channel.
81+
///
82+
/// These messages are only visible to the author until they are approved.
83+
@JsonKey(readValue: _pendingMessagesReadValue)
84+
final List<Message>? pendingMessages;
85+
6386
/// The push preferences for this channel if it exists.
6487
final ChannelPushPreference? pushPreferences;
6588

@@ -81,6 +104,7 @@ class ChannelState implements ComparableFieldProvider {
81104
List<Read>? read,
82105
Member? membership,
83106
Object? draft = _nullConst,
107+
List<Message>? pendingMessages,
84108
ChannelPushPreference? pushPreferences,
85109
}) =>
86110
ChannelState(
@@ -93,6 +117,7 @@ class ChannelState implements ComparableFieldProvider {
93117
read: read ?? this.read,
94118
membership: membership ?? this.membership,
95119
draft: draft == _nullConst ? this.draft : draft as Draft?,
120+
pendingMessages: pendingMessages ?? this.pendingMessages,
96121
pushPreferences: pushPreferences ?? this.pushPreferences,
97122
);
98123

packages/stream_chat/lib/src/core/models/channel_state.g.dart

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/stream_chat/lib/src/core/models/message.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import 'package:stream_chat/src/core/models/poll.dart';
1111
import 'package:stream_chat/src/core/models/reaction.dart';
1212
import 'package:stream_chat/src/core/models/reaction_group.dart';
1313
import 'package:stream_chat/src/core/models/user.dart';
14+
import 'package:stream_chat/src/core/util/extension.dart';
1415
import 'package:stream_chat/src/core/util/serializer.dart';
1516
import 'package:uuid/uuid.dart';
1617

@@ -69,6 +70,7 @@ class Message extends Equatable implements ComparableFieldProvider {
6970
this.moderation,
7071
this.draft,
7172
this.reminder,
73+
this.channelRole,
7274
}) : id = id ?? const Uuid().v4(),
7375
type = MessageType(type),
7476
pinExpires = pinExpires?.toUtc(),
@@ -314,6 +316,19 @@ class Message extends Equatable implements ComparableFieldProvider {
314316
/// This is present when a user has set a reminder for this message.
315317
final MessageReminder? reminder;
316318

319+
static Object? _channelRoleReadValue(Map<Object?, Object?> json, String key) {
320+
// Extract the channel role from the member object if present.
321+
final member = json['member'];
322+
if (member is! Map<String, Object?>) return null;
323+
324+
final channelRole = member[key].safeCast<String>();
325+
return channelRole;
326+
}
327+
328+
/// The role of the user in the channel the message belongs to.
329+
@JsonKey(includeToJson: false, readValue: _channelRoleReadValue)
330+
final String? channelRole;
331+
317332
/// Message custom extraData.
318333
final Map<String, Object?> extraData;
319334

@@ -362,6 +377,7 @@ class Message extends Equatable implements ComparableFieldProvider {
362377
'moderation_details',
363378
'draft',
364379
'reminder',
380+
'member',
365381
];
366382

367383
/// Serialize to json.
@@ -424,6 +440,7 @@ class Message extends Equatable implements ComparableFieldProvider {
424440
Moderation? moderation,
425441
Object? draft = _nullConst,
426442
Object? reminder = _nullConst,
443+
String? channelRole,
427444
}) {
428445
assert(() {
429446
if (pinExpires is! DateTime &&
@@ -506,6 +523,7 @@ class Message extends Equatable implements ComparableFieldProvider {
506523
draft: draft == _nullConst ? this.draft : draft as Draft?,
507524
reminder:
508525
reminder == _nullConst ? this.reminder : reminder as MessageReminder?,
526+
channelRole: channelRole ?? this.channelRole,
509527
);
510528
}
511529

@@ -551,6 +569,7 @@ class Message extends Equatable implements ComparableFieldProvider {
551569
moderation: other.moderation,
552570
draft: other.draft,
553571
reminder: other.reminder,
572+
channelRole: other.channelRole,
554573
);
555574
}
556575

@@ -616,6 +635,7 @@ class Message extends Equatable implements ComparableFieldProvider {
616635
moderation,
617636
draft,
618637
reminder,
638+
channelRole,
619639
];
620640

621641
@override

0 commit comments

Comments
 (0)