Skip to content

Commit 0e57471

Browse files
committed
msglist: Show user status emoji
1 parent f313a9c commit 0e57471

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed

lib/widgets/message_list.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1943,6 +1943,8 @@ class SenderRow extends StatelessWidget {
19431943
: designVariables.title,
19441944
).merge(weightVariableTextStyle(context, wght: 600)),
19451945
overflow: TextOverflow.ellipsis)),
1946+
UserStatusEmoji(userId: message.senderId, size: 18,
1947+
padding: const EdgeInsetsDirectional.only(start: 5.0)),
19461948
if (sender?.isBot ?? false) ...[
19471949
const SizedBox(width: 5),
19481950
Icon(

test/widgets/message_list_test.dart

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import 'package:zulip/api/model/model.dart';
1414
import 'package:zulip/api/model/narrow.dart';
1515
import 'package:zulip/api/route/channels.dart';
1616
import 'package:zulip/api/route/messages.dart';
17+
import 'package:zulip/basic.dart';
1718
import 'package:zulip/model/actions.dart';
1819
import 'package:zulip/model/localizations.dart';
1920
import 'package:zulip/model/message.dart';
@@ -1758,6 +1759,79 @@ void main() {
17581759
debugNetworkImageHttpClientProvider = null;
17591760
});
17601761

1762+
group('User status', () {
1763+
void checkFindsStatusEmoji(WidgetTester tester, Finder emojiFinder) {
1764+
final statusEmojiFinder = find.ancestor(of: emojiFinder,
1765+
matching: find.byType(UserStatusEmoji));
1766+
check(statusEmojiFinder).findsOne();
1767+
check(tester.firstWidget<UserStatusEmoji>(statusEmojiFinder)
1768+
.neverAnimate).isTrue();
1769+
1770+
final senderRowFinder = find.ancestor(of: statusEmojiFinder,
1771+
matching: find.byType(SenderRow));
1772+
check(senderRowFinder).findsOne();
1773+
}
1774+
1775+
testWidgets('emoji (unicode) & text are set -> emoji is displayed, text is not', (tester) async {
1776+
final user = eg.user();
1777+
await setupMessageListPage(tester,
1778+
users: [user], messages: [eg.streamMessage(sender: user)]);
1779+
await store.changeUserStatus(user.userId, UserStatusChange(
1780+
text: OptionSome('Busy'),
1781+
emoji: OptionSome(StatusEmoji(emojiName: 'working_on_it',
1782+
emojiCode: '1f6e0', reactionType: ReactionType.unicodeEmoji))));
1783+
await tester.pump();
1784+
1785+
checkFindsStatusEmoji(tester, find.text('\u{1f6e0}'));
1786+
check(find.descendant(of: find.byType(SenderRow),
1787+
matching: find.text('Busy'))).findsNothing();
1788+
});
1789+
1790+
testWidgets('emoji (image) & text are set -> emoji is displayed, text is not', (tester) async {
1791+
prepareBoringImageHttpClient();
1792+
1793+
final user = eg.user();
1794+
await setupMessageListPage(tester,
1795+
users: [user], messages: [eg.streamMessage(sender: user)]);
1796+
await store.changeUserStatus(user.userId, UserStatusChange(
1797+
text: OptionSome('Coding'),
1798+
emoji: OptionSome(StatusEmoji(emojiName: 'zulip',
1799+
emojiCode: 'zulip', reactionType: ReactionType.zulipExtraEmoji))));
1800+
await tester.pumpAndSettle();
1801+
1802+
checkFindsStatusEmoji(tester, find.byType(Image));
1803+
check(find.descendant(of: find.byType(SenderRow),
1804+
matching: find.text('Coding'))).findsNothing();
1805+
1806+
debugNetworkImageHttpClientProvider = null;
1807+
});
1808+
1809+
testWidgets('longer user name -> emoji stays visible', (tester) async {
1810+
final user = eg.user(fullName: 'User with a very very very long name to check if emoji is still visible');
1811+
await setupMessageListPage(tester,
1812+
users: [user], messages: [eg.streamMessage(sender: user)]);
1813+
await store.changeUserStatus(user.userId, UserStatusChange(
1814+
text: OptionNone(),
1815+
emoji: OptionSome(StatusEmoji(emojiName: 'working_on_it',
1816+
emojiCode: '1f6e0', reactionType: ReactionType.unicodeEmoji))));
1817+
await tester.pump();
1818+
1819+
checkFindsStatusEmoji(tester, find.text('\u{1f6e0}'));
1820+
});
1821+
1822+
testWidgets('emoji is not set, text is set -> text is not displayed', (tester) async {
1823+
final user = eg.user();
1824+
await setupMessageListPage(tester,
1825+
users: [user], messages: [eg.streamMessage(sender: user)]);
1826+
await store.changeUserStatus(user.userId, UserStatusChange(
1827+
text: OptionSome('Busy'), emoji: OptionNone()));
1828+
await tester.pump();
1829+
1830+
check(find.descendant(of: find.byType(SenderRow),
1831+
matching: find.text('Busy'))).findsNothing();
1832+
});
1833+
});
1834+
17611835
group('Muted sender', () {
17621836
void checkMessage(Message message, {required bool expectIsMuted}) {
17631837
final mutedLabel = 'Muted user';

0 commit comments

Comments
 (0)