Skip to content

Commit b8a3dce

Browse files
committed
msglist: Show user status emoji
1 parent ae2ff96 commit b8a3dce

File tree

2 files changed

+102
-0
lines changed

2 files changed

+102
-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: 100 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';
@@ -26,6 +27,7 @@ import 'package:zulip/widgets/autocomplete.dart';
2627
import 'package:zulip/widgets/color.dart';
2728
import 'package:zulip/widgets/compose_box.dart';
2829
import 'package:zulip/widgets/content.dart';
30+
import 'package:zulip/widgets/emoji.dart';
2931
import 'package:zulip/widgets/icons.dart';
3032
import 'package:zulip/widgets/message_list.dart';
3133
import 'package:zulip/widgets/page.dart';
@@ -1755,6 +1757,104 @@ void main() {
17551757
debugNetworkImageHttpClientProvider = null;
17561758
});
17571759

1760+
group('User status', () {
1761+
void checkStatusEmoji(WidgetTester tester,
1762+
{required Type type, required bool isPresent}) {
1763+
final statusEmojiFinder = find.ancestor(of: find.byType(type),
1764+
matching: find.byType(UserStatusEmoji));
1765+
if (isPresent) {
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+
} else {
1774+
check(statusEmojiFinder).findsNothing();
1775+
}
1776+
}
1777+
1778+
testWidgets('status emoji (unicode) & text are set -> emoji is displayed, text is not', (tester) async {
1779+
final user = eg.user();
1780+
await setupMessageListPage(tester,
1781+
users: [user],
1782+
messages: [eg.streamMessage(sender: user)],
1783+
);
1784+
await store.changeUserStatuses({
1785+
user.userId: UserStatusChange(
1786+
text: OptionSome('Busy'),
1787+
emoji: OptionSome(StatusEmoji(emojiName: 'working_on_it',
1788+
emojiCode: '1f6e0', reactionType: ReactionType.unicodeEmoji))),
1789+
});
1790+
await tester.pump();
1791+
1792+
checkStatusEmoji(tester, type: UnicodeEmojiWidget, isPresent: true);
1793+
check(find.text('Busy')).findsNothing();
1794+
});
1795+
1796+
testWidgets('status emoji (image) & text are set -> emoji is displayed, text is not', (tester) async {
1797+
final user = eg.user();
1798+
await setupMessageListPage(tester,
1799+
users: [user],
1800+
messages: [eg.streamMessage(sender: user)],
1801+
);
1802+
await store.changeUserStatuses({
1803+
user.userId: UserStatusChange(
1804+
text: OptionSome('Coding'),
1805+
emoji: OptionSome(StatusEmoji(emojiName: 'zulip',
1806+
emojiCode: 'zulip', reactionType: ReactionType.zulipExtraEmoji))),
1807+
});
1808+
await tester.pump();
1809+
1810+
checkStatusEmoji(tester, type: ImageEmojiWidget, isPresent: true);
1811+
check(find.text('Coding')).findsNothing();
1812+
});
1813+
1814+
testWidgets('longer user name -> emoji stays visible', (tester) async {
1815+
final user = eg.user(fullName: 'User with a very very very long name to check if emoji is still visible');
1816+
await setupMessageListPage(tester,
1817+
users: [user],
1818+
messages: [eg.streamMessage(sender: user)],
1819+
);
1820+
await store.changeUserStatuses({
1821+
user.userId: UserStatusChange(
1822+
text: OptionNone(),
1823+
emoji: OptionSome(StatusEmoji(emojiName: 'working_on_it',
1824+
emojiCode: '1f6e0', reactionType: ReactionType.unicodeEmoji))),
1825+
});
1826+
await tester.pump();
1827+
1828+
checkStatusEmoji(tester, type: UnicodeEmojiWidget, isPresent: true);
1829+
});
1830+
1831+
testWidgets('status emoji is not set, text is set -> none of them is displayed', (tester) async {
1832+
final user = eg.user();
1833+
await setupMessageListPage(tester,
1834+
users: [user],
1835+
messages: [eg.streamMessage(sender: user)],
1836+
);
1837+
await store.changeUserStatuses({
1838+
user.userId: UserStatusChange(
1839+
text: OptionSome('Busy'),
1840+
emoji: OptionNone()),
1841+
});
1842+
await tester.pump();
1843+
1844+
checkStatusEmoji(tester, type: UnicodeEmojiWidget, isPresent: false);
1845+
check(find.text('Busy')).findsNothing();
1846+
});
1847+
1848+
testWidgets('status is not set -> emoji is not displayed', (tester) async {
1849+
final user = eg.user();
1850+
await setupMessageListPage(tester,
1851+
users: [user],
1852+
messages: [eg.streamMessage(sender: user)],
1853+
);
1854+
checkStatusEmoji(tester, type: UnicodeEmojiWidget, isPresent: false);
1855+
});
1856+
});
1857+
17581858
group('Muted sender', () {
17591859
void checkMessage(Message message, {required bool expectIsMuted}) {
17601860
final mutedLabel = 'Muted user';

0 commit comments

Comments
 (0)