@@ -341,12 +341,14 @@ class _MessageListState extends State<MessageList> with PerAccountStoreAwareStat
341
341
padding: EdgeInsets .symmetric (vertical: 16.0 ),
342
342
child: CircularProgressIndicator ())); // TODO perhaps a different indicator
343
343
case MessageListRecipientHeaderItem ():
344
- final header = RecipientHeader (message: data.message);
344
+ final header = RecipientHeader (message: data.message, narrow : widget.narrow );
345
345
return StickyHeaderItem (allowOverflow: true ,
346
346
header: header, child: header);
347
347
case MessageListMessageItem ():
348
+ final header = RecipientHeader (message: data.message, narrow: widget.narrow);
348
349
return MessageItem (
349
350
key: ValueKey (data.message.id),
351
+ header: header,
350
352
trailingWhitespace: i == 1 ? 8 : 11 ,
351
353
item: data);
352
354
}
@@ -445,16 +447,17 @@ class MarkAsReadWidget extends StatelessWidget {
445
447
}
446
448
447
449
class RecipientHeader extends StatelessWidget {
448
- const RecipientHeader ({super .key, required this .message});
450
+ const RecipientHeader ({super .key, required this .message, required this .narrow });
449
451
450
452
final Message message;
453
+ final Narrow narrow;
451
454
452
455
@override
453
456
Widget build (BuildContext context) {
454
- // TODO recipient headings depend on narrow
455
457
final message = this .message;
456
458
return switch (message) {
457
- StreamMessage () => StreamTopicRecipientHeader (message: message),
459
+ StreamMessage () => StreamMessageRecipientHeader (message: message,
460
+ showStream: narrow is AllMessagesNarrow ),
458
461
DmMessage () => DmRecipientHeader (message: message),
459
462
};
460
463
}
@@ -464,18 +467,20 @@ class MessageItem extends StatelessWidget {
464
467
const MessageItem ({
465
468
super .key,
466
469
required this .item,
470
+ required this .header,
467
471
this .trailingWhitespace,
468
472
});
469
473
470
474
final MessageListMessageItem item;
475
+ final Widget header;
471
476
final double ? trailingWhitespace;
472
477
473
478
@override
474
479
Widget build (BuildContext context) {
475
480
final message = item.message;
476
481
return StickyHeaderItem (
477
482
allowOverflow: ! item.isLastInBlock,
478
- header: RecipientHeader (message : message) ,
483
+ header: header ,
479
484
child: _UnreadMarker (
480
485
isRead: message.flags.contains (MessageFlag .read),
481
486
child: ColoredBox (
@@ -528,17 +533,23 @@ class _UnreadMarker extends StatelessWidget {
528
533
}
529
534
}
530
535
531
- class StreamTopicRecipientHeader extends StatelessWidget {
532
- const StreamTopicRecipientHeader ({super .key, required this .message});
536
+ class StreamMessageRecipientHeader extends StatelessWidget {
537
+ const StreamMessageRecipientHeader ({
538
+ super .key,
539
+ required this .message,
540
+ required this .showStream,
541
+ });
533
542
534
543
final StreamMessage message;
544
+ final bool showStream;
535
545
536
546
@override
537
547
Widget build (BuildContext context) {
548
+ // For design specs, see:
549
+ // https://www.figma.com/file/1JTNtYo9memgW7vV6d0ygq/Zulip-Mobile?node-id=538%3A20849&mode=dev
550
+ // https://github.com/zulip/zulip-mobile/issues/5511
538
551
final store = PerAccountStoreWidget .of (context);
539
552
540
- final stream = store.streams[message.streamId];
541
- final streamName = stream? .name ?? message.displayRecipient; // TODO(log) if missing
542
553
final topic = message.subject;
543
554
544
555
final subscription = store.subscriptions[message.streamId];
@@ -548,6 +559,24 @@ class StreamTopicRecipientHeader extends StatelessWidget {
548
559
? Colors .white
549
560
: Colors .black;
550
561
562
+ final Widget streamWidget;
563
+ if (! showStream) {
564
+ streamWidget = const SizedBox .shrink ();
565
+ } else {
566
+ final stream = store.streams[message.streamId];
567
+ final streamName = stream? .name ?? message.displayRecipient; // TODO(log) if missing
568
+
569
+ streamWidget = GestureDetector (
570
+ onTap: () => Navigator .push (context,
571
+ MessageListPage .buildRoute (context: context,
572
+ narrow: StreamNarrow (message.streamId))),
573
+ child: RecipientHeaderChevronContainer (
574
+ color: streamColor,
575
+ // TODO globe/lock icons for web-public and private streams
576
+ child: Text (streamName,
577
+ style: TextStyle (color: contrastingColor))));
578
+ }
579
+
551
580
return GestureDetector (
552
581
onTap: () => Navigator .push (context,
553
582
MessageListPage .buildRoute (context: context,
@@ -556,14 +585,7 @@ class StreamTopicRecipientHeader extends StatelessWidget {
556
585
color: _kStreamMessageBorderColor,
557
586
child: Row (mainAxisAlignment: MainAxisAlignment .start, children: [
558
587
// TODO(#282): Long stream name will break layout; find a fix.
559
- GestureDetector (
560
- onTap: () => Navigator .push (context,
561
- MessageListPage .buildRoute (context: context,
562
- narrow: StreamNarrow (message.streamId))),
563
- child: RecipientHeaderChevronContainer (
564
- color: streamColor,
565
- // TODO globe/lock icons for web-public and private streams
566
- child: Text (streamName, style: TextStyle (color: contrastingColor)))),
588
+ streamWidget,
567
589
Expanded (
568
590
child: Padding (
569
591
// Web has padding 9, 3, 3, 2 here; but 5px is the chevron.
0 commit comments