Skip to content

Commit d44c6a8

Browse files
committed
msglist: Add stream icon to recipient headers
Fixes: zulip#220
1 parent c012b7a commit d44c6a8

File tree

2 files changed

+51
-2
lines changed

2 files changed

+51
-2
lines changed

lib/widgets/message_list.dart

+6-2
Original file line numberDiff line numberDiff line change
@@ -568,8 +568,12 @@ class StreamMessageRecipientHeader extends StatelessWidget {
568568
MessageListPage.buildRoute(context: context,
569569
narrow: StreamNarrow(message.streamId))),
570570
child: Row(children: [
571-
const SizedBox(width: 16),
572-
// TODO globe/lock icons for web-public and private streams
571+
Padding(
572+
// Figma shows 5px spacing but 6px here matches better visually.
573+
padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 11),
574+
child: Icon(size: 18, color: swatch.iconOnBarBackground,
575+
// A null [Icon.icon] makes a blank space.
576+
(stream != null) ? iconDataForStream(stream) : null)),
573577
Padding(
574578
padding: const EdgeInsets.symmetric(vertical: 11),
575579
child: Text(stream?.name ?? message.displayRecipient, // TODO(log) if missing

test/widgets/message_list_test.dart

+45
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import 'package:zulip/model/localizations.dart';
1414
import 'package:zulip/model/narrow.dart';
1515
import 'package:zulip/model/store.dart';
1616
import 'package:zulip/widgets/content.dart';
17+
import 'package:zulip/widgets/icons.dart';
1718
import 'package:zulip/widgets/message_list.dart';
1819
import 'package:zulip/widgets/sticky_header.dart';
1920
import 'package:zulip/widgets/store.dart';
@@ -247,6 +248,50 @@ void main() {
247248
matching: find.byType(ColoredBox),
248249
))).color.equals(swatch.barBackground);
249250
});
251+
252+
testWidgets('color of stream icon', (tester) async {
253+
final stream = eg.stream(isWebPublic: true);
254+
final subscription = eg.subscription(stream, color: Colors.red.value);
255+
final swatch = subscription.colorSwatch();
256+
await setupMessageListPage(tester,
257+
messages: [message], subscriptions: [subscription]);
258+
await tester.pump();
259+
check(tester.widget<Icon>(find.byIcon(ZulipIcons.globe)))
260+
.color.equals(swatch.iconOnBarBackground);
261+
});
262+
263+
testWidgets('normal streams show hash icon', (tester) async {
264+
final stream = eg.stream(isWebPublic: false, inviteOnly: false);
265+
await setupMessageListPage(tester,
266+
messages: [message], streams: [stream]);
267+
await tester.pump();
268+
check(find.descendant(
269+
of: find.byType(StreamMessageRecipientHeader),
270+
matching: find.byIcon(ZulipIcons.hash_sign),
271+
).evaluate()).length.equals(1);
272+
});
273+
274+
testWidgets('public streams show globe icon', (tester) async {
275+
final stream = eg.stream(isWebPublic: true);
276+
await setupMessageListPage(tester,
277+
messages: [message], streams: [stream]);
278+
await tester.pump();
279+
check(find.descendant(
280+
of: find.byType(StreamMessageRecipientHeader),
281+
matching: find.byIcon(ZulipIcons.globe),
282+
).evaluate()).length.equals(1);
283+
});
284+
285+
testWidgets('private streams show lock icon', (tester) async {
286+
final stream = eg.stream(inviteOnly: true);
287+
await setupMessageListPage(tester,
288+
messages: [message], streams: [stream]);
289+
await tester.pump();
290+
check(find.descendant(
291+
of: find.byType(StreamMessageRecipientHeader),
292+
matching: find.byIcon(ZulipIcons.lock),
293+
).evaluate()).length.equals(1);
294+
});
250295
});
251296

252297
testWidgets('show stream name from message when stream unknown', (tester) async {

0 commit comments

Comments
 (0)