1
1
import 'dart:math' ;
2
2
3
3
import 'package:collection/collection.dart' ;
4
+ import 'package:flutter/foundation.dart' ;
4
5
// ignore: undefined_hidden_name // anticipates https://github.com/flutter/flutter/pull/164818
5
6
import 'package:flutter/material.dart' hide SliverPaintOrder;
6
7
import 'package:flutter_color_models/flutter_color_models.dart' ;
@@ -901,23 +902,29 @@ class _MarkAsReadAnimationState extends State<MarkAsReadAnimation> {
901
902
class RecipientHeader extends StatelessWidget {
902
903
const RecipientHeader ({super .key, required this .message, required this .narrow});
903
904
904
- final Message message;
905
+ final MessageBase message;
905
906
final Narrow narrow;
906
907
907
908
@override
908
909
Widget build (BuildContext context) {
909
910
final message = this .message;
910
- return switch (message) {
911
- StreamMessage () => StreamMessageRecipientHeader (message: message, narrow: narrow),
912
- DmMessage () => DmRecipientHeader (message: message, narrow: narrow),
913
- };
911
+ switch (message) {
912
+ case MessageBase <StreamConversation >():
913
+ return StreamMessageRecipientHeader (message: message, narrow: narrow);
914
+ case MessageBase <DmConversation >():
915
+ return DmRecipientHeader (message: message, narrow: narrow);
916
+ case MessageBase <Conversation >():
917
+ assert (false , 'Unexpected concrete subclass of MessageBase<Conversation>:'
918
+ ' ${objectRuntimeType (message , 'MessageBase<Conversation>' )}' );
919
+ return SizedBox .shrink ();
920
+ }
914
921
}
915
922
}
916
923
917
924
class DateSeparator extends StatelessWidget {
918
925
const DateSeparator ({super .key, required this .message});
919
926
920
- final Message message;
927
+ final MessageBase message;
921
928
922
929
@override
923
930
Widget build (BuildContext context) {
@@ -1027,7 +1034,7 @@ class StreamMessageRecipientHeader extends StatelessWidget {
1027
1034
required this .narrow,
1028
1035
});
1029
1036
1030
- final StreamMessage message;
1037
+ final MessageBase < StreamConversation > message;
1031
1038
final Narrow narrow;
1032
1039
1033
1040
static bool _containsDifferentChannels (Narrow narrow) {
@@ -1053,11 +1060,11 @@ class StreamMessageRecipientHeader extends StatelessWidget {
1053
1060
final designVariables = DesignVariables .of (context);
1054
1061
final zulipLocalizations = ZulipLocalizations .of (context);
1055
1062
1056
- final topic = message.topic ;
1063
+ final StreamConversation ( : streamId, : topic) = message.conversation ;
1057
1064
1058
1065
final messageListTheme = MessageListTheme .of (context);
1059
1066
1060
- final subscription = store.subscriptions[message. streamId];
1067
+ final subscription = store.subscriptions[streamId];
1061
1068
final Color backgroundColor;
1062
1069
final Color iconColor;
1063
1070
if (subscription != null ) {
@@ -1073,16 +1080,17 @@ class StreamMessageRecipientHeader extends StatelessWidget {
1073
1080
if (! _containsDifferentChannels (narrow)) {
1074
1081
streamWidget = const SizedBox (width: 16 );
1075
1082
} else {
1076
- final stream = store.streams[message.streamId];
1083
+ final stream = store.streams[streamId];
1084
+ final message = this .message;
1077
1085
final streamName = stream? .name
1078
- ?? message.displayRecipient
1086
+ ?? ( message is StreamMessage ? message .displayRecipient : null )
1079
1087
?? zulipLocalizations.unknownChannelName; // TODO(log)
1080
1088
1081
1089
streamWidget = GestureDetector (
1082
1090
onTap: () => Navigator .push (context,
1083
1091
MessageListPage .buildRoute (context: context,
1084
- narrow: ChannelNarrow (message. streamId))),
1085
- onLongPress: () => showChannelActionSheet (context, channelId: message. streamId),
1092
+ narrow: ChannelNarrow (streamId))),
1093
+ onLongPress: () => showChannelActionSheet (context, channelId: streamId),
1086
1094
child: Row (
1087
1095
crossAxisAlignment: CrossAxisAlignment .center,
1088
1096
children: [
@@ -1130,7 +1138,7 @@ class StreamMessageRecipientHeader extends StatelessWidget {
1130
1138
Icon (size: 14 , color: designVariables.title.withFadedAlpha (0.5 ),
1131
1139
// A null [Icon.icon] makes a blank space.
1132
1140
iconDataForTopicVisibilityPolicy (
1133
- store.topicVisibilityPolicy (message. streamId, topic))),
1141
+ store.topicVisibilityPolicy (streamId, topic))),
1134
1142
]));
1135
1143
1136
1144
return GestureDetector (
@@ -1143,7 +1151,7 @@ class StreamMessageRecipientHeader extends StatelessWidget {
1143
1151
MessageListPage .buildRoute (context: context,
1144
1152
narrow: TopicNarrow .ofMessage (message))),
1145
1153
onLongPress: () => showTopicActionSheet (context,
1146
- channelId: message. streamId,
1154
+ channelId: streamId,
1147
1155
topic: topic,
1148
1156
someMessageIdInTopic: message.id),
1149
1157
child: ColoredBox (
@@ -1168,20 +1176,21 @@ class DmRecipientHeader extends StatelessWidget {
1168
1176
required this .narrow,
1169
1177
});
1170
1178
1171
- final DmMessage message;
1179
+ final MessageBase < DmConversation > message;
1172
1180
final Narrow narrow;
1173
1181
1174
1182
@override
1175
1183
Widget build (BuildContext context) {
1176
1184
final zulipLocalizations = ZulipLocalizations .of (context);
1177
1185
final store = PerAccountStoreWidget .of (context);
1178
1186
final String title;
1179
- if (message.allRecipientIds.length > 1 ) {
1180
- title = zulipLocalizations.messageListGroupYouAndOthers (message.allRecipientIds
1181
- .where ((id) => id != store.selfUserId)
1182
- .map (store.userDisplayName)
1183
- .sorted ()
1184
- .join (", " ));
1187
+ if (message.conversation.allRecipientIds.length > 1 ) {
1188
+ title = zulipLocalizations.messageListGroupYouAndOthers (
1189
+ message.conversation.allRecipientIds
1190
+ .where ((id) => id != store.selfUserId)
1191
+ .map (store.userDisplayName)
1192
+ .sorted ()
1193
+ .join (", " ));
1185
1194
} else {
1186
1195
title = zulipLocalizations.messageListGroupYouWithYourself;
1187
1196
}
@@ -1233,7 +1242,7 @@ TextStyle recipientHeaderTextStyle(BuildContext context, {FontStyle? fontStyle})
1233
1242
class RecipientHeaderDate extends StatelessWidget {
1234
1243
const RecipientHeaderDate ({super .key, required this .message});
1235
1244
1236
- final Message message;
1245
+ final MessageBase message;
1237
1246
1238
1247
@override
1239
1248
Widget build (BuildContext context) {
0 commit comments