@@ -7,6 +7,7 @@ import 'package:flutter_color_models/flutter_color_models.dart';
7
7
import 'package:intl/intl.dart' hide TextDirection;
8
8
9
9
import '../api/model/model.dart' ;
10
+ import '../api/route/messages.dart' ;
10
11
import '../generated/l10n/zulip_localizations.dart' ;
11
12
import '../model/message_list.dart' ;
12
13
import '../model/narrow.dart' ;
@@ -901,23 +902,28 @@ 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 DisplayableMessage 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 DisplayableMessage <StreamDestination >():
913
+ return StreamMessageRecipientHeader (message: message, narrow: narrow);
914
+ case DisplayableMessage <DmDestination >():
915
+ return DmRecipientHeader (message: message, narrow: narrow);
916
+ case DisplayableMessage <MessageDestination >():
917
+ assert (false , 'Unexpected concrete subclass of DisplayableMessage<MessageDestination>' );
918
+ return SizedBox .shrink ();
919
+ }
914
920
}
915
921
}
916
922
917
923
class DateSeparator extends StatelessWidget {
918
924
const DateSeparator ({super .key, required this .message});
919
925
920
- final Message message;
926
+ final DisplayableMessage message;
921
927
922
928
@override
923
929
Widget build (BuildContext context) {
@@ -1027,7 +1033,7 @@ class StreamMessageRecipientHeader extends StatelessWidget {
1027
1033
required this .narrow,
1028
1034
});
1029
1035
1030
- final StreamMessage message;
1036
+ final DisplayableMessage < StreamDestination > message;
1031
1037
final Narrow narrow;
1032
1038
1033
1039
static bool _containsDifferentChannels (Narrow narrow) {
@@ -1053,11 +1059,11 @@ class StreamMessageRecipientHeader extends StatelessWidget {
1053
1059
final designVariables = DesignVariables .of (context);
1054
1060
final zulipLocalizations = ZulipLocalizations .of (context);
1055
1061
1056
- final topic = message.topic ;
1062
+ final StreamDestination ( : streamId, : topic) = message.destination ;
1057
1063
1058
1064
final messageListTheme = MessageListTheme .of (context);
1059
1065
1060
- final subscription = store.subscriptions[message. streamId];
1066
+ final subscription = store.subscriptions[streamId];
1061
1067
final Color backgroundColor;
1062
1068
final Color iconColor;
1063
1069
if (subscription != null ) {
@@ -1073,16 +1079,17 @@ class StreamMessageRecipientHeader extends StatelessWidget {
1073
1079
if (! _containsDifferentChannels (narrow)) {
1074
1080
streamWidget = const SizedBox (width: 16 );
1075
1081
} else {
1076
- final stream = store.streams[message.streamId];
1082
+ final stream = store.streams[streamId];
1083
+ final message = this .message;
1077
1084
final streamName = stream? .name
1078
- ?? message.displayRecipient
1085
+ ?? ( message is StreamMessage ? message .displayRecipient : null )
1079
1086
?? zulipLocalizations.unknownChannelName; // TODO(log)
1080
1087
1081
1088
streamWidget = GestureDetector (
1082
1089
onTap: () => Navigator .push (context,
1083
1090
MessageListPage .buildRoute (context: context,
1084
- narrow: ChannelNarrow (message. streamId))),
1085
- onLongPress: () => showChannelActionSheet (context, channelId: message. streamId),
1091
+ narrow: ChannelNarrow (streamId))),
1092
+ onLongPress: () => showChannelActionSheet (context, channelId: streamId),
1086
1093
child: Row (
1087
1094
crossAxisAlignment: CrossAxisAlignment .center,
1088
1095
children: [
@@ -1130,7 +1137,7 @@ class StreamMessageRecipientHeader extends StatelessWidget {
1130
1137
Icon (size: 14 , color: designVariables.title.withFadedAlpha (0.5 ),
1131
1138
// A null [Icon.icon] makes a blank space.
1132
1139
iconDataForTopicVisibilityPolicy (
1133
- store.topicVisibilityPolicy (message. streamId, topic))),
1140
+ store.topicVisibilityPolicy (streamId, topic))),
1134
1141
]));
1135
1142
1136
1143
return GestureDetector (
@@ -1141,9 +1148,9 @@ class StreamMessageRecipientHeader extends StatelessWidget {
1141
1148
onTap: narrow is TopicNarrow ? null
1142
1149
: () => Navigator .push (context,
1143
1150
MessageListPage .buildRoute (context: context,
1144
- narrow: TopicNarrow . ofMessage (message ))),
1151
+ narrow: TopicNarrow (streamId, topic ))),
1145
1152
onLongPress: () => showTopicActionSheet (context,
1146
- channelId: message. streamId,
1153
+ channelId: streamId,
1147
1154
topic: topic,
1148
1155
someMessageIdInTopic: message.id),
1149
1156
child: ColoredBox (
@@ -1168,16 +1175,17 @@ class DmRecipientHeader extends StatelessWidget {
1168
1175
required this .narrow,
1169
1176
});
1170
1177
1171
- final DmMessage message;
1178
+ final DisplayableMessage < DmDestination > message;
1172
1179
final Narrow narrow;
1173
1180
1174
1181
@override
1175
1182
Widget build (BuildContext context) {
1176
1183
final zulipLocalizations = ZulipLocalizations .of (context);
1177
1184
final store = PerAccountStoreWidget .of (context);
1178
1185
final String title;
1179
- if (message.allRecipientIds.length > 1 ) {
1180
- title = zulipLocalizations.messageListGroupYouAndOthers (message.allRecipientIds
1186
+ final allRecipientIds = message.destination.userIds;
1187
+ if (allRecipientIds.length > 1 ) {
1188
+ title = zulipLocalizations.messageListGroupYouAndOthers (allRecipientIds
1181
1189
.where ((id) => id != store.selfUserId)
1182
1190
.map (store.userDisplayName)
1183
1191
.sorted ()
@@ -1197,7 +1205,8 @@ class DmRecipientHeader extends StatelessWidget {
1197
1205
onTap: narrow is DmNarrow ? null
1198
1206
: () => Navigator .push (context,
1199
1207
MessageListPage .buildRoute (context: context,
1200
- narrow: DmNarrow .ofMessage (message, selfUserId: store.selfUserId))),
1208
+ narrow: DmNarrow .withUsers (
1209
+ allRecipientIds, selfUserId: store.selfUserId))),
1201
1210
child: ColoredBox (
1202
1211
color: messageListTheme.dmRecipientHeaderBg,
1203
1212
child: Padding (
@@ -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 DisplayableMessage message;
1237
1246
1238
1247
@override
1239
1248
Widget build (BuildContext context) {
0 commit comments